ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhZWVmMAotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmFnZ3JlZ2F0b3I8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5zb25hcmxpbnQuZWNsaXBzZS5jb3JlLnNvbmFybGludEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYWJvdXQuaHRtbCBiL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMSwgMjAxNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qZW5raW5zLmJ1aWxkLmNvbmZpZy54bWwgYi9qZW5raW5zLmJ1aWxkLmNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4NDQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2plbmtpbnMuYnVpbGQuY29uZmlnLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCQkgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgTW9kdWxlIHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHRoZSBKZW5raW5zIEpvYiAJCQkJCQkgLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8amVua2lucz4KKwk8IS0tIERPIE5PVCBFRElUIEJFTE9XIFRISVMgTElORSAtLT4KKyAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5hdXRoZW50aWNhdGlvbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5kc2w8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAuZWN2aWV3LmFkZG9uczwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuY29yZTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlcjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5vc2dpLmh5YnJpZC5hcGk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAucHJlZmVyZW5jZXM8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAucnVudGltZTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLndlYjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC51aS5hcGk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAudXRpbHM8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAudXRpbHMudGhlbWVzLnVpPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnVpPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnZhYWNsaXBzZTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC53ZWJzZXJ2ZXIubWVzc2FnZXF1ZXVlPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hZGRvbnM8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0PC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLmNvbW1vbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICA8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jaWVzPgorPC9qZW5raW5zPgpkaWZmIC0tZ2l0IGEvbm90aWNlLmh0bWwgYi9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QzNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbm90aWNlLmh0bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5BcHJpbCA5LCAyMDE0PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisgICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmVjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODkyMGZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAorYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLXYxMC5odG1sLCAgZmVhdHVyZS54bWwsXAorICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNTUwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTY5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBDcmlzdGlhbm8gR2F2aeNvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZlYXR1cmUucHJvcGVydGllcworIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWUgPU9TQlAgRFNMOiBSZXBvcnQgCisKKyMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlIE9TQlAKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPVRoaXMgZmVhdHVyZSBwcm92aWRlcyB0aGUgYnVuZGxlcyBmb3IgdGhlIE9TQlAgUmVwb3J0RFNMLgorCisjICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCit1cGRhdGVTaXRlTmFtZT0KKworIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCitjb3B5cmlnaHQ9XAorQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCisjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAorRmVicnVhcnkgMSwgMjAxMVxuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCitPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorXG5cCitBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCitcblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKK0VjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCit0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAorcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitcblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCityZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKKyAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKKyAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCisgICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCisgICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCisgICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKKyAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCisgICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKKyAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKyAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAorICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKyAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCisgICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCisgICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKK1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKK1VwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKK0luY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoreW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAordGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAorZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKyAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitcblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1xuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAorYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKK3RoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAorb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCit0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKK0luZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCitcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKK1lvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK2luIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKK21ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitcblwKKyAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCisgICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCisgICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKyAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCisgICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCisgICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKKyAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCisgICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCisgICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAorICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAorICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKKyAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitcblwKK0NyeXB0b2dyYXBoeVxuXAorXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKK2N1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKK2FuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKK3VzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKK3JlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitcblwKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZWUxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjAuOS4wLnF1YWxpZmllciIKKyAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQ+CisgICAgICAlY29weXJpZ2h0CisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICAlbGljZW5zZQorICAgPC9saWNlbnNlPgorCisgICA8aW5jbHVkZXMKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5iaXJ0IgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNzE0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpLiAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5hZ2dyZWdhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lY2xpcHNlLWZlYXR1cmU8L3BhY2thZ2luZz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnR5Y2hvLmV4dHJhczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50eWNoby1zb3VyY2UtZmVhdHVyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0eWNob0V4dHJhc1ZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNvdXJjZS1mZWF0dXJlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zb3VyY2UtZmVhdHVyZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsU3VmZml4PiAoc291cmNlKTwvbGFiZWxTdWZmaXg+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDwhLS0gd29ya2Fyb3VuZCB3aGlsZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM5ODI1MCAKKwkJCQkJaXMgbm90IGZpeGVkIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnR5Y2hvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnR5Y2hvLXAyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3R5Y2hvLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaGVkLXAyLW1ldGFkYXRhPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wMi1tZXRhZGF0YTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCQkJPHBsdWdpbj4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5qYXZhZG9jLWphcjwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+amFyPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3NyYy9tYWluL2phdmFkb2MvUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvc3JjL21haW4vamF2YWRvYy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWRhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3NyYy9tYWluL2phdmFkb2MvUkVBRE1FLnR4dApAQCAtMCwwICsxIEBACitSZXNvdXJjZSBmb2xkZXIgZm9yIGphdmFkb2MgcmVzb3VyY2VzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZlYXR1cmUvc3JjL292ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3NyYy9vdmVydmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYWJjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlL3NyYy9vdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorCTx0aXRsZT5PU0JQIFRvb2xzIEdyYXBoaWNhbCBFbnRpdHk8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5UaGUgPHN0cm9uZz5PU0JQJm5ic3A7WHRleHQmbmJzcDtSZXBvcnREU0wmbmJzcDs8L3N0cm9uZz5jb250YWlucyBjb21tb24gbWV0aG9kcyBmb3IgdGhlJm5ic3A7QklSVCBSZXBvcnQmbmJzcDtEU0wuPC9wPgorCis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMmFjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC8ucHJvamVjdApAQCAtMCwwICsxLDU2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQ8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmRzLmNvcmUuYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0ZDVkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDM5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydDtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmkxOG47dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5pbXBsO3ZlcnNpb249IjAuOS4wIgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKKyBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYTtidW5kbGUtdmVyc2lvbj0iMy4wLjMiLAorIGNvbS52YWFkaW4uc2VydmVyO2J1bmRsZS12ZXJzaW9uPSJbNy41LjcsNy43LjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLm9zZ2kuaHlicmlkLmFwaTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC51dGlscztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHMudGhlbWVzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9sYXA0ai5vc2dpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKKyBtb25kcmlhbi5vc2dpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsMy41LjEpIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnRhYmxlLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5BY3RpdmF0b3IKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitTZXJ2aWNlLUNvbXBvbmVudDogT1NHSS1JTkYvKi54bWwKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC52YWxpZGF0aW9uLAorIG9yZy5lY2xpcHNlLmJpcnQuY29yZS5kYXRhLAorIG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaSwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24uZGF0YXR5cGVzO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXM7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmRhdGFtYXJ0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5tZXRhZGF0YTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkucmVwb3J0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS50aGVtZXM7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudXNlciwKKyBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC52YWFjbGlwc2UucHVibGljYXBpLmF1dGhlbnRpY2F0aW9uO3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9PU0dJLUlORi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuU2VydmljZUxpc3RlbmVyLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9PU0dJLUlORi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuU2VydmljZUxpc3RlbmVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ViZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L09TR0ktSU5GL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5TZXJ2aWNlTGlzdGVuZXIueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY3I6Y29tcG9uZW50IHhtbG5zOnNjcj0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9zY3IvdjEuMS4wIiBuYW1lPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuU2VydmljZUxpc3RlbmVyIj4KKyAgIDxyZWZlcmVuY2UgYmluZD0iYmluZENsYXNzTG9hZGVyU2VydmljZSIgY2FyZGluYWxpdHk9IjAuLm4iIGludGVyZmFjZT0ib3JnLmVjbGlwc2Uub3NicC51dGlscy5jbGFzc2xvYWRlci5JQ2xhc3NMb2FkZXIiIG5hbWU9IkNsYXNzTG9hZGVyU2VydmljZSIgcG9saWN5PSJkeW5hbWljIiB1bmJpbmQ9InVuYmluZENsYXNzTG9hZGVyU2VydmljZSIvPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuU2VydmljZUxpc3RlbmVyIi8+Cis8L3Njcjpjb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMSwgMjAxNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYWJvdXQuaW5pIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0LmluaQpAQCAtMCwwICsxLDE3IEBACisjIGFib3V0LmluaQorIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCithYm91dFRleHQ9JWZlYXR1cmVUZXh0CisKKyMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKK2ZlYXR1cmVJbWFnZT0KKworIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCithcHBOYW1lPSVmZWF0dXJlTmFtZQorCisjIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKK3dlbGNvbWVQYWdlPQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0Lm1hcHBpbmdzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2Fib3V0Lm1hcHBpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYWJvdXQubWFwcGluZ3MKQEAgLTAsMCArMSw2IEBACisjIGFib3V0Lm1hcHBpbmdzCisjIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKzA9cXVhbGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9hYm91dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzA5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYWJvdXQucHJvcGVydGllcwpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMKKworIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKKworZmVhdHVyZU5hbWU9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0CisKKyMjIyMjIyMjIyMjIyMjIyMgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmZWF0dXJlVGV4dD1cCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCitDb250cmlidXRvcnM6XG5cCisgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KKyMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTA4YjdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgc3JjLWdlbi8KK291dHB1dC4uID0gdGFyZ2V0L2NsYXNzZXMvCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgT1NHSS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCQkJICAgCQkJICAgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTc5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyYTg2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisjICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisjICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyMgCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTkxTIFN0cmluZworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworcGx1Z2luLm5hbWU9RGF0YW1hcnQgT0RBIFJ1bnRpbWUgRHJpdmVyCitkYXRhLnNvdXJjZS5uYW1lPURhdGFtYXJ0IE9EQSBEYXRhIFNvdXJjZQorZGF0YS5zZXQubmFtZT1EYXRhbWFydCBPREEgRGF0YSBTZXQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYjNjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgorPHBsdWdpbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydCIKKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5kYXRhU291cmNlIj4KKyAgICAgIDxkYXRhU291cmNlCisgICAgICAgICAgICBkcml2ZXJDbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmltcGwuRHJpdmVyIgorICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlOYW1lPSIlZGF0YS5zb3VyY2UubmFtZSIKKyAgICAgICAgICAgIHNldFRocmVhZENvbnRleHRDbGFzc0xvYWRlcj0iZmFsc2UiCisgICAgICAgICAgICBvZGFWZXJzaW9uPSIzLjAiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0Ij4KKyAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgPC9kYXRhU291cmNlPgorICAgICAgPGRhdGFTZXQKKyAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5TmFtZT0iJWRhdGEuc2V0Lm5hbWUiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmRhdGFTZXQiPgorICAgICAgICAgPGRhdGFUeXBlTWFwcGluZworICAgICAgICAgICAgICAgbmF0aXZlRGF0YVR5cGVDb2RlPSIxNiIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJCb29sZWFuIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IkJvb2xlYW4iPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjQiCisgICAgICAgICAgICAgICBvZGFTY2FsYXJEYXRhVHlwZT0iSW50ZWdlciIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJJbnRlZ2VyIj4KKyAgICAgICAgIDwvZGF0YVR5cGVNYXBwaW5nPgorICAgICAgICAgPGRhdGFUeXBlTWFwcGluZworICAgICAgICAgICAgICAgbmF0aXZlRGF0YVR5cGVDb2RlPSI4IgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IkRvdWJsZSIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJEb3VibGUiPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjMiCisgICAgICAgICAgICAgICBvZGFTY2FsYXJEYXRhVHlwZT0iRGVjaW1hbCIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJCaWdEZWNpbWFsIj4KKyAgICAgICAgIDwvZGF0YVR5cGVNYXBwaW5nPgorICAgICAgICAgPGRhdGFUeXBlTWFwcGluZworICAgICAgICAgICAgICAgbmF0aXZlRGF0YVR5cGVDb2RlPSIxIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJTdHJpbmciPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjEyIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJTdHJpbmciPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjkxIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IkRhdGUiCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZT0iRGF0ZSI+CisgICAgICAgICA8L2RhdGFUeXBlTWFwcGluZz4KKyAgICAgICAgIDxkYXRhVHlwZU1hcHBpbmcKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlQ29kZT0iMjAwNCIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJCbG9iIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IkJsb2IiPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjIwMDUiCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZT0iQ2xvYiIKKyAgICAgICAgICAgICAgIG9kYVNjYWxhckRhdGFUeXBlPSJDbG9iIj4KKyAgICAgICAgIDwvZGF0YVR5cGVNYXBwaW5nPgorICAgICAgICAgPGRhdGFUeXBlTWFwcGluZworICAgICAgICAgICAgICAgbmF0aXZlRGF0YVR5cGVDb2RlPSI5MiIKKyAgICAgICAgICAgICAgIG9kYVNjYWxhckRhdGFUeXBlPSJUaW1lIgorICAgICAgICAgICAgICAgbmF0aXZlRGF0YVR5cGU9IlRpbWUiPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8ZGF0YVR5cGVNYXBwaW5nCisgICAgICAgICAgICAgICBuYXRpdmVEYXRhVHlwZUNvZGU9IjkzIgorICAgICAgICAgICAgICAgb2RhU2NhbGFyRGF0YVR5cGU9IlRpbWVzdGFtcCIKKyAgICAgICAgICAgICAgIG5hdGl2ZURhdGFUeXBlPSJUaW1lc3RhbXAiPgorICAgICAgICAgPC9kYXRhVHlwZU1hcHBpbmc+CisgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgYWxsb3dzRW1wdHlWYWx1ZUFzTnVsbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5TmFtZT0iZnVsbCBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIERhdGFtYXJ0IGluc2lkZSB0aGUgYnVuZGxlIgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJkYXRhbWFydENsYXNzIgorICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgICAgICAgIGFsbG93c0VtcHR5VmFsdWVBc051bGw9InRydWUiCisgICAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGxheU5hbWU9IlN5bWJvbGljIE5hbWUgb2YgRGF0YW1hcnQgQnVuZGxlIgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJidW5kbGVTeW1ib2xpY05hbWUiCisgICAgICAgICAgICAgICAgICB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgYWxsb3dzRW1wdHlWYWx1ZUFzTnVsbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5TmFtZT0ibmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UiCisgICAgICAgICAgICAgICAgICBpc0VuY3J5cHRhYmxlPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VOYW1lIgorICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgICAgICAgIGFsbG93c0VtcHR5VmFsdWVBc051bGw9InRydWUiCisgICAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGxheU5hbWU9Im5hbWUgb2YgdGhlIGRhdGEgc2V0IgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJkYXRhU2V0TmFtZSIKKyAgICAgICAgICAgICAgICAgIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICAgICAgICBhbGxvd3NFbXB0eVZhbHVlQXNOdWxsPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJyZXBvcnQiPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgYWxsb3dzRW1wdHlWYWx1ZUFzTnVsbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5TmFtZT0iYXhpcyBwYWdlIGZpbHRlciIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT0iLTEiCisgICAgICAgICAgICAgICAgICBpc0VuY3J5cHRhYmxlPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIG5hbWU9ImF4aXNQYWdlRmlsdGVyIgorICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgICAgICAgIGFsbG93c0VtcHR5VmFsdWVBc051bGw9InRydWUiCisgICAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGxheU5hbWU9ImF4aXMgc2VjdGlvbiBmaWx0ZXIiCisgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9Ii0xIgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJheGlzU2VjdGlvbkZpbHRlciIKKyAgICAgICAgICAgICAgICAgIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICAgICAgICBhbGxvd3NFbXB0eVZhbHVlQXNOdWxsPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlOYW1lPSJheGlzIGNoYXB0ZXIgZmlsdGVyIgorICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPSItMSIKKyAgICAgICAgICAgICAgICAgIGlzRW5jcnlwdGFibGU9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgbmFtZT0iYXhpc0NoYXB0ZXJGaWx0ZXIiCisgICAgICAgICAgICAgICAgICB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgYWxsb3dzRW1wdHlWYWx1ZUFzTnVsbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwbGF5TmFtZT0iYXhpcyByb3cgZmlsdGVyIgorICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPSItMSIKKyAgICAgICAgICAgICAgICAgIGlzRW5jcnlwdGFibGU9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgbmFtZT0iYXhpc1Jvd0ZpbHRlciIKKyAgICAgICAgICAgICAgICAgIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5CisgICAgICAgICAgICAgICAgICBhbGxvd3NFbXB0eVZhbHVlQXNOdWxsPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXlOYW1lPSJheGlzIGNvbHVtbiBmaWx0ZXIiCisgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9Ii0xIgorICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0YWJsZT0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBuYW1lPSJheGlzQ29sdW1uRmlsdGVyIgorICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICA8L2RhdGFTZXQ+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjIwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvcG9tLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0PC9hcnRpZmFjdElkPgorICAgIDxidWlsZD4KKyAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgPCEtLSAgICAgPHJlc291cmNlcz4gLS0+CisgICAgICAgIDwhLS0gICAgICAgPHJlc291cmNlPiAtLT4KKyAgICAgICAgPCEtLSAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+IC0tPgorICAgICAgICA8IS0tICAgICAgICAgPGV4Y2x1ZGVzPiAtLT4KKyAgICAgICAgPCEtLSAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPiAtLT4KKyAgICAgICAgPCEtLSAgICAgICAgIDwvZXhjbHVkZXM+IC0tPgorICAgICAgICA8IS0tICAgICAgIDwvcmVzb3VyY2U+IC0tPgorICAgICAgICA8IS0tICAgICAgIDxyZXNvdXJjZT4gLS0+CisgICAgICAgIDwhLS0gICAgICAgICA8ZGlyZWN0b3J5PnNyYy1nZW48L2RpcmVjdG9yeT4gLS0+CisgICAgICAgIDwhLS0gICAgICAgICA8ZXhjbHVkZXM+IC0tPgorICAgICAgICA8IS0tICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+IC0tPgorICAgICAgICA8IS0tICAgICAgICAgPC9leGNsdWRlcz4gLS0+CisgICAgICAgIDwhLS0gICAgICAgPC9yZXNvdXJjZT4gLS0+CisgICAgICAgIDwhLS0gICAgIDwvcmVzb3VyY2VzPiAtLT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkYzY4OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUxpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yLCBCdW5kbGVMaXN0ZW5lciB7CisKKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBCdW5kbGU+IHNCdW5kbGVzID0gbnVsbDsKKwkKKwlwdWJsaWMgc3RhdGljIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHN5bWJvbGljTmFtZSkgeworCQlpZgkoc0J1bmRsZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gc0J1bmRsZXMuZ2V0KHN5bWJvbGljTmFtZSk7CisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzQnVuZGxlcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgQnVuZGxlPigpOworCQlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisJCWZvcgkoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlcygpKSB7CisJCQlzQnVuZGxlcy5wdXQoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGUpOworLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oInJlcG9ydGRzbC5vZGEuZGF0YW1hcnQgLSBvblN0YXJ0ICAiK2J1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7CisJCX0KKwkJYnVuZGxlQ29udGV4dC5hZGRCdW5kbGVMaXN0ZW5lcih0aGlzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBidW5kbGVDaGFuZ2VkKEJ1bmRsZUV2ZW50IGV2ZW50KSB7CisJCUJ1bmRsZSBidW5kbGUgPSBldmVudC5nZXRCdW5kbGUoKTsKKwkJaWYJKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworCQkJCWNhc2UgQnVuZGxlRXZlbnQuSU5TVEFMTEVEOgorCQkJCWNhc2UgQnVuZGxlRXZlbnQuUkVTT0xWRUQ6CisJCQkJY2FzZSBCdW5kbGVFdmVudC5TVEFSVEVEOgorCQkJCWNhc2UgQnVuZGxlRXZlbnQuU1RBUlRJTkc6CisJCQkJY2FzZSBCdW5kbGVFdmVudC5VUERBVEVEOgorCQkJCQlzQnVuZGxlcy5wdXQoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGUpOworLy8JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicmVwb3J0ZHNsLm9kYS5kYXRhbWFydCAtIG9uQ2hhbmdlICIrYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCdW5kbGVFdmVudC5TVE9QUElORzoKKwkJCQljYXNlIEJ1bmRsZUV2ZW50LlNUT1BQRUQ6CisJCQkJY2FzZSBCdW5kbGVFdmVudC5VTklOU1RBTExFRDoKKwkJCQkJc0J1bmRsZXMucmVtb3ZlKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlidW5kbGVDb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRoaXMpOworCQlzQnVuZGxlcyA9IG51bGw7CisJCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L1NlcnZpY2VMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvU2VydmljZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwNmUyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L1NlcnZpY2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY2xhc3Nsb2FkZXIuSUNsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50LmFubm90YXRpb25zLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQuYW5ub3RhdGlvbnMuUmVmZXJlbmNlQ2FyZGluYWxpdHk7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQuYW5ub3RhdGlvbnMuUmVmZXJlbmNlUG9saWN5OworCisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTGlzdGVuZXIgeworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJQ2xhc3NMb2FkZXI+IHNDbGFzc0xvYWRlclNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8SUNsYXNzTG9hZGVyPigpOworCisJLyoqCisJICogIEBwYXJhbSBjbGFzc05hbWUKKwkgKiAgQHJldHVybiByZWxvYWRlZCBjbGFzcyB2aWEgZGVjbGFyYXRpdmUgc2VydmljZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENsYXNzPD8+IHJlbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJQ2xhc3M8Pz4gcmVsb2FkZWRDbGFzcyA9IG51bGw7CisJCWZvcgkoSUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyIDogc0NsYXNzTG9hZGVyU2VydmljZXMpIHsKKwkJCXJlbG9hZGVkQ2xhc3MgPSBjbGFzc0xvYWRlci5yZWxvYWRDbGFzcyhjbGFzc05hbWUpOworCQkJaWYJKHJlbG9hZGVkQ2xhc3MgIT0gbnVsbCkgeworCQkJCXJldHVybiByZWxvYWRlZENsYXNzOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjbGFzc0xvYWRlclNlcnZpY2UgZGVjbGFyYXRpdmUgc2VydmljZSBsb2FkZWQKKwkgKi8KKwlAUmVmZXJlbmNlKGNhcmRpbmFsaXR5ID0gUmVmZXJlbmNlQ2FyZGluYWxpdHkuTVVMVElQTEUsIHBvbGljeSA9IFJlZmVyZW5jZVBvbGljeS5EWU5BTUlDKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kQ2xhc3NMb2FkZXJTZXJ2aWNlKElDbGFzc0xvYWRlciBjbGFzc0xvYWRlclNlcnZpY2UpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKFNlcnZpY2VMaXN0ZW5lci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkrIjogIitjbGFzc0xvYWRlclNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkrIiBib3VuZCIpOworCQlzQ2xhc3NMb2FkZXJTZXJ2aWNlcy5hZGQoY2xhc3NMb2FkZXJTZXJ2aWNlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY2xhc3NMb2FkZXJTZXJ2aWNlIGRlY2xhcmF0aXZlIHNlcnZpY2UgdW5sb2FkZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ2xhc3NMb2FkZXJTZXJ2aWNlKElDbGFzc0xvYWRlciBjbGFzc0xvYWRlclNlcnZpY2UpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKFNlcnZpY2VMaXN0ZW5lci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkrIjogIitjbGFzc0xvYWRlclNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkrIiB1bmJvdW5kIik7CisJCXNDbGFzc0xvYWRlclNlcnZpY2VzLnJlbW92ZShjbGFzc0xvYWRlclNlcnZpY2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaTE4bi9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaTE4bi9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDQ0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pMThuL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuaTE4bjsKKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCisvKioKKyAqIFJlc291cmNlIG1lc3NhZ2VzIHdyYXBwZXIgZm9yIHRoZSBwYWNrYWdlIHRvIG9idGFpbiBsb2NhbGl6ZWQgbWVzc2FnZSB0ZXh0LgorICovCisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5pMThuLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIEJVTkRMRV9OQU1FICk7CisKKyAgICBwcml2YXRlIE1lc3NhZ2VzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyggU3RyaW5nIGtleSApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCBrZXkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICByZXR1cm4gJyEnICsga2V5ICsgJyEnOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2Y1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pMThuL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNyBAQAorIyBFeGNlcHRpb24gbWVzc2FnZXMgZm9yIHRoZSBPZGEgRGF0YW1hcnQgRHJpdmVyCisKK2Nvbm5lY3Rpb25fQ09OTkVDVElPTl9QUk9QRVJUSUVTX01JU1NJTkc9Q29ubmVjdGlvbiBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nLgorY29ubmVjdGlvbl9DQU5OT1RfT1BFTl9GTEFUX0ZJTEVfREJfRElSPUNhbm5vdCBvcGVuIENTViBmaWxlIGRhdGFiYXNlIHVuZGVyIGRpcmVjdG9yeTogCisKK3F1ZXJ5X0NPTU1BTkRfSVNfRU1QVFk9UXVlcnkgY29tbWFuZCBpcyBlbXB0eS4KK3F1ZXJ5X0RPX05PVF9TVVBQT1JUX0NST1NTX1RBQkxFX1FVRVJZPUNyb3NzLXRhYmxlIHF1ZXJ5IGlzIG5vdCBzdXBwb3J0ZWQuCitxdWVyeV9DT01NQU5EX05PVF9WQUxJRD1RdWVyeSBjb21tYW5kIGlzIG5vdCB2YWxpZC4KK3F1ZXJ5X0FSR1VNRU5UX0VSUk9SPVRoZSBhcmd1bWVudCBzaG91bGQgYmUgZWl0aGVyICdOQU1FJyBvciAnVFlQRScuCitxdWVyeV9JT19FWENFUFRJT049QW4gSS9PIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGVuIHJlYWRpbmcgdGhlIGZpbGUuCitxdWVyeV9TT1VSQ0VfREFUQV9FUlJPUj1EdXBsaWNhdGUgY29sdW1uIG5hbWVzIGZvdW5kIGluIHNvdXJjZSBkYXRhLgorcXVlcnlfQ09MVU1OX05BTUVfRVJST1I9Q29sdW1uIG5hbWUgZXJyb3IKK3F1ZXJ5X0lOVkFMSURfRkxBVF9GSUxFPVRoZSBmbGF0ZmlsZSBkYXRhIHNvdXJjZSBpbiBub3QgdmFsaWQuCityZXN1bHRTZXRfQ09MVU1OX05PVF9GT1VORD1Db2x1bW4gbm90IGZvdW5kOgorcmVzdWx0U2V0X0NVUlNPUl9IQVNfTk9UX0JFRU5fSU5JVElBTElaRUQ9Q3Vyc29yIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuCisKK3Jlc3VsdFNldE1ldGFEYXRhX0lOVkFMSURfQ09MVU1OX0lOREVYPUludmFsaWQgY29sdW1uIGluZGV4OgorCitkYXRhVHlwZXNfVFlQRV9OQU1FX0lOVkFMSUQ9SW52YWxpZCB0eXBlIG5hbWU6CisKK2RhdGFTZXRNZXRhRGF0YV9QUk9EVUNUX05BTUU9RFRQIE9EQSBGbGF0IEZpbGUgRGF0YSBTb3VyY2UgUHJvdmlkZXIKKworY29tbW9uX0FSR1VNRU5UX0NBTk5PVF9CRV9OVUxMPUFyZ3VtZW50cyBjYW5ub3QgYmUgbnVsbC4KK2NvbW1vbl9DT05ORUNUSU9OX0hBU19OT1RfT1BFTkVEPUNvbm5lY3Rpb24gaXMgbm90IG9wZW4uCitjb21tb25fQ0FOTk9UX0ZJTkRfQ09MVU1OPUNhbm5vdCBmaW5kIGFueSBjb2x1bW5zLgorcXVlcnlfc3RyZWFtQ2xvc2VkPVN0cmVhbSBjbG9zZWQKK3F1ZXJ5X2ludmFsaWRUYWJsZU5hbWU9SW52YWxpZCB0YWJsZSBuYW1lOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9Db21tb25Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L2ltcGwvQ29tbW9uQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwNGNhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L2ltcGwvQ29tbW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuaW1wbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjbGFzcyB3aGljaCBob3N0cyB0aGUgZGVmaW5pdGlvbnMgb2YgcGFja2FnZS13aWRlIGNvbnN0YW50cy4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uQ29uc3RhbnRzCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSX0NPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSX1NQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSX0RPVUJMRVFVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRfU0VMRUNUID0gIlNFTEVDVCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlXT1JEX0ZST00gPSAiRlJPTSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlXT1JEX0FTID0gIkFTIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRfQVNURVJJU0sgPSAiKiI7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9OQU1FID0gIk9EQSBDU1YgRklMRSBEUklWRVIiOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNYXhDb25uZWN0aW9ucyA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWF4U3RhdGVtZW50cyA9IDA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05OX0hPTUVfRElSX1BST1AgPSAiSE9NRSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9BWElTX1BBR0VfRklMVEVSID0gImF4aXNQYWdlRmlsdGVyIjsgLy8kTk9OX05MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFNQVJUX0FYSVNfU0VDVElPTl9GSUxURVIgPSAiYXhpc1NlY3Rpb25GaWx0ZXIiOyAvLyROT05fTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU1BUlRfQVhJU19DSEFQVEVSX0ZJTFRFUiA9ICJheGlzQ2hhcHRlckZpbHRlciI7IC8vJE5PTl9OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9BWElTX1JPV19GSUxURVIgPSAiYXhpc1Jvd0ZpbHRlciI7IC8vJE5PTl9OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9BWElTX0NPTFVNTl9GSUxURVIgPSAiYXhpc0NvbHVtbkZpbHRlciI7IC8vJE5PTl9OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05OX0RFRkFVTFRfQ0hBUlNFVCA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfVkVSU0lPTiA9ICIzLjAiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUHJpdmF0ZSBjb250cnVjdHVyZSB3aGljaCBlbnN1cmUgdGhlIG5vbi1pbnN0YW50aWF0aWFsIG9mIHRoZSBjbGFzcworCSAqICAKKwkgKi8KKwlwcml2YXRlIENvbW1vbkNvbnN0YW50cyggKSB7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9Db25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL0Nvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWM4ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9Db25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmRhdGEuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLk9kYUV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuVUxvY2FsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLm1ldGFkYXRhLklEU0xNZXRhZGF0YVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkudXNlci5JVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkF4aXNFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5PZGFDb25uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmkxOG4uTWVzc2FnZXM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgSUNvbm5lY3Rpb24gZm9yIGFuIE9EQSBydW50aW1lIGRyaXZlci4KKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb24gaW1wbGVtZW50cyBJQ29ubmVjdGlvbiB7CisgICAgcHJpdmF0ZSBib29sZWFuIGZJc09wZW4gPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBmT2RhUHJvcENvbmZpZ3VyYXRpb25JZCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZkRhdGFTb3VyY2VOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBmRGF0YVNldE5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGZCdW5kbGVTeW1ib2xpY05hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGZEYXRhbWFydENsYXNzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBmQXhpc0ZpbHRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBRdWVyeSBxdWVyeTsKKworCXB1YmxpYyBDb25uZWN0aW9uKCkgeworCQlzdXBlcigpOworCQlmQXhpc0ZpbHRlciA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IJKGludCBpID0gQXhpc0VudW0uQ09MVU1OU19WQUxVRTsgaSA8PSBBeGlzRW51bS5DSEFQVEVSU19WQUxVRTsgaSsrKSB7CisJCQlmQXhpc0ZpbHRlci5hZGQoLTEpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEF4aXNGaWx0ZXIoaW50IGF4aXMsIFN0cmluZyBzdHJpbmcpIHsKKwkJdHJ5IHsKKwkJCWZBeGlzRmlsdGVyLnNldChheGlzLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkge30KKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uI29wZW4oamF2YS51dGlsLlByb3BlcnRpZXMpCisJICovCisJcHVibGljIHZvaWQgb3BlbiggUHJvcGVydGllcyBjb25uUHJvcGVydGllcyApIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICBpZiggY29ublByb3BlcnRpZXMgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPZGFFeGNlcHRpb24oIE1lc3NhZ2VzLmdldFN0cmluZyggImNvbm5lY3Rpb25fQ09OTkVDVElPTl9QUk9QRVJUSUVTX01JU1NJTkciICkgKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGZPZGFQcm9wQ29uZmlndXJhdGlvbklkID0gY29ublByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLk9EQV9QUk9QX0NPTkZJR1VSQVRJT05fSUQpOworICAgIAlmRGF0YVNvdXJjZU5hbWUgPSBjb25uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfREFUQVNPVVJDRU5BTUUgKTsKKyAgICAJZkRhdGFTZXROYW1lID0gY29ublByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIE9kYUNvbm5Qcm9wZXJ0aWVzLkRBVEFNQVJUX0RBVEFTRVROQU1FICk7CisgICAgICAgIGZCdW5kbGVTeW1ib2xpY05hbWUgPSBjb25uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfQlVORExFTkFNRSApOworICAgICAgICBmRGF0YW1hcnRDbGFzcyA9IGNvbm5Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBPZGFDb25uUHJvcGVydGllcy5EQVRBTUFSVF9DTEFTU05BTUUgKTsKKyAgICAgICAgaWYJKGZPZGFQcm9wQ29uZmlndXJhdGlvbklkICE9IG51bGwpIHsKKyAgICAgICAgCWlmCShmRGF0YVNvdXJjZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAJCWZEYXRhU291cmNlTmFtZSA9IFV0aWxpdGllcy5nZXREYXRhU291cmNlTmFtZUZyb21PZGFQcm9wQ29uZmlndXJhdGlvbklkKGZPZGFQcm9wQ29uZmlndXJhdGlvbklkKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWlmCShmQnVuZGxlU3ltYm9saWNOYW1lID09IG51bGwpIHsKKyAgICAgICAgCQlmQnVuZGxlU3ltYm9saWNOYW1lID0gVXRpbGl0aWVzLmdldEJ1bmRsZVN5bWJvbGljTmFtZUZyb21PZGFQcm9wQ29uZmlndXJhdGlvbklkKGZPZGFQcm9wQ29uZmlndXJhdGlvbklkKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWlmCShmRGF0YW1hcnRDbGFzcyA9PSBudWxsKSB7CisgICAgICAgIAkJZkRhdGFtYXJ0Q2xhc3MgPSBVdGlsaXRpZXMuZ2V0RGF0YW1hcnRDbGFzc05hbWVGcm9tT2RhUHJvcENvbmZpZ3VyYXRpb25JZChmT2RhUHJvcENvbmZpZ3VyYXRpb25JZCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXhpc0ZpbHRlcihBeGlzRW51bS5DSEFQVEVSU19WQUxVRSwgCWNvbm5Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KENvbW1vbkNvbnN0YW50cy5EQVRBTUFSVF9BWElTX0NIQVBURVJfRklMVEVSKSk7CisgICAgICAgIHNldEF4aXNGaWx0ZXIoQXhpc0VudW0uU0VDVElPTlNfVkFMVUUsIAljb25uUHJvcGVydGllcy5nZXRQcm9wZXJ0eShDb21tb25Db25zdGFudHMuREFUQU1BUlRfQVhJU19TRUNUSU9OX0ZJTFRFUikpOworICAgICAgICBzZXRBeGlzRmlsdGVyKEF4aXNFbnVtLlBBR0VTX1ZBTFVFLCAJY29ublByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29tbW9uQ29uc3RhbnRzLkRBVEFNQVJUX0FYSVNfUEFHRV9GSUxURVIpKTsKKyAgICAgICAgc2V0QXhpc0ZpbHRlcihBeGlzRW51bS5ST1dTX1ZBTFVFLCAJCWNvbm5Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KENvbW1vbkNvbnN0YW50cy5EQVRBTUFSVF9BWElTX1JPV19GSUxURVIpKTsKKyAgICAgICAgc2V0QXhpc0ZpbHRlcihBeGlzRW51bS5DT0xVTU5TX1ZBTFVFLCAJY29ublByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29tbW9uQ29uc3RhbnRzLkRBVEFNQVJUX0FYSVNfQ09MVU1OX0ZJTFRFUikpOworICAgIAlmSXNPcGVuID0gdHJ1ZTsKKyAJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uI3NldEFwcENvbnRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBcHBDb250ZXh0KCBPYmplY3QgY29udGV4dCApIHRocm93cyBPZGFFeGNlcHRpb24geworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JQ29ubmVjdGlvbiNjbG9zZSgpCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkgICAgZklzT3BlbiA9IGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JQ29ubmVjdGlvbiNpc09wZW4oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gZklzT3BlbjsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSUNvbm5lY3Rpb24jZ2V0TWV0YURhdGEoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSURhdGFTZXRNZXRhRGF0YSBnZXRNZXRhRGF0YSggU3RyaW5nIGRhdGFTZXRUeXBlICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIC8vIGFzc3VtZXMgdGhhdCB0aGlzIGRyaXZlciBzdXBwb3J0cyBvbmx5IG9uZSB0eXBlIG9mIGRhdGEgc2V0LAorICAgICAgICAvLyBpZ25vcmVzIHRoZSBzcGVjaWZpZWQgZGF0YVNldFR5cGUKKwkJcmV0dXJuIG5ldyBEYXRhU2V0TWV0YURhdGEoIHRoaXMgKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSUNvbm5lY3Rpb24jbmV3UXVlcnkoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVF1ZXJ5IG5ld1F1ZXJ5KCBTdHJpbmcgZGF0YVNldFR5cGUgKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXNzdW1lcyB0aGF0IHRoaXMgZHJpdmVyIHN1cHBvcnRzIG9ubHkgb25lIHR5cGUgb2YgZGF0YSBzZXQsCisgICAgICAgIC8vIGlnbm9yZXMgdGhlIHNwZWNpZmllZCBkYXRhU2V0VHlwZQorICAgICAgICBpZiggIWlzT3BlbigpICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbiggTWVzc2FnZXMuZ2V0U3RyaW5nKCAiY29tbW9uX0NPTk5FQ1RJT05fSEFTX05PVF9PUEVORUQiICkgKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUXVlcnkoCisgICAgICAgIAl0aGlzLAorICAgICAgICAJZk9kYVByb3BDb25maWd1cmF0aW9uSWQsCisgICAgICAgIAlmRGF0YVNvdXJjZU5hbWUsCisgICAgICAgIAlmRGF0YVNldE5hbWUsCisgICAgICAgIAlmQnVuZGxlU3ltYm9saWNOYW1lLAorICAgICAgICAJZkRhdGFtYXJ0Q2xhc3MsCisgICAgICAgIAlmQXhpc0ZpbHRlcik7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uI2dldE1heFF1ZXJpZXMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWF4UXVlcmllcygpIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ29tbW9uQ29uc3RhbnRzLk1heFN0YXRlbWVudHM7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uI2NvbW1pdCgpCisJICovCisJcHVibGljIHZvaWQgY29tbWl0KCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIC8vIGRvIG5vdGhpbmc7IGFzc3VtZXMgbm8gdHJhbnNhY3Rpb24gc3VwcG9ydCBuZWVkZWQKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSUNvbm5lY3Rpb24jcm9sbGJhY2soKQorCSAqLworCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdGhpbmc7IGFzc3VtZXMgbm8gdHJhbnNhY3Rpb24gc3VwcG9ydCBuZWVkZWQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2NhbGUoVUxvY2FsZSBsb2NhbGUpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpZihxdWVyeSAhPSBudWxsKSB7CisJCQlxdWVyeS5zZXRMb2NhbGUobG9jYWxlLnRvTG9jYWxlKCkpOworCQkJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL0RhdGFTZXRNZXRhRGF0YS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9EYXRhU2V0TWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhiM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9EYXRhU2V0TWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5PZGFFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgSURhdGFTZXRNZXRhRGF0YSBmb3IgYW4gT0RBIHJ1bnRpbWUgZHJpdmVyLgorICogPGJyPgorICogRm9yIGRlbW8gcHVycG9zZSwgdGhlIGF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicyBoYXZlCisgKiBoYXJkLWNvZGVkIGltcGxlbWVudGF0aW9uIHRoYXQgYXNzdW1lIHRoaXMgY3VzdG9tIE9EQSBkYXRhIHNldAorICogaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQgc2V0IGFuZCAKKyAqIGFjY2VwdHMgc2NhbGFyIGlucHV0IHBhcmFtZXRlcnMgYnkgaW5kZXguCisgKiBBIGN1c3RvbSBPREEgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBvd24gZGF0YSBzZXQgc3BlY2lmaWMKKyAqIGJlaGF2aW9yIGluIGl0cyBwbGFjZS4gCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU2V0TWV0YURhdGEgaW1wbGVtZW50cyBJRGF0YVNldE1ldGFEYXRhIHsKKwlwcml2YXRlIElDb25uZWN0aW9uIG1fY29ubmVjdGlvbjsKKwkKKwlEYXRhU2V0TWV0YURhdGEoIElDb25uZWN0aW9uIGNvbm5lY3Rpb24gKSB7CisJCW1fY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI2dldENvbm5lY3Rpb24oKQorCSAqLworCXB1YmxpYyBJQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXJldHVybiBtX2Nvbm5lY3Rpb247CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGEjZ2V0RGF0YVNvdXJjZU9iamVjdHMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVJlc3VsdFNldCBnZXREYXRhU291cmNlT2JqZWN0cyggU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsIFN0cmluZyBvYmplY3QsIFN0cmluZyB2ZXJzaW9uICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI2dldERhdGFTb3VyY2VNYWpvclZlcnNpb24oKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGF0YVNvdXJjZU1ham9yVmVyc2lvbigpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURhdGFTZXRNZXRhRGF0YSNnZXREYXRhU291cmNlTWlub3JWZXJzaW9uKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldERhdGFTb3VyY2VNaW5vclZlcnNpb24oKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGEjZ2V0RGF0YVNvdXJjZVByb2R1Y3ROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VQcm9kdWN0TmFtZSgpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gIkRhdGFtYXJ0IE9EQSBEYXRhIFNvdXJjZSI7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGEjZ2V0RGF0YVNvdXJjZVByb2R1Y3RWZXJzaW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VQcm9kdWN0VmVyc2lvbigpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyggZ2V0RGF0YVNvdXJjZU1ham9yVmVyc2lvbigpICkgKyAiLiIgKyAgIC8vJE5PTi1OTFMtMSQKKwkJCSAgIEludGVnZXIudG9TdHJpbmcoIGdldERhdGFTb3VyY2VNaW5vclZlcnNpb24oKSApOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI2dldFNRTFN0YXRlVHlwZSgpCisJICovCisJcHVibGljIGludCBnZXRTUUxTdGF0ZVR5cGUoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJcmV0dXJuIElEYXRhU2V0TWV0YURhdGEuc3FsU3RhdGVTUUw5OTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURhdGFTZXRNZXRhRGF0YSNzdXBwb3J0c011bHRpcGxlUmVzdWx0U2V0cygpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHMoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI3N1cHBvcnRzTXVsdGlwbGVPcGVuUmVzdWx0cygpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aXBsZU9wZW5SZXN1bHRzKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURhdGFTZXRNZXRhRGF0YSNzdXBwb3J0c05hbWVkUmVzdWx0U2V0cygpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOYW1lZFJlc3VsdFNldHMoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI3N1cHBvcnRzTmFtZWRQYXJhbWV0ZXJzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05hbWVkUGFyYW1ldGVycygpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEYXRhU2V0TWV0YURhdGEjc3VwcG9ydHNJblBhcmFtZXRlcnMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5QYXJhbWV0ZXJzKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRGF0YVNldE1ldGFEYXRhI3N1cHBvcnRzT3V0UGFyYW1ldGVycygpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNPdXRQYXJhbWV0ZXJzKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURhdGFTZXRNZXRhRGF0YSNnZXRTb3J0TW9kZSgpCisJICovCisJcHVibGljIGludCBnZXRTb3J0TW9kZSgpIHsKKwkJcmV0dXJuIElEYXRhU2V0TWV0YURhdGEuc29ydE1vZGVOb25lOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L2ltcGwvRHJpdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL0RyaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDhlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL0RyaXZlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2Vzc2lvbkhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRHJpdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLkxvZ0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuT2RhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLnV0aWwubWFuaWZlc3QuRGF0YVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLnV0aWwubWFuaWZlc3QuRXh0ZW5zaW9uTWFuaWZlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEudXRpbC5tYW5pZmVzdC5NYW5pZmVzdEV4cGxvcmVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElEcml2ZXIgZm9yIGFuIE9EQSBydW50aW1lIGRyaXZlci4KKyAqLworcHVibGljIGNsYXNzIERyaXZlciBpbXBsZW1lbnRzIElEcml2ZXIgeworICAgIHN0YXRpYyBTdHJpbmcgT0RBX0RBVEFfU09VUkNFX0lEID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydCI7ICAvLyROT04tTkxTLTEkCisgICAgCisJcHVibGljIERyaXZlcigpIHsKKwkJc3VwZXIoKTsKKwkJU2Vzc2lvbkhhbmRsZS5zZXRCaXJ0UmVzb3VyY2VQYXRoKCJpMThuL0kxOE4iKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURyaXZlciNnZXRDb25uZWN0aW9uKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oIFN0cmluZyBkYXRhU291cmNlVHlwZSApIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICAvLyBhc3N1bWVzIHRoYXQgdGhpcyBkcml2ZXIgc3VwcG9ydHMgb25seSBvbmUgdHlwZSBvZiBkYXRhIHNvdXJjZSwKKyAgICAgICAgLy8gaWdub3JlcyB0aGUgc3BlY2lmaWVkIGRhdGFTb3VyY2VUeXBlCisgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JRHJpdmVyI3NldExvZ0NvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuTG9nQ29uZmlndXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2dDb25maWd1cmF0aW9uKCBMb2dDb25maWd1cmF0aW9uIGxvZ0NvbmZpZyApIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBkbyBub3RoaW5nOyBhc3N1bWVzIHNpbXBsZSBkcml2ZXIgaGFzIG5vIGxvZ2dpbmcKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSURyaXZlciNnZXRNYXhDb25uZWN0aW9ucygpCisJICovCisJcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9ucygpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gMDsJLy8gbm8gbGltaXQKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklEcml2ZXIjc2V0QXBwQ29udGV4dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIHNldEFwcENvbnRleHQoIE9iamVjdCBjb250ZXh0ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisvLwkJU3lzdGVtLmVyci5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkrIi5zZXRBcHBDb250ZXh0OiAiKyhjb250ZXh0ID09IG51bGwgPyAiPG51bGw+IiA6IGNvbnRleHQudG9TdHJpbmcoKSkpOworCSAgICAvLyBkbyBub3RoaW5nOyBhc3N1bWVzIG5vIHN1cHBvcnQgZm9yIHBhc3MtdGhyb3VnaCBjb250ZXh0CisJfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGlzIGV4dGVuc2lvbidzIG1hbmlmZXN0LgorICAgICAqIEB0aHJvd3MgT2RhRXhjZXB0aW9uCisgICAgICovCisgICAgc3RhdGljIEV4dGVuc2lvbk1hbmlmZXN0IGdldE1hbmlmZXN0KCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBNYW5pZmVzdEV4cGxvcmVyLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaW9uTWFuaWZlc3QoIE9EQV9EQVRBX1NPVVJDRV9JRCApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hdGl2ZSBkYXRhIHR5cGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGNvZGUsIGFzCisgICAgICogZGVmaW5lZCBpbiB0aGlzIGRhdGEgc291cmNlIGV4dGVuc2lvbidzIG1hbmlmZXN0LgorICAgICAqIEBwYXJhbSBuYXRpdmVUeXBlQ29kZSAgICB0aGUgbmF0aXZlIGRhdGEgdHlwZSBjb2RlCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGRhdGEgdHlwZSBuYW1lCisgICAgICogQHRocm93cyBPZGFFeGNlcHRpb24gICAgIGlmIGxvb2t1cCBmYWlscworICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgZ2V0TmF0aXZlRGF0YVR5cGVOYW1lKCBpbnQgbmF0aXZlRGF0YVR5cGVDb2RlICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIERhdGFUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldE1hbmlmZXN0KCkuZ2V0RGF0YVNldFR5cGUoIG51bGwgKS5nZXREYXRhVHlwZU1hcHBpbmcoIG5hdGl2ZURhdGFUeXBlQ29kZSApOworICAgICAgICBpZiggdHlwZU1hcHBpbmcgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlTWFwcGluZy5nZXROYXRpdmVUeXBlKCk7CisgICAgICAgIH0KKwkJdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCSIlcy5nZXROYXRpdmVEYXRhVHlwZU5hbWUoJWQpOlxuTmF0aXZlIGRhdGEgdHlwZSBjb2RlICVkIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgRGF0YVR5cGVNYXBwaW5nIiwKKwkJCURyaXZlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCisJCQluYXRpdmVEYXRhVHlwZUNvZGUsCisJCQluYXRpdmVEYXRhVHlwZUNvZGUKKwkJKSk7IC8vJE5PTi1OTFMtMSQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL1F1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3NDcyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L2ltcGwvUXVlcnkuamF2YQpAQCAtMCwwICsxLDc0NCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuaW1wbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklQYXJhbWV0ZXJNZXRhRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuT2RhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLlNvcnRTcGVjOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLnNwZWMuUXVlcnlTcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi5kYXRhdHlwZXMuSUR0bzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkubWV0YWRhdGEuSURTTE1ldGFkYXRhU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnRoZW1lcy5JVGhlbWVSZXNvdXJjZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkudXNlci5JVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5Qcm9wZXJ0eUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5BRW50aXR5RGF0YW1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24uRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5DZWxsMmRUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRDZWxsU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuQXhpc0VudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkJhc2VSZXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuU2VydmljZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5pMThuLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuY29tbW9uLkNlbGxTZXRJbmRleGVkQ29udGFpbmVyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkZyYW1ld29ya1V0aWw7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLndpcmluZy5CdW5kbGVXaXJpbmc7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgSVF1ZXJ5IGZvciBhbiBPREEgcnVudGltZSBkcml2ZXIuIDxicj4KKyAqIEZvciBkZW1vIHB1cnBvc2UsIHRoZSBhdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YnMgaGF2ZSBoYXJkLWNvZGVkIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyBhIHByZS1kZWZpbmVkIHNldCBvZiBtZXRhLWRhdGEgYW5kIHF1ZXJ5IHJlc3VsdHMuIEEgY3VzdG9tIE9EQSBkcml2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGltcGxlbWVudCBvd24gZGF0YSBzb3VyY2Ugc3BlY2lmaWMgYmVoYXZpb3IgaW4gaXRzIHBsYWNlLgorICovCitwdWJsaWMgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBJUXVlcnkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1JPV1MgPSAxMDAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVUVSWV9URVhUX0RFTElNSVRFUiA9ICc6JzsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENPTFVNTlNJTkZPX0JFR0lOX0RFTElNSVRFUiA9ICd7JzsKKworCXByaXZhdGUgaW50IGZNYXhSb3dzOworCS8vIFRoZSBDb25uZWN0aW9uIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgUXVlcnkuCisJcHJpdmF0ZSBJQ29ubmVjdGlvbiBmQ29ubmVjdGlvbiA9IG51bGw7CisJLy8gVGhlIG1ldGEgZGF0YSBvZiB0aGUgcXVlcnkncyByZXN1bHQgc2V0LgorCS8vIEl0IGlzIGF2YWlsYWJsZSBvbmx5IGFmdGVyIGEgcXVlcnkgaXMgcHJlcGFyZWQuCisJcHJpdmF0ZSBJUmVzdWx0U2V0TWV0YURhdGEgZlJlc3VsdFNldE1ldGFEYXRhID0gbnVsbDsKKwlwcml2YXRlIENlbGwyZFRhYmxlIGZSZXN1bHRDZWxsVGFibGUgPSBudWxsOworCXByaXZhdGUgQ2VsbFNldEluZGV4ZWRDb250YWluZXIgZlJlc3VsdEZvcm1hdHRlZFRhYmxlID0gbnVsbDsKKworCXByaXZhdGUgQmFzZVJlcG9ydCBmQmFzZVJlcG9ydCA9IG51bGw7CisJcHJpdmF0ZSBJVGhlbWVSZXNvdXJjZVNlcnZpY2UgdGhlbWVSZXNvdXJjZVNlcnZpY2UgPSBudWxsOworCXByaXZhdGUgU3RyaW5nIGZPZGFQcm9wQ29uZmlndXJhdGlvbklkID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBmRGF0YVNvdXJjZU5hbWUgPSBudWxsOworCXByaXZhdGUgU3RyaW5nIGZEYXRhU2V0TmFtZSA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgZkJ1bmRsZVN5bWJvbGljTmFtZSA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgZkRhdGFtYXJ0Q2xhc3NOYW1lID0gbnVsbDsKKwlwcml2YXRlIENsYXNzIGZUYXNrT3BlcmF0aXZlRHRvQ2xhc3MgPSBudWxsOworCXByaXZhdGUgTGlzdDxJRHRvPiBmVGFza0luaXRpYWxPcGVyYXRpdmVEdG9zID0gbnVsbDsKKwlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZUZpbGxlclRleHQgPSBmYWxzZTsKKwlwcml2YXRlIEFFbnRpdHlEYXRhbWFydCBmRGF0YW1hcnRJbnN0YW5jZSA9IG51bGw7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eUxvb2t1cD4gZlByb3BlcnR5TG9va3VwTWFwID0gbnVsbDsKKwlwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBmQXhpc0ZpbHRlciA9IG51bGw7CisJcHJpdmF0ZSBJVXNlciB1c2VyID0gbnVsbDsKKwlwcml2YXRlIExvY2FsZSBsb2NhbGU7CisJcHJpdmF0ZSBJRFNMTWV0YWRhdGFTZXJ2aWNlIGRzbE1ldGFkYXRhU2VydmljZTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBmaWx0ZXJNYXA7CisKKwlwdWJsaWMgUXVlcnkoSUNvbm5lY3Rpb24gaG9zdCwgU3RyaW5nIG9kYVByb3BDb25maWd1cmF0aW9uSWQsIFN0cmluZyBkYXRhU291cmNlTmFtZSwgU3RyaW5nIGRhdGFTZXROYW1lLCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgZGF0YW1hcnRDbGFzc05hbWUsCisJCQlBcnJheUxpc3Q8SW50ZWdlcj4gYXhpc0ZpbHRlcikgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRoaXMoaG9zdCwgb2RhUHJvcENvbmZpZ3VyYXRpb25JZCwgZGF0YVNvdXJjZU5hbWUsIGRhdGFTZXROYW1lLCBidW5kbGVTeW1ib2xpY05hbWUsIGRhdGFtYXJ0Q2xhc3NOYW1lLCBheGlzRmlsdGVyLCBudWxsLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgUXVlcnkoSUNvbm5lY3Rpb24gaG9zdCwgU3RyaW5nIG9kYVByb3BDb25maWd1cmF0aW9uSWQsIFN0cmluZyBkYXRhU291cmNlTmFtZSwgU3RyaW5nIGRhdGFTZXROYW1lLCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgZGF0YW1hcnRDbGFzc05hbWUsCisJCQlBcnJheUxpc3Q8SW50ZWdlcj4gYXhpc0ZpbHRlciwgQ2xhc3MgdGFza09wZXJhdGl2ZUR0b0NsYXNzLCBMaXN0PElEdG8+IHRhc2tJbml0aWFsT3BlcmF0aXZlRHRvcykgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWlmICggLyogaG9tZURpciA9PSBudWxsIHx8ICovaG9zdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiY29tbW9uX0FSR1VNRU5UX0NBTk5PVF9CRV9OVUxMIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZk9kYVByb3BDb25maWd1cmF0aW9uSWQgPSBvZGFQcm9wQ29uZmlndXJhdGlvbklkOworCQlmQ29ubmVjdGlvbiA9IGhvc3Q7CisJCWZEYXRhU291cmNlTmFtZSA9IGRhdGFTb3VyY2VOYW1lOworCQlmRGF0YVNldE5hbWUgPSBkYXRhU2V0TmFtZTsKKwkJZkJ1bmRsZVN5bWJvbGljTmFtZSA9IGJ1bmRsZVN5bWJvbGljTmFtZTsKKwkJZkRhdGFtYXJ0Q2xhc3NOYW1lID0gZGF0YW1hcnRDbGFzc05hbWU7CisJCWZBeGlzRmlsdGVyID0gYXhpc0ZpbHRlcjsKKwkJZlRhc2tPcGVyYXRpdmVEdG9DbGFzcyA9IHRhc2tPcGVyYXRpdmVEdG9DbGFzczsKKwkJZlRhc2tJbml0aWFsT3BlcmF0aXZlRHRvcyA9IHRhc2tJbml0aWFsT3BlcmF0aXZlRHRvczsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3ByZXBhcmUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVwYXJlKFN0cmluZyBxdWVyeVRleHQpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpZiAocXVlcnlUZXh0ICE9IG51bGwpIHsKKwkJCVN0cmluZyBxdWVyeSA9IHNwbGl0UXVlcnlUZXh0KHF1ZXJ5VGV4dClbMF07CisJCQl2YWxpZGF0ZU9wZW5Db25uZWN0aW9uKCk7CisJCQlTdHJpbmcgZm9ybWF0dGVkUXVlcnkgPSBmb3JtYXRRdWVyeVRleHQocXVlcnkpOworCQkJdmFsaWRhdGVRdWVyeVRleHQoZm9ybWF0dGVkUXVlcnkpOworCQkJZ2V0TWV0YURhdGEoKTsKKworCQkJaWYgKGZEYXRhbWFydEluc3RhbmNlICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQkvLyAtLS0gZ2V0IHRoZSBkYXRhIHRvIGV4dHJhY3QgdGhlIGRhdGEgdHlwZXMgPjotKCAtLS0KKwkJCQkJZkRhdGFtYXJ0SW5zdGFuY2UuZW5hYmxlRmlsbGVyVGV4dChmRW5hYmxlRmlsbGVyVGV4dCk7CisJCQkJCURlcml2ZWRDZWxsU2V0IGNlbGxTZXQgPSBmRGF0YW1hcnRJbnN0YW5jZS5nZXRSZXN1bHRzKHVzZXIsIGZpbHRlck1hcCwgZlRhc2tPcGVyYXRpdmVEdG9DbGFzcywgZlRhc2tJbml0aWFsT3BlcmF0aXZlRHRvcyk7CisJCQkJCWlmIChjZWxsU2V0ICE9IG51bGwpIHsKKwkJCQkJCS8vIC0tLSBpZiBhIGNvbnRhaW5pbmcgdmlldyBleGlzdHMsIGFkZCBhbGwgY29udGFpbmVkIGVudGl0eSBpZHMgdG8gYmUgbGlzdGVuZWQgZm9yIG1vZGlmaWNhdGlvbnMKKwkJCQkJCWlmICgoZkJhc2VSZXBvcnQgIT0gbnVsbCkgJiYgKGNlbGxTZXQgIT0gbnVsbCkpIHsKKwkJCQkJCQlmRGF0YW1hcnRJbnN0YW5jZS5hZGRFbnRpdHlJZHNUb01vZGlmeUxpc3RlbmVyKGZCYXNlUmVwb3J0LCBjZWxsU2V0KTsKKwkJCQkJCX0KKwkJCQkJCWZSZXN1bHRDZWxsVGFibGUgPSBuZXcgQ2VsbDJkVGFibGUoY2VsbFNldCk7CisJCQkJCQkvLyAtLS0gaWYgcHJvcGVydHkgbG9va3VwcyBhcmUgYXZhaWxhYmxlLCBhcHBseSBpdCB0byB0aGUgY2VsbHNldCAtLS0KKwkJCQkJCWlmICgoZlByb3BlcnR5TG9va3VwTWFwICE9IG51bGwpICYmIChjZWxsU2V0ICE9IG51bGwpKSB7CisJCQkJCQkJTGlzdDxJbnRlZ2VyPiBjb29yZGluYXRlU3lzdGVtID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCQkJCQkJCWZvciAoaW50IGF4aXMgPSAwOyBheGlzIDwgY2VsbFNldC5nZXRBeGVzKCkuc2l6ZSgpOyBheGlzKyspIHsKKwkJCQkJCQkJY29vcmRpbmF0ZVN5c3RlbS5hZGQoMCk7CisJCQkJCQkJfQorCQkJCQkJCWZSZXN1bHRGb3JtYXR0ZWRUYWJsZSA9IG5ldyBDZWxsU2V0SW5kZXhlZENvbnRhaW5lcihkc2xNZXRhZGF0YVNlcnZpY2UsIGxvY2FsZSwgdGhlbWVSZXNvdXJjZVNlcnZpY2UsIGZQcm9wZXJ0eUxvb2t1cE1hcCwgY2VsbFNldCwgY29vcmRpbmF0ZVN5c3RlbSwKKwkJCQkJCQkJCWZhbHNlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImNvbW1vbl9OVUxMX1FVRVJZX1RFWFQiKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QXhpc0ZpbHRlcihpbnQgYXhpcywgT2JqZWN0IHN0cmluZykgeworCQl0cnkgeworCQkJZkF4aXNGaWx0ZXIuc2V0KGF4aXMsIEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgc3RyaW5nKSk7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB8IENsYXNzQ2FzdEV4Y2VwdGlvbiB8IE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjc2V0QXBwQ29udGV4dChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIHNldEFwcENvbnRleHQoT2JqZWN0IGNvbnRleHQpIHRocm93cyBPZGFFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBNYXApIHsKKwkJCQlNYXAgYXBwQ29udGV4dCA9IChNYXApIGNvbnRleHQ7CisJCQkJaWYoYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfUkVQT1JUKSAhPSBudWxsKSB7CisJCQkJCWZCYXNlUmVwb3J0ID0gKEJhc2VSZXBvcnQpIGFwcENvbnRleHQuZ2V0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX1JFUE9SVCk7CisJCQkJfQorCQkJCWlmKGFwcENvbnRleHQuZ2V0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX1RIRU1FUkVTT1VSQ0VTRVJWSUNFKSAhPSBudWxsKSB7CisJCQkJCXRoZW1lUmVzb3VyY2VTZXJ2aWNlID0gKElUaGVtZVJlc291cmNlU2VydmljZSkgYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfVEhFTUVSRVNPVVJDRVNFUlZJQ0UpOworCQkJCX0KKwkJCQlpZihhcHBDb250ZXh0LmdldChJUmVwb3J0UHJvdmlkZXIuQVBQQ09OVEVYVF9EU0xNRVRBREFUQVNFUlZJQ0UpICE9IG51bGwpIHsKKwkJCQkJZHNsTWV0YWRhdGFTZXJ2aWNlID0gKElEU0xNZXRhZGF0YVNlcnZpY2UpIGFwcENvbnRleHQuZ2V0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX0RTTE1FVEFEQVRBU0VSVklDRSk7CisJCQkJfQorCQkJCWlmKGFwcENvbnRleHQuZ2V0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX1VTRVIpICE9IG51bGwpIHsKKwkJCQkJdXNlciA9IChJVXNlcikgYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfVVNFUik7CisJCQkJfQorCQkJCWxvY2FsZSA9IHVzZXIuZ2V0TG9jYWxlKCk7CisJCQkJaWYoYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfREFUQU1BUlRJTlNUQU5DRSkgIT0gbnVsbCkgeworCQkJCQlmRGF0YW1hcnRJbnN0YW5jZSA9IChBRW50aXR5RGF0YW1hcnQpIGFwcENvbnRleHQuZ2V0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX0RBVEFNQVJUSU5TVEFOQ0UpOworCQkJCX0KKwkJCQlpZihhcHBDb250ZXh0LmdldChJUmVwb3J0UHJvdmlkZXIuQVBQQ09OVEVYVF9GSUxURVJNQVApICE9IG51bGwpIHsKKwkJCQkJZmlsdGVyTWFwID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfRklMVEVSTUFQKTsKKwkJCQl9CisJCQkJaWYoYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfUFJPUEVSVFlMT09LVVApICE9IG51bGwpIHsKKwkJCQkJZlByb3BlcnR5TG9va3VwTWFwID0gKE1hcDxTdHJpbmcsIFByb3BlcnR5TG9va3VwPikgYXBwQ29udGV4dC5nZXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfUFJPUEVSVFlMT09LVVApOworCQkJCX0KKworCQkJCXNldEF4aXNGaWx0ZXIoQXhpc0VudW0uQ0hBUFRFUlNfVkFMVUUsIGFwcENvbnRleHQuZ2V0KENvbW1vbkNvbnN0YW50cy5EQVRBTUFSVF9BWElTX0NIQVBURVJfRklMVEVSKSk7CisJCQkJc2V0QXhpc0ZpbHRlcihBeGlzRW51bS5TRUNUSU9OU19WQUxVRSwgYXBwQ29udGV4dC5nZXQoQ29tbW9uQ29uc3RhbnRzLkRBVEFNQVJUX0FYSVNfU0VDVElPTl9GSUxURVIpKTsKKwkJCQlzZXRBeGlzRmlsdGVyKEF4aXNFbnVtLlBBR0VTX1ZBTFVFLCBhcHBDb250ZXh0LmdldChDb21tb25Db25zdGFudHMuREFUQU1BUlRfQVhJU19QQUdFX0ZJTFRFUikpOworCQkJCXNldEF4aXNGaWx0ZXIoQXhpc0VudW0uUk9XU19WQUxVRSwgYXBwQ29udGV4dC5nZXQoQ29tbW9uQ29uc3RhbnRzLkRBVEFNQVJUX0FYSVNfUk9XX0ZJTFRFUikpOworCQkJCXNldEF4aXNGaWx0ZXIoQXhpc0VudW0uQ09MVU1OU19WQUxVRSwgYXBwQ29udGV4dC5nZXQoQ29tbW9uQ29uc3RhbnRzLkRBVEFNQVJUX0FYSVNfQ09MVU1OX0ZJTFRFUikpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9CisJCWlmIChmRGF0YW1hcnRJbnN0YW5jZSA9PSBudWxsKSB7CisJCQlpZiAoKGZCdW5kbGVTeW1ib2xpY05hbWUgIT0gbnVsbCkgJiYgKGZEYXRhbWFydENsYXNzTmFtZSAhPSBudWxsKSkgeworCQkJCS8vICEhISByZW1lbWJlciB0aGUgb3JpZ2luYWwgY2xhc3MgbG9hZGVyICEhIQorCQkJCUNsYXNzTG9hZGVyIG9yaWdpbmFsTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKwkJCQl0cnkgeworCQkJCQkvLyAtLS0gdHJ5IHRvIGxvYWQgdGhlIGRhdGFtYXJ0IGNsYXNzIC0tLQorCQkJCQlDbGFzczw/PiBkYXRhbWFydENsYXNzID0gbG9hZERhdGFtYXJ0Q2xhc3MoKTsKKwkJCQkJLy8gLS0tIGdldCB0aGUgY29uc3RydWN0b3IgLS0tCisJCQkJCUNvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yID0gZGF0YW1hcnRDbGFzcy5nZXRDb25zdHJ1Y3RvcigpOworCQkJCQkvLyAtLS0gY3JlYXRlIHRoZSBpbnN0YW5jZSAtLS0KKwkJCQkJZkRhdGFtYXJ0SW5zdGFuY2UgPSAoQUVudGl0eURhdGFtYXJ0KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOworCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCS8vIG9yZy5lY2xpcHNlLm9zYnAuZGF0YXNvdXJjZXMuQWN0aXZhdG9yLnNob3dQb3NzaWJsZUNvbmZpZ3VyYXRpb25FcnJvcnMoU3lzdGVtLmVycik7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJLy8gISEhIHJlc2V0IHRoZSBvcmlnaW5hbCBjbGFzcyBsb2FkZWQgISEhCisJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9yaWdpbmFsTG9hZGVyKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZkJ1bmRsZVN5bWJvbGljTmFtZSA9PSBudWxsKSB7CisJCQkJQnVuZGxlIGJ1bmRsZSA9IEZyYW1ld29ya1V0aWwuZ2V0QnVuZGxlKGZEYXRhbWFydEluc3RhbmNlLmdldENsYXNzKCkpOworCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJCQlmQnVuZGxlU3ltYm9saWNOYW1lID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgQ2xhc3M8Pz4gbG9hZERhdGFtYXJ0Q2xhc3MoKSB7CisJCUNsYXNzPD8+IGxvYWRlZENsYXNzID0gbnVsbDsKKwkJU3RyaW5nW10gbWVzc2FnZXMgPSBudWxsOworCisJCS8vIC0tLSBmaXJzdCB0cnkgLSB0cnkgdG8gbG9hZCB0aGUgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gYnVuZGxlIC0tLQorCQlpZiAoKGZCdW5kbGVTeW1ib2xpY05hbWUgIT0gbnVsbCkgJiYgKGZEYXRhbWFydENsYXNzTmFtZSAhPSBudWxsKSkgeworCQkJQnVuZGxlIGJ1bmRsZSA9IEFjdGl2YXRvci5nZXRCdW5kbGUoZkJ1bmRsZVN5bWJvbGljTmFtZSk7CisJCQlpZiAoYnVuZGxlID09IG51bGwpIHsKKwkJCQltZXNzYWdlcyA9IG5ldyBTdHJpbmdbXSB7ICIhISEgQ291bGQgbm90IGxvYWQgdGhlIGJ1bmRsZSAnIiArIGZCdW5kbGVTeW1ib2xpY05hbWUgKyAiJyB0byBsb2FkIHRoZSBjbGFzcyAnIiArIGZEYXRhbWFydENsYXNzTmFtZSArICInIiwgfTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTUwMzMwNC9ob3ctdG8tZ2V0LWNsYXNzbG9hZGVyLWZvci1hLWJ1bmRsZS1pbi1lcXVpbm94CisJCQkJLy8gc2VlIGh0dHA6Ly90b21zb25kZXYuYmVzdHNvbHV0aW9uLmF0LzIwMTEvMTAvMTUvZmluZC1jbGFzc2xvYWRlci1mb3ItYS1naXZlbi1vc2dpLWJ1bmRsZS8KKwkJCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGJ1bmRsZS5hZGFwdChCdW5kbGVXaXJpbmcuY2xhc3MpLmdldENsYXNzTG9hZGVyKCk7CisJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOworCQkJCXRyeSB7CisJCQkJCWxvYWRlZENsYXNzID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGZEYXRhbWFydENsYXNzTmFtZSk7CisJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCW1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdIHsgIiEhISBZb3UgaGF2ZSB0byB1c2UgdGhlIGNsYXNzIGxvYWRlciBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGJ1bmRsZSBhcyB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzIGxvYWRlciIsIH07CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gLS0tIHRyeSB0byAocmUpbG9hZCB0aGUgY2xhc3MgdmlhIGNsYXNzIGxvYWRlciBmcm9tIGRlY2xhcmF0aXZlIHNlcnZpY2UgLS0tCisJCWlmICgobG9hZGVkQ2xhc3MgPT0gbnVsbCkgJiYgKGZEYXRhbWFydENsYXNzTmFtZSAhPSBudWxsKSkgeworCQkJbG9hZGVkQ2xhc3MgPSBTZXJ2aWNlTGlzdGVuZXIucmVsb2FkQ2xhc3MoZkRhdGFtYXJ0Q2xhc3NOYW1lKTsKKwkJCWZFbmFibGVGaWxsZXJUZXh0ID0gKGxvYWRlZENsYXNzICE9IG51bGwpOworCQl9CisKKwkJLy8gISEhISEhISEhISEhISEhISEhISBpZiBuZWVkZWQgaW5zdGFuY2VzIGFyZSBub3QgcnVubmluZywgc3RhcnQgdGhlbSB1cCAuLi4uLi4uLi4uLi4uLi4uLi4uCisJCS8vIGlmICgobG9hZGVkQ2xhc3MgIT0gbnVsbCkgJiYgKERTVXRpbEZhY3RvcnlCaW5kZXIuZHNVdGlsRmFjdG9yeSA9PSBudWxsKSkgeworCQkvLyBvcmcuZWNsaXBzZS5vc2JwLmRhdGFzb3VyY2VzLkFjdGl2YXRvciBhY3RpdmF0b3IgPSBuZXcgb3JnLmVjbGlwc2Uub3NicC5kYXRhc291cmNlcy5BY3RpdmF0b3IoKTsKKwkJLy8gdHJ5IHsKKwkJLy8gYWN0aXZhdG9yLnN0YXJ0KEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOworCQkvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCQkvLyB9CisJCS8vIChuZXcgRFNVdGlsRmFjdG9yeUJpbmRlcigpKS5iaW5kRHNVdGlsRmFjdG9yeShhY3RpdmF0b3IpOworCQkvLyB9CisJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4gaWYgbmVlZGVkIGluc3RhbmNlcyBhcmUgbm90IHJ1bm5pbmcsIHN0YXJ0IHRoZW0gdXAgISEhISEhISEhISEhISEhISEhIQorCisJCWlmICgobG9hZGVkQ2xhc3MgPT0gbnVsbCkgJiYgKG1lc3NhZ2VzICE9IG51bGwpKSB7CisJCQlmb3IgKFN0cmluZyBtZXNzYWdlIDogbWVzc2FnZXMpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbG9hZGVkQ2xhc3M7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNjbG9zZSgpCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJZk1heFJvd3MgPSAwOworCQlmQ29ubmVjdGlvbiA9IG51bGw7CisJCWZSZXN1bHRTZXRNZXRhRGF0YSA9IG51bGw7CisJCWZSZXN1bHRDZWxsVGFibGUgPSBudWxsOworCQlmUmVzdWx0Rm9ybWF0dGVkVGFibGUgPSBudWxsOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjZ2V0TWV0YURhdGEoKQorCSAqLworCXB1YmxpYyBJUmVzdWx0U2V0TWV0YURhdGEgZ2V0TWV0YURhdGEoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJaWYgKGZSZXN1bHRTZXRNZXRhRGF0YSA9PSBudWxsKSB7CisJCQlmUmVzdWx0U2V0TWV0YURhdGEgPSBuZXcgUmVzdWx0U2V0TWV0YURhdGEoZkRhdGFtYXJ0SW5zdGFuY2UuZ2V0VHlwZXNNYXAodXNlcikpOworCQl9CisJCXJldHVybiBmUmVzdWx0U2V0TWV0YURhdGE7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNleGVjdXRlUXVlcnkoKQorCSAqLworCXB1YmxpYyBJUmVzdWx0U2V0IGV4ZWN1dGVRdWVyeSgpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFJlc3VsdFNldChmUmVzdWx0Q2VsbFRhYmxlLCBmUmVzdWx0Rm9ybWF0dGVkVGFibGUsIHRoaXMuZlJlc3VsdFNldE1ldGFEYXRhKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiUXVlcnk6IGluZ29yZSBzZXQgcHJvcGVydHk6ICIrbmFtZSsiIDwtLSAiK3ZhbHVlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldE1heFJvd3MoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1heFJvd3MoaW50IG1heCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWZNYXhSb3dzID0gbWF4OworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjZ2V0TWF4Um93cygpCisJICovCisJcHVibGljIGludCBnZXRNYXhSb3dzKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXJldHVybiBmTWF4Um93czsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I2NsZWFySW5QYXJhbWV0ZXJzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhckluUGFyYW1ldGVycygpIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBpbnB1dCBwYXJhbWV0ZXIKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXRJbnQoamF2YS5sYW5nLlN0cmluZywgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldEludChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgaW50IHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gbmFtZWQgaW5wdXQgcGFyYW1ldGVyCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXRJbnQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0SW50KGludCBwYXJhbWV0ZXJJZCwgaW50IHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gaW5wdXQgcGFyYW1ldGVyCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXREb3VibGUoamF2YS5sYW5nLlN0cmluZywgZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldERvdWJsZShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgZG91YmxlIHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gb25seSBhcHBsaWVzIHRvIG5hbWVkIGlucHV0IHBhcmFtZXRlcgorCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjc2V0RG91YmxlKGludCwgZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldERvdWJsZShpbnQgcGFyYW1ldGVySWQsIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBpbnB1dCBwYXJhbWV0ZXIKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldEJpZ0RlY2ltYWwoamF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0RlY2ltYWwpCisJICovCisJcHVibGljIHZvaWQgc2V0QmlnRGVjaW1hbChTdHJpbmcgcGFyYW1ldGVyTmFtZSwgQmlnRGVjaW1hbCB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBuYW1lZCBpbnB1dCBwYXJhbWV0ZXIKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldEJpZ0RlY2ltYWwoaW50LCBqYXZhLm1hdGguQmlnRGVjaW1hbCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCaWdEZWNpbWFsKGludCBwYXJhbWV0ZXJJZCwgQmlnRGVjaW1hbCB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBpbnB1dCBwYXJhbWV0ZXIKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgcGFyYW1ldGVyTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gb25seSBhcHBsaWVzIHRvIG5hbWVkIGlucHV0IHBhcmFtZXRlcgorCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjc2V0U3RyaW5nKGludCwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoaW50IHBhcmFtZXRlcklkLCBTdHJpbmcgdmFsdWUpIHRocm93cyBPZGFFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gaW5wdXQgcGFyYW1ldGVyCisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXREYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuc3FsLkRhdGUpCisJICovCisJcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgcGFyYW1ldGVyTmFtZSwgRGF0ZSB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBuYW1lZCBpbnB1dCBwYXJhbWV0ZXIKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldERhdGUoaW50LCBqYXZhLnNxbC5EYXRlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGUoaW50IHBhcmFtZXRlcklkLCBEYXRlIHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gb25seSBhcHBsaWVzIHRvIGlucHV0IHBhcmFtZXRlcgorCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjc2V0VGltZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5UaW1lKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWUoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFRpbWUgdmFsdWUpIHRocm93cyBPZGFFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gbmFtZWQgaW5wdXQgcGFyYW1ldGVyCisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXRUaW1lKGludCwgamF2YS5zcWwuVGltZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUaW1lKGludCBwYXJhbWV0ZXJJZCwgVGltZSB2YWx1ZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBpbnB1dCBwYXJhbWV0ZXIKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVF1ZXJ5I3NldFRpbWVzdGFtcChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5UaW1lc3RhbXApCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBUaW1lc3RhbXAgdmFsdWUpIHRocm93cyBPZGFFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gbmFtZWQgaW5wdXQgcGFyYW1ldGVyCisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNzZXRUaW1lc3RhbXAoaW50LCBqYXZhLnNxbC5UaW1lc3RhbXApCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGludCBwYXJhbWV0ZXJJZCwgVGltZXN0YW1wIHZhbHVlKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gb25seSBhcHBsaWVzIHRvIGlucHV0IHBhcmFtZXRlcgorCX0KKworCXB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworCQlyZXR1cm4gbG9jYWxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisJCXRoaXMubG9jYWxlID0gbG9jYWxlOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjZmluZEluUGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGludCBmaW5kSW5QYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBuYW1lZCBpbnB1dCBwYXJhbWV0ZXIKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklRdWVyeSNnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpCisJICovCisJcHVibGljIElQYXJhbWV0ZXJNZXRhRGF0YSBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvKgorCQkgKiBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIFJlcGxhY2Ugd2l0aCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYW4gaW5zdGFuY2UgYmFzZWQgb24gdGhpcyBwcmVwYXJlZCBxdWVyeS4KKwkJICovCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjc2V0U29ydFNwZWMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuU29ydFNwZWMpCisJICovCisJcHVibGljIHZvaWQgc2V0U29ydFNwZWMoU29ydFNwZWMgc29ydEJ5KSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyBvbmx5IGFwcGxpZXMgdG8gc29ydGluZywgYXNzdW1lcyBub3Qgc3VwcG9ydGVkCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUXVlcnkjZ2V0U29ydFNwZWMoKQorCSAqLworCXB1YmxpYyBTb3J0U3BlYyBnZXRTb3J0U3BlYygpIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIG9ubHkgYXBwbGllcyB0byBzb3J0aW5nCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIHdoZXRoZXIgdGhlIHF1ZXJ5J3MgY29ubmVjdGlvbiBpcyBvcGVuLgorCSAqIAorCSAqIEB0aHJvd3MgT2RhRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiB5ZXQKKwkgKi8KKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVPcGVuQ29ubmVjdGlvbigpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpZiAoZkNvbm5lY3Rpb24uaXNPcGVuKCkgPT0gZmFsc2UpIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJjb21tb25fQ09OTkVDVElPTl9IQVNfTk9UX09QRU5FRCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogRm9ybWF0IHRoZSBnaXZlbiBxdWVyeSB0ZXh0LiBFbGltaW5hdGVzIHJlZHVuZGFudCBzcGFjZXMgYW5kIGNvbnZlcnQgYWxsIGtleXdvcmRzIHRvIHVwcGVyY2FzZS4KKwkgKiAKKwkgKiBAcGFyYW0gcXVlcnlUZXh0CisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgU3RyaW5nIGZvcm1hdFF1ZXJ5VGV4dChTdHJpbmcgcXVlcnlUZXh0KSB7CisJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmdbXSB0ZW1wID0gcXVlcnlUZXh0LnRyaW0oKS5zcGxpdChDb21tb25Db25zdGFudHMuREVMSU1JVEVSX1NQQUNFKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGVtcFtpXS5lcXVhbHNJZ25vcmVDYXNlKENvbW1vbkNvbnN0YW50cy5LRVlXT1JEX0FTKSkgeworCQkJCXRlbXBbaV0gPSB0ZW1wW2ldLnRvVXBwZXJDYXNlKCk7CisJCQl9CisJCQlpZiAodGVtcFtpXS5lcXVhbHNJZ25vcmVDYXNlKENvbW1vbkNvbnN0YW50cy5LRVlXT1JEX0ZST00pKSB7CisJCQkJdGVtcFtpXSA9IHRlbXBbaV0udG9VcHBlckNhc2UoKTsKKwkJCX0KKwkJCWlmICh0ZW1wW2ldLmVxdWFsc0lnbm9yZUNhc2UoQ29tbW9uQ29uc3RhbnRzLktFWVdPUkRfU0VMRUNUKSkgeworCQkJCXRlbXBbaV0gPSB0ZW1wW2ldLnRvVXBwZXJDYXNlKCk7CisJCQl9CisJCQlyZXN1bHQgPSByZXN1bHQgKyB0ZW1wW2ldICsgQ29tbW9uQ29uc3RhbnRzLkRFTElNSVRFUl9TUEFDRTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRyaW0oKTsKKwl9CisKKwkvKioKKwkgKiBWYWxpZGF0ZSB3aGV0aGVyIHRoZSBxdWVyeSB0ZXh0IGlzIHZhbGlkLgorCSAqIAorCSAqIEBwYXJhbSBmb3JtYXR0ZWRRdWVyeQorCSAqICAgICAgICAgICAgdGhlIFNRTCBjb21tYW5kCisJICogQHRocm93cyBPZGFFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBnaXZlbiB0ZXh0IGlzIGludmFsaWQgb3IgaWYgYW55IG90aGVyIGVycm9yIG9jY3VycworCSAqLworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVF1ZXJ5VGV4dChTdHJpbmcgZm9ybWF0dGVkUXVlcnkpIHRocm93cyBPZGFFeGNlcHRpb24geworCQl2YWxpZGF0ZU5vbkVtcHR5UXVlcnlUZXh0KGZvcm1hdHRlZFF1ZXJ5KTsKKworCQlTdHJpbmdbXSBxdWVyeUZyYWdtZW50cyA9IHBhcnNlUHJlcGFyZWRRdWVyeVRleHQoZm9ybWF0dGVkUXVlcnkpOworCisJCWlmIChxdWVyeUZyYWdtZW50c1syXS5zcGxpdChDb21tb25Db25zdGFudHMuREVMSU1JVEVSX0NPTU1BKS5sZW5ndGggIT0gMSkgeworCQkJdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInF1ZXJ5X0RPX05PVF9TVVBQT1JUX0NST1NTX1RBQkxFX1FVRVJZIikpOworCQl9CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgd2hldGhlciB0aGUgZ2l2ZW4gcXVlcnkgdGV4dCBpcyBlbXB0eS4KKwkgKiAKKwkgKiBAcGFyYW0gZm9ybWF0dGVkUXVlcnkKKwkgKiAgICAgICAgICAgIHRoZSB0cmltZWQgcXVlcnkgdGV4dAorCSAqIEB0aHJvd3MgT2RhRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIHRleHQgaXMgZW1wdHkKKwkgKi8KKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb25FbXB0eVF1ZXJ5VGV4dChTdHJpbmcgZm9ybWF0dGVkUXVlcnkpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpZiAoZm9ybWF0dGVkUXVlcnkgPT0gbnVsbCB8fCBmb3JtYXR0ZWRRdWVyeS5sZW5ndGgoKSA9PSAwKSB7CisJCQl0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygicXVlcnlfQ09NTUFORF9JU19FTVBUWSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogUGFyc2UgdGhlIGNvbW1hbmQgYnkgc2VwYXJhdGluZyBrZXl3b3JkcyBhbmQgb3RoZXIgcGFydHMgb2YgYSBTUUwgU0VMRUNUIHF1ZXJ5IHRleHQuCisJICogCisJICogQHBhcmFtIGZvcm1hdHRlZFF1ZXJ5CisJICogICAgICAgICAgICBTUUwgU0VMRUNUIHF1ZXJ5OiBTRUxFQ1QgQ09MVU1OTkFNRSAoQVMgQUxJQVMpWyxDT0xVTU5OQU1FMiAoQVMgQUxJQVMpXSBGUk9NIFRBQkxFTkFNRQorCSAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkgd2l0aCBmaXJzdCBlbGVtZW50IHRoYXQgaG9sZHMgYWxsIHRoZSBjb21tYS1zZXBhcmF0ZWQgY29sdW1uIG5hbWVzLCB0aGUgc2Vjb25kIGVsZW1lbnQgdGhhdCBob2xkcyBhbGwgdGhlIGNvbW1hLXNlcGFyYXRlZCBjb2x1bW4gZGlzcGxheSBsYWJlbHMsIGFuZAorCSAqICAgICAgICAgdGhlIHRoaXJkIGVsZW1lbnQgZm9yIHRhYmxlIG5hbWUocykgaW4gRlJPTSBjbGF1c2UKKwkgKiBAdGhyb3dzIE9kYUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBxdWVyeSBpcyBub3QgdmFsaWQuCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBwYXJzZVByZXBhcmVkUXVlcnlUZXh0KFN0cmluZyBmb3JtYXR0ZWRRdWVyeSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgYXJyYXkgc3RvcmVzIHR3byB2YWx1ZXM6ICJTRUxFQ1QiIGtleXdvcmQgYW5kIG90aGVyIHBhcnQgb2YgYQorCQkvLyBjb21tYW5kCisJCVN0cmluZ1tdIHF1ZXJ5V2l0aG91dFNFTEVDVEtleXdvcmQgPSBmb3JtYXR0ZWRRdWVyeS5zcGxpdChDb21tb25Db25zdGFudHMuREVMSU1JVEVSX1NQQUNFLCAyKTsKKwkJaWYgKHF1ZXJ5V2l0aG91dFNFTEVDVEtleXdvcmQgPT0gbnVsbCB8fCBxdWVyeVdpdGhvdXRTRUxFQ1RLZXl3b3JkLmxlbmd0aCAhPSAyIHx8ICFxdWVyeVdpdGhvdXRTRUxFQ1RLZXl3b3JkWzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKENvbW1vbkNvbnN0YW50cy5LRVlXT1JEX1NFTEVDVCkpIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJxdWVyeV9DT01NQU5EX05PVF9WQUxJRCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJLyoKKwkJICogVGhpcyByZXR1cm5lZCBhcnJheSBzdG9yZXMgdHdvIHZhbHVlczogdGhlIGZyYWdtZW50IGltbWVkaWF0ZWx5IGFmdGVyICJTRUxFQ1QiIGFuZCBiZWZvcmUgIkZST00iLCBhbmQgdGhlIGZyYWdtZW50IGltbWVkaWF0ZSBhZnRlciB0aGUgIkZST00iIGtleXdvcmQuCisJCSAqLworCQlTdHJpbmdbXSBxdWVyeVNlbGVjdEFuZEZyb21GcmFnbWVudHMgPSBxdWVyeVdpdGhvdXRTRUxFQ1RLZXl3b3JkWzFdLnNwbGl0KENvbW1vbkNvbnN0YW50cy5ERUxJTUlURVJfU1BBQ0UgKyBDb21tb25Db25zdGFudHMuS0VZV09SRF9GUk9NICsgQ29tbW9uQ29uc3RhbnRzLkRFTElNSVRFUl9TUEFDRSk7CisJCWlmIChxdWVyeVNlbGVjdEFuZEZyb21GcmFnbWVudHMgPT0gbnVsbCB8fCBxdWVyeVNlbGVjdEFuZEZyb21GcmFnbWVudHMubGVuZ3RoICE9IDIpIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJxdWVyeV9DT01NQU5EX05PVF9WQUxJRCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1szXTsKKwkJLy8gc3RvcmUgdGhlIHRhYmxlIG5hbWUgaW4gZ2l2ZW4gbGFzdCBlbGVtZW50IGFzIHRoZSB0aGlyZCBlbGVtZW50CisJCXJlc3VsdFsyXSA9IHF1ZXJ5U2VsZWN0QW5kRnJvbUZyYWdtZW50c1sxXTsKKworCQkvLyBzcGxpdCB0aGUgY29sdW1ucyBzcGVjaWZpZWQgaW4gdGhlIFNFTEVDVCBjbGF1c2UKKwkJU3RyaW5nIHNlbGVjdGVkQ29sdW1ucyA9IHF1ZXJ5U2VsZWN0QW5kRnJvbUZyYWdtZW50c1swXTsKKwkJaWYgKCFpc1dpbGRDYXJkKHNlbGVjdGVkQ29sdW1ucykpIHsKKwkJCVN0cmluZ1tdIGNvbHVtbnMgPSBzZWxlY3RlZENvbHVtbnMuc3BsaXQoQ29tbW9uQ29uc3RhbnRzLkRFTElNSVRFUl9DT01NQSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmdbXSBjb2x1bW5OYW1lQWxpYXMgPSBjb2x1bW5zW2ldLnNwbGl0KENvbW1vbkNvbnN0YW50cy5ERUxJTUlURVJfU1BBQ0UgKyBDb21tb25Db25zdGFudHMuS0VZV09SRF9BUyArIENvbW1vbkNvbnN0YW50cy5ERUxJTUlURVJfU1BBQ0UpOworCQkJCWlmIChjb2x1bW5OYW1lQWxpYXMgIT0gbnVsbCkgeworCQkJCQkvLyBhcHBlbmQgY29sdW1uIG5hbWUgdG8gY29tbWEtc2VwYXJhdGVkIGNvbHVtbiBuYW1lcyBpbgorCQkJCQkvLyByZXN1bHRbMF0KKwkJCQkJcmVzdWx0WzBdID0gKGkgPT0gMCA/IGNvbHVtbk5hbWVBbGlhc1swXSA6IHJlc3VsdFswXSArIENvbW1vbkNvbnN0YW50cy5ERUxJTUlURVJfQ09NTUEgKyBjb2x1bW5OYW1lQWxpYXNbMF0udHJpbSgpKTsKKworCQkJCQkvLyBhcHBlbmQgY29sdW1uIGFsaWFzLCBpZiBleGlzdHMsIG9yIG51bGwgdG8KKwkJCQkJLy8gY29tbWEtc2VwYXJhdGVkIGNvbHVtbiBhbGlhc2VzIGluIHJlc3VsdFsxXQorCQkJCQlpZiAoY29sdW1uTmFtZUFsaWFzLmxlbmd0aCA9PSAyKSB7CisJCQkJCQlyZXN1bHRbMV0gPSAoaSA9PSAwID8gY29sdW1uTmFtZUFsaWFzWzFdIDogcmVzdWx0WzFdICsgQ29tbW9uQ29uc3RhbnRzLkRFTElNSVRFUl9DT01NQSArIGNvbHVtbk5hbWVBbGlhc1sxXS50cmltKCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVzdWx0WzFdID0gKGkgPT0gMCA/IG51bGwgOiByZXN1bHRbMV0gKyBDb21tb25Db25zdGFudHMuREVMSU1JVEVSX0NPTU1BICsgbnVsbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXN1bHRbMF0gPSBDb21tb25Db25zdGFudHMuS0VZV09SRF9BU1RFUklTSzsKKwkJCXJlc3VsdFsxXSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY0NOCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc1dpbGRDYXJkKFN0cmluZyBjQ04pIHsKKwkJaWYgKGNDTi5lcXVhbHNJZ25vcmVDYXNlKENvbW1vbkNvbnN0YW50cy5LRVlXT1JEX0FTVEVSSVNLKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0UXVlcnlUZXh0KFN0cmluZyBxdWVyeVRleHQpIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpbnQgZGVsaW1pdGVySW5kZXggPSAtMTsKKwkJaW50IGNvbHVtbnNJbmZvQmVnaW5JbmRleCA9IC0xOworCisJCVN0cmluZyB0cmltbWVkUXVlcnlUZXh0ID0gcXVlcnlUZXh0LnRyaW0oKTsKKworCQlTdHJpbmdbXSBzcGxpdHRlZFF1ZXJ5VGV4dCA9IHsgIiIsICIiIH07CisJCWJvb2xlYW4gaW5RdW90ZSA9IGZhbHNlOworCQlib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOworCQljaGFyW10gY2hhcnMgPSB0cmltbWVkUXVlcnlUZXh0LnRvQ2hhckFycmF5KCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGNoYXJzW2ldID09ICciJykgeworCQkJCWlmICghaXNFc2NhcGVkKSB7CisJCQkJCWluUXVvdGUgPSAhaW5RdW90ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpc0VzY2FwZWQgPSAhaXNFc2NhcGVkOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hhcnNbaV0gPT0gJ1xcJykgeworCQkJCWlzRXNjYXBlZCA9ICFpc0VzY2FwZWQ7CisJCQl9IGVsc2UgaWYgKCghaW5RdW90ZSkgJiYgY2hhcnNbaV0gPT0gUVVFUllfVEVYVF9ERUxJTUlURVIpIHsKKwkJCQlkZWxpbWl0ZXJJbmRleCA9IGk7CisJCQl9IGVsc2UgaWYgKCghaW5RdW90ZSkgJiYgY2hhcnNbaV0gPT0gQ09MVU1OU0lORk9fQkVHSU5fREVMSU1JVEVSKSB7CisJCQkJY29sdW1uc0luZm9CZWdpbkluZGV4ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpblF1b3RlKSB7CisJCQl0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygicXVlcnlfdGV4dF9lcnJvciIpKTsKKwkJfQorCisJCWlmIChkZWxpbWl0ZXJJbmRleCAhPSAtMSAmJiBjb2x1bW5zSW5mb0JlZ2luSW5kZXggIT0gLTEpIHsKKwkJCXNwbGl0dGVkUXVlcnlUZXh0WzBdID0gdHJpbW1lZFF1ZXJ5VGV4dC5zdWJzdHJpbmcoMCwgZGVsaW1pdGVySW5kZXgpLnRyaW0oKTsKKwkJCXNwbGl0dGVkUXVlcnlUZXh0WzFdID0gdHJpbW1lZFF1ZXJ5VGV4dC5zdWJzdHJpbmcoY29sdW1uc0luZm9CZWdpbkluZGV4ICsgMSwgdHJpbW1lZFF1ZXJ5VGV4dC5sZW5ndGgoKSAtIDEpLnRyaW0oKTsKKwkJfSBlbHNlIGlmIChkZWxpbWl0ZXJJbmRleCA9PSAtMSAmJiBjb2x1bW5zSW5mb0JlZ2luSW5kZXggPT0gLTEpIHsKKwkJCXNwbGl0dGVkUXVlcnlUZXh0WzBdID0gdHJpbW1lZFF1ZXJ5VGV4dDsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJxdWVyeV90ZXh0X2Vycm9yIikpOworCQl9CisJCXJldHVybiBzcGxpdHRlZFF1ZXJ5VGV4dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCb29sZWFuKFN0cmluZyBhcmcwLCBib29sZWFuIGFyZzEpIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJfQorCisJcHVibGljIHZvaWQgc2V0Qm9vbGVhbihpbnQgYXJnMCwgYm9vbGVhbiBhcmcxKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCX0KKworCXB1YmxpYyB2b2lkIHNldE51bGwoU3RyaW5nIGFyZzApIHRocm93cyBPZGFFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJfQorCisJcHVibGljIHZvaWQgc2V0TnVsbChpbnQgYXJnMCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjYW5jZWwoKSB0aHJvd3MgT2RhRXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEVmZmVjdGl2ZVF1ZXJ5VGV4dCgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVlcnlTcGVjaWZpY2F0aW9uIGdldFNwZWNpZmljYXRpb24oKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T2JqZWN0KFN0cmluZyBhcmcwLCBPYmplY3QgYXJnMSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3QoaW50IGFyZzAsIE9iamVjdCBhcmcxKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb24oUXVlcnlTcGVjaWZpY2F0aW9uIGFyZzApIHRocm93cyBPZGFFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvb2RhL2RhdGFtYXJ0L2ltcGwvUmVzdWx0U2V0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL1Jlc3VsdFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTkyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL1Jlc3VsdFNldC5qYXZhCkBAIC0wLDAgKzEsMzk1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5pbXBsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmRhdGEuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSUJsb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSUNsb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuT2RhRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQuY29tbW9uLm9sYXAuRGVyaXZlZENlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5DZWxsMmRUYWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC5pMThuLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQudGFibGUuY29tbW9uLkNlbGxTZXRJbmRleGVkQ29udGFpbmVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElSZXN1bHRTZXQgZm9yIGFuIE9EQSBydW50aW1lIGRyaXZlci4KKyAqIDxicj4KKyAqIEZvciBkZW1vIHB1cnBvc2UsIHRoZSBhdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YnMgaGF2ZQorICogaGFyZC1jb2RlZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgYSBwcmUtZGVmaW5lZCBzZXQKKyAqIG9mIG1ldGEtZGF0YSBhbmQgcXVlcnkgcmVzdWx0cy4KKyAqIEEgY3VzdG9tIE9EQSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG93biBkYXRhIHNvdXJjZSBzcGVjaWZpYworICogYmVoYXZpb3IgaW4gaXRzIHBsYWNlLiAKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdFNldCBpbXBsZW1lbnRzIElSZXN1bHRTZXQgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1JPV1MgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfSU5JVElBTF9WQUxVRSA9IC0xOworICAgIHByaXZhdGUgQ2VsbDJkVGFibGUgZkNlbGxUYWJsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBDZWxsU2V0SW5kZXhlZENvbnRhaW5lciBmRm9ybWF0dGVkVGFibGUgPSBudWxsOworICAgIHByaXZhdGUgSVJlc3VsdFNldE1ldGFEYXRhIGZSZXN1bHRTZXRNZXRhRGF0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgZk1heFJvd3MgPSAwOyAvL25vIGxpbWl0CisgICAgcHJpdmF0ZSBpbnQgZkN1cnNvciA9IENVUlNPUl9JTklUSUFMX1ZBTFVFOworICAgIC8vQm9vbGVhbiB3aGljaCBtYXJrcyB3aGV0aGVyIGl0IGlzIHN1Y2Nlc3NmdWwgb2YgbGFzdCBjYWxsIHRvIGdldFhYWCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBmV2FzTnVsbCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBNYXA8SW50ZWdlcixJbnRlZ2VyPiBmTWFwQ2VsbFRhYmxlVG9SZXN1bHRTZXQ7CisgICAgcHJpdmF0ZSBNYXA8SW50ZWdlcixJbnRlZ2VyPiBmTWFwUmVzdWx0U2V0VG9DZWxsVGFibGU7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gc0RhdGEgYSB0d28tZGltZW5zaW9uIGFycmF5IHdoaWNoIGhvbGRzIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEKKyAgICAgKiAgICAgICAgICAgIGNzdiBmaWxlLgorICAgICAqIEBwYXJhbSByc21kIHRoZSBtZXRhZGF0YSBvZiBzRGF0YQorICAgICAqLworICAgIFJlc3VsdFNldCggQ2VsbDJkVGFibGUgY2VsbFRhYmxlLCBDZWxsU2V0SW5kZXhlZENvbnRhaW5lciBmb3JtYXR0ZWRUYWJsZSwgSVJlc3VsdFNldE1ldGFEYXRhIHJzbWQgKSB7CisgICAgICAgIGZDZWxsVGFibGUgPSBjZWxsVGFibGU7CisgICAgICAgIGZGb3JtYXR0ZWRUYWJsZSA9IGZvcm1hdHRlZFRhYmxlOworICAgICAgICBmUmVzdWx0U2V0TWV0YURhdGEgPSByc21kOworICAgICAgICBmTWFwQ2VsbFRhYmxlVG9SZXN1bHRTZXQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICBmTWFwUmVzdWx0U2V0VG9DZWxsVGFibGUgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICB0cnkgeworCQkJZm9yCShpbnQgcmVzdWx0U2V0SW5kZXggPSAxOyByZXN1bHRTZXRJbmRleCA8PSByc21kLmdldENvbHVtbkNvdW50KCk7IHJlc3VsdFNldEluZGV4KyspIHsKKwkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IHJzbWQuZ2V0Q29sdW1uTmFtZShyZXN1bHRTZXRJbmRleCkudG9Mb3dlckNhc2UoKTsKKwkJCQlpbnQgY2VsbFRhYmxlSW5kZXggPSBjZWxsVGFibGUuZ2V0SGVhZGVySW5kZXgoY29sdW1uTmFtZSk7CisJCQkJZk1hcENlbGxUYWJsZVRvUmVzdWx0U2V0LnB1dChjZWxsVGFibGVJbmRleCwgcmVzdWx0U2V0SW5kZXgpOworCQkJCWZNYXBSZXN1bHRTZXRUb0NlbGxUYWJsZS5wdXQocmVzdWx0U2V0SW5kZXgsIGNlbGxUYWJsZUluZGV4KTsKKy8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicmVzdWx0U2V0OiIrcmVzdWx0U2V0SW5kZXgrIiBjZWxsVGFibGU6IitjZWxsVGFibGVJbmRleCsiIENvbHVtbjoiK2NvbHVtbk5hbWUrIiBUeXBlOiIrcnNtZC5nZXRDb2x1bW5UeXBlTmFtZShyZXN1bHRTZXRJbmRleCkrIj0iK3JzbWQuZ2V0Q29sdW1uVHlwZShyZXN1bHRTZXRJbmRleCkpOworCQkJfQorCQl9IGNhdGNoIChPZGFFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorICAgIH0KKyAgICAKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRNZXRhRGF0YSgpCisJICovCisJcHVibGljIElSZXN1bHRTZXRNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICAvKiBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAqIFJlcGxhY2Ugd2l0aCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYW4gaW5zdGFuY2UgCisgICAgICAgICAqIGJhc2VkIG9uIHRoaXMgcmVzdWx0IHNldC4KKyAgICAgICAgICovCisJCXJldHVybiBmUmVzdWx0U2V0TWV0YURhdGE7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjc2V0TWF4Um93cyhpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0TWF4Um93cyggaW50IG1heCApIHRocm93cyBPZGFFeGNlcHRpb24geworCQlmTWF4Um93cyA9IG1heDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IGNhbiBiZSBmZXRjaGVkIGZyb20gdGhpcyByZXN1bHQgc2V0LgorCSAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2guCisJICovCisJcHJvdGVjdGVkIGludCBnZXRNYXhSb3dzKCkgeworCQlyZXR1cm4gZk1heFJvd3M7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjbmV4dCgpCisJICovCisJcHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICBpZiggKCBmTWF4Um93cyA8PSAwID8gZmFsc2UgOiBmQ3Vyc29yID49IGZNYXhSb3dzIC0gMSApCisgICAgICAgICAgICAgICAgfHwgZkN1cnNvciA+PSBmQ2VsbFRhYmxlLmdldFJvd0NvdW50KCkgLSAxICkgeworICAgICAgICAgICAgZkN1cnNvciA9IENVUlNPUl9JTklUSUFMX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZDdXJzb3IrKzsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIAl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNjbG9zZSgpCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgZkN1cnNvciA9IDA7CisgICAgICAgIGZDZWxsVGFibGUgPSBudWxsOworICAgICAgICBmUmVzdWx0U2V0TWV0YURhdGEgPSBudWxsOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldFJvdygpCisJICovCisJcHVibGljIGludCBnZXRSb3coKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgdmFsaWRhdGVDdXJzb3JTdGF0ZSgpOworICAgICAgICByZXR1cm4gZkN1cnNvcjsKKyAJfQorCisJLyoqCisJICogQHBhcmFtIGNlbGxUYWJsZUluZGV4CisJICogQHJldHVybiBjZWxsIGZvciB0aGUgY2VsbFRhYmxlIGluZGV4IGdpdmVuCisJICogQHRocm93cyBPZGFFeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIERlcml2ZWRDZWxsIGdldENlbGxUYWJsZUNlbGwoIGludCBjZWxsVGFibGVJbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZUN1cnNvclN0YXRlKCk7CisgICAgICAgIERlcml2ZWRDZWxsIHJlc3VsdCA9IGZDZWxsVGFibGUuZ2V0Q2VsbChjZWxsVGFibGVJbmRleCwgZkN1cnNvcik7CisgICAgICAgIGlmCShmRm9ybWF0dGVkVGFibGUgIT0gbnVsbCkgeworICAgICAgICAJcmVzdWx0ID0gbmV3IERlcml2ZWRDZWxsIChyZXN1bHQuZ2V0VmFsdWUoKSwgZkZvcm1hdHRlZFRhYmxlLmdldFN0cmluZ1ZhbHVlQnlPcmRpbmFsKGZDdXJzb3IsIGNlbGxUYWJsZUluZGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgZldhc051bGwgPSByZXN1bHQgPT0gbnVsbCA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRGVyaXZlZENlbGwgZ2V0Q2VsbCggaW50IHJlc3VsdFNldEluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCUludGVnZXIgY2VsbFRhYmxlSW5kZXggPSBmTWFwUmVzdWx0U2V0VG9DZWxsVGFibGUuZ2V0KHJlc3VsdFNldEluZGV4KTsKKwkJaWYJKGNlbGxUYWJsZUluZGV4ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oImNlbGxUYWJsZSBjb2x1bW4gIyIrcmVzdWx0U2V0SW5kZXgrIiBjb3VsZCBub3QgYmUgbWFwcGVkIHRvIHJlc3VsdFNldCBjb2x1bW4iKTsKKwkJfQorCQlyZXR1cm4gZ2V0Q2VsbFRhYmxlQ2VsbChjZWxsVGFibGVJbmRleCk7CisJfQorCisJcHVibGljIERlcml2ZWRDZWxsIGdldENlbGwoIFN0cmluZyBjb2x1bW5OYW1lICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHJldHVybiBnZXRDZWxsVGFibGVDZWxsKCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRTdHJpbmcoaW50KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCBpbnQgcmVzdWx0U2V0SW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgRGVyaXZlZENlbGwgY2VsbCA9IGdldENlbGwocmVzdWx0U2V0SW5kZXgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY2VsbCA9PSBudWxsID8gbnVsbCA6IGNlbGwuZ2V0Rm9ybWF0dGVkVmFsdWUoKTsKKyAgICAgICAgaWYJKChyZXN1bHQgIT0gbnVsbCkgJiYgcmVzdWx0LmlzRW1wdHkoKSkgeworCSAgICAgICAgc3dpdGNoIChmUmVzdWx0U2V0TWV0YURhdGEuZ2V0Q29sdW1uVHlwZShyZXN1bHRTZXRJbmRleCkpIHsKKwkgICAgCQljYXNlIERhdGFUeXBlLkRBVEVfVFlQRToKKwkgICAgICAgIAljYXNlIERhdGFUeXBlLlNRTF9EQVRFX1RZUEU6CisJICAgICAgICAJCXJlc3VsdCA9IG51bGw7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjZ2V0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoIFN0cmluZyBjb2x1bW5OYW1lICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHJldHVybiBnZXRTdHJpbmcoIGZpbmRDb2x1bW4oIGNvbHVtbk5hbWUgKSApOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldEludChpbnQpCisJICovCisJcHVibGljIGludCBnZXRJbnQoIGludCByZXN1bHRTZXRJbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KHJlc3VsdFNldEluZGV4KTsKKyAgICAgICAgdHJ5IHsKKwkgICAgICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBCaWdEZWNpbWFsID8gKChCaWdEZWNpbWFsKW9iamVjdCkuaW50VmFsdWUoKSA6CisJICAgICAgICAJICAgb2JqZWN0IGluc3RhbmNlb2YgRG91YmxlID8gKChEb3VibGUpb2JqZWN0KS5pbnRWYWx1ZSgpIDoKKwkgICAgICAgIAkgICAtMTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCS8vIEBUT0RPIGRvIGxvZyBvdXRwdXQKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldEludChqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50KCBTdHJpbmcgY29sdW1uTmFtZSApIHRocm93cyBPZGFFeGNlcHRpb24geworCSAgICByZXR1cm4gZ2V0SW50KCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXREb3VibGUoaW50KQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCBpbnQgcmVzdWx0U2V0SW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIGlmCShvYmplY3QgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgIAlyZXR1cm4gKChCaWdEZWNpbWFsKW9iamVjdCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgCXJldHVybiAoKERvdWJsZSlvYmplY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMS4wOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldERvdWJsZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCBTdHJpbmcgY29sdW1uTmFtZSApIHRocm93cyBPZGFFeGNlcHRpb24geworCSAgICByZXR1cm4gZ2V0RG91YmxlKCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRCaWdEZWNpbWFsKGludCkKKwkgKi8KKwlwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKCBpbnQgcmVzdWx0U2V0SW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIGlmCShvYmplY3QgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgIAlyZXR1cm4gKEJpZ0RlY2ltYWwpb2JqZWN0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAJcmV0dXJuIEJpZ0RlY2ltYWwudmFsdWVPZigoRG91YmxlKW9iamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjZ2V0QmlnRGVjaW1hbChqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoIFN0cmluZyBjb2x1bW5OYW1lICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHJldHVybiBnZXRCaWdEZWNpbWFsKCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXREYXRlKGludCkKKwkgKi8KKwlwdWJsaWMgRGF0ZSBnZXREYXRlKCBpbnQgcmVzdWx0U2V0SW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBUaW1lc3RhbXAgPyBuZXcgRGF0ZSgoKFRpbWVzdGFtcClvYmplY3QpLmdldFRpbWUoKSkgOiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldERhdGUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgRGF0ZSBnZXREYXRlKCBTdHJpbmcgY29sdW1uTmFtZSApIHRocm93cyBPZGFFeGNlcHRpb24geworCSAgICByZXR1cm4gZ2V0RGF0ZSggZmluZENvbHVtbiggY29sdW1uTmFtZSApICk7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjZ2V0VGltZShpbnQpCisJICovCisJcHVibGljIFRpbWUgZ2V0VGltZSggaW50IHJlc3VsdFNldEluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3QocmVzdWx0U2V0SW5kZXgpOworICAgICAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVGltZXN0YW1wID8gbmV3IFRpbWUoKChUaW1lc3RhbXApb2JqZWN0KS5nZXRUaW1lKCkpIDogbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRUaW1lKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIFRpbWUgZ2V0VGltZSggU3RyaW5nIGNvbHVtbk5hbWUgKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkgICAgcmV0dXJuIGdldFRpbWUoIGZpbmRDb2x1bW4oIGNvbHVtbk5hbWUgKSApOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldFRpbWVzdGFtcChpbnQpCisJICovCisJcHVibGljIFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoIGludCByZXN1bHRTZXRJbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KHJlc3VsdFNldEluZGV4KTsKKyAgICAgICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIFRpbWVzdGFtcCA/IChUaW1lc3RhbXApb2JqZWN0IDogbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRUaW1lc3RhbXAoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgVGltZXN0YW1wIGdldFRpbWVzdGFtcCggU3RyaW5nIGNvbHVtbk5hbWUgKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkgICAgcmV0dXJuIGdldFRpbWVzdGFtcCggZmluZENvbHVtbiggY29sdW1uTmFtZSApICk7CisJfQorCisgICAgLyogCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldEJsb2IoaW50KQorICAgICAqLworICAgIHB1YmxpYyBJQmxvYiBnZXRCbG9iKCBpbnQgcmVzdWx0U2V0SW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIGlmCShvYmplY3QgaW5zdGFuY2VvZiBJQmxvYikgeworICAgICAgICAJcmV0dXJuIChJQmxvYikgb2JqZWN0OworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSUJsb2Igbm90IHlldCBzdXBwb3J0ZWQsIG9iamVjdCBpcyBpbnN0YW5jZSBvZiAiKyhvYmplY3QgPT0gbnVsbCA/ICI8bnVsbD4iIDogb2JqZWN0LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisgICAgfQorCisgICAgLyogCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0I2dldEJsb2IoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgSUJsb2IgZ2V0QmxvYiggU3RyaW5nIGNvbHVtbk5hbWUgKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkgICAgcmV0dXJuIGdldEJsb2IoIGZpbmRDb2x1bW4oIGNvbHVtbk5hbWUgKSApOworICAgIH0KKworICAgIC8qIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRDbG9iKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSUNsb2IgZ2V0Q2xvYiggaW50IHJlc3VsdFNldEluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3QocmVzdWx0U2V0SW5kZXgpOworICAgICAgICBpZgkob2JqZWN0IGluc3RhbmNlb2YgSUNsb2IpIHsKKyAgICAgICAgCXJldHVybiAoSUNsb2IpIG9iamVjdDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIklDbG9iIG5vdCB5ZXQgc3VwcG9ydGVkLCBvYmplY3QgaXMgaW5zdGFuY2Ugb2YgIisob2JqZWN0ID09IG51bGwgPyAiPG51bGw+IiA6IG9iamVjdC5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgIH0KKworICAgIC8qIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCNnZXRDbG9iKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIElDbG9iIGdldENsb2IoIFN0cmluZyBjb2x1bW5OYW1lICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHJldHVybiBnZXRDbG9iKCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldCN3YXNOdWxsKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3YXNOdWxsKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmV2FzTnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXQjZmluZENvbHVtbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEByZXR1cm4gPGI+cmVzdWx0U2V0IGNvbHVtbiBpbmRleDwvYj4gPGk+PHU+bm90PC91PiB0aGUgY2VsbFRhYmxlIGNvbHVtbiBpbmRleDwvaT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbmRDb2x1bW4oIFN0cmluZyBjb2x1bW5OYW1lICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0cmltbWVkQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWUudHJpbSgpOworICAgICAgICBpbnQgY29sdW1uQ291bnQgPSBnZXRNZXRhRGF0YSgpLmdldENvbHVtbkNvdW50KCk7CisgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDw9IGNvbHVtbkNvdW50OyBpKysgKSB7CisgICAgICAgICAgICBpZiggdHJpbW1lZENvbHVtbk5hbWUuZXF1YWxzSWdub3JlQ2FzZSgKKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5OYW1lKCBpICkgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKCBNZXNzYWdlcy5nZXRTdHJpbmcoICJyZXN1bHRTZXRfQ09MVU1OX05PVF9GT1VORCIgKSArIGNvbHVtbk5hbWUgKTsgLy8kTk9OLU5MUy0xJAorICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgd2hldGhlciB0aGUgY3Vyc29yIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBhdCBhIHZhbGlkIHJvdy4KKyAgICAgKiBAdGhyb3dzIE9kYUV4Y2VwdGlvbiBpZiB0aGUgY3Vyc29yIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUN1cnNvclN0YXRlKCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCBmQ3Vyc29yIDwgMCApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPZGFFeGNlcHRpb24oIE1lc3NhZ2VzLmdldFN0cmluZyggInJlc3VsdFNldF9DVVJTT1JfSEFTX05PVF9CRUVOX0lOSVRJQUxJWkVEIiApICk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgIH0KKworCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oaW50IHJlc3VsdFNldEluZGV4KSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIGlmCShvYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgIAlyZXR1cm4gKChCb29sZWFuKW9iamVjdCkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpb2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJICAgIHJldHVybiBnZXRCb29sZWFuKCBmaW5kQ29sdW1uKCBjb2x1bW5OYW1lICkgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChpbnQgcmVzdWx0U2V0SW5kZXgpIHRocm93cyBPZGFFeGNlcHRpb24geworICAgICAgICBEZXJpdmVkQ2VsbCBjZWxsID0gZ2V0Q2VsbChyZXN1bHRTZXRJbmRleCk7CisgICAgICAgIHJldHVybiBjZWxsID09IG51bGwgPyBudWxsIDogY2VsbC5nZXRWYWx1ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkgICAgcmV0dXJuIGdldE9iamVjdCggZmluZENvbHVtbiggY29sdW1uTmFtZSApICk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9SZXN1bHRTZXRNZXRhRGF0YS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9vZGEvZGF0YW1hcnQvaW1wbC9SZXN1bHRTZXRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmZmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL29kYS9kYXRhbWFydC9pbXBsL1Jlc3VsdFNldE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wub2RhLmRhdGFtYXJ0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5PZGFFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQuRVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkRhdGFUeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5vZGEuZGF0YW1hcnQuaTE4bi5NZXNzYWdlczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiBJUmVzdWx0U2V0TWV0YURhdGEgZm9yIGFuIE9EQSBydW50aW1lIGRyaXZlci4KKyAqIDxicj4KKyAqIEZvciBkZW1vIHB1cnBvc2UsIHRoZSBhdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YnMgaGF2ZQorICogaGFyZC1jb2RlZCBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgYSBwcmUtZGVmaW5lZCBzZXQKKyAqIG9mIG1ldGEtZGF0YSBhbmQgcXVlcnkgcmVzdWx0cy4KKyAqIEEgY3VzdG9tIE9EQSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG93biBkYXRhIHNvdXJjZSBzcGVjaWZpYworICogYmVoYXZpb3IgaW4gaXRzIHBsYWNlLiAKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdFNldE1ldGFEYXRhIGltcGxlbWVudHMgSVJlc3VsdFNldE1ldGFEYXRhIHsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0gbnVsbDsKKyAgICBwcml2YXRlIERhdGFUeXBlc1tdIGNvbHVtblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtbkxhYmVscyA9IG51bGw7CisKKyAgICBSZXN1bHRTZXRNZXRhRGF0YSggU3RyaW5nW10gY29sTmFtZXMsIERhdGFUeXBlc1tdIGNvbFR5cGVzLCBTdHJpbmdbXSBjb2xMYWJlbHMgKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIGNvbE5hbWVzID09IG51bGwgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKCBNZXNzYWdlcy5nZXRTdHJpbmcoICJjb21tb25fQVJHVU1FTlRfQ0FOTk9UX0JFX05VTEwiICkgKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBjb2xOYW1lczsKKyAgICAgICAgdGhpcy5jb2x1bW5UeXBlcyA9IGNvbFR5cGVzOworICAgICAgICBpZgkoY29sTGFiZWxzID09IG51bGwpIHsKKyAgICAgICAgCXRoaXMuY29sdW1uTGFiZWxzID0gY29sTmFtZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIAl0aGlzLmNvbHVtbkxhYmVscyA9IGNvbExhYmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBSZXN1bHRTZXRNZXRhRGF0YSggSGFzaE1hcDxTdHJpbmcsIEVUeXBlPiB0eXBlc01hcCkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWNvbHVtbk5hbWVzID0gdHlwZXNNYXAua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsgCisJCWZvcihpbnQgaWR4PTA7IGlkeDxjb2x1bW5OYW1lcy5sZW5ndGg7IGlkeCsrKSB7CisJCQljb2x1bW5OYW1lc1tpZHhdID0gY29sdW1uTmFtZXNbaWR4XS5zcGxpdCgiXFwuIilbMV07CisJCX0KKwkJY29sdW1uTGFiZWxzID0gdHlwZXNNYXAua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsgCisJCWZvcihpbnQgaWR4PTA7IGlkeDxjb2x1bW5MYWJlbHMubGVuZ3RoOyBpZHgrKykgeworCQkJY29sdW1uTGFiZWxzW2lkeF0gPSBjb2x1bW5MYWJlbHNbaWR4XS5zcGxpdCgiXFwuIilbMV07CisJCX0KKwkJY29sdW1uVHlwZXMgPSBuZXcgRGF0YVR5cGVzW3R5cGVzTWFwLmtleVNldCgpLnNpemUoKV07CisJCWludCBpZHggPSAwOworCQlmb3IoU3RyaW5nIGtleSA6IHR5cGVzTWFwLmtleVNldCgpKSB7CisJCQljb2x1bW5UeXBlc1tpZHgrK10gPSBEYXRhVHlwZXMudHlwZUZvcih0eXBlc01hcC5nZXQoa2V5KSk7CisJCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5UeXBlcyhEYXRhVHlwZXNbXSBjb2xUeXBlcykgeworICAgICAgICB0aGlzLmNvbHVtblR5cGVzID0gY29sVHlwZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkxhYmxlcyhTdHJpbmdbXSBjb2xMYWJlbHMpIHsKKyAgICAgICAgdGhpcy5jb2x1bW5MYWJlbHMgPSBjb2xMYWJlbHM7CisgICAgfQorICAgIAorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKyAJCXJldHVybiB0aGlzLmNvbHVtbk5hbWVzLmxlbmd0aDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldE1ldGFEYXRhI2dldENvbHVtbk5hbWUoaW50KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSggaW50IGluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWlmICggaW5kZXggPiBnZXRDb2x1bW5Db3VudCggKSB8fCBpbmRleCA8IDEgKSB7CisJCQl0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSIlcy5nZXRDb2x1bW5OYW1lKCVkKTpcbi0gSW5kZXggJWQgaXMgb3V0IG9mIHJhbmdlIG9mIGF2YWlsYWJsZSBjb2x1bW4gaW5kaWNlcyAlZC0lZCIsCisJCQkJZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksCisJCQkJaW5kZXgsCisJCQkJaW5kZXgsCisJCQkJMSwKKwkJCQlnZXRDb2x1bW5Db3VudCgpCisJCQkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiB0aGlzLmNvbHVtbk5hbWVzW2luZGV4IC0gMV0udHJpbSggKTsKKyAJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXRNZXRhRGF0YSNnZXRDb2x1bW5MYWJlbChpbnQpCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5MYWJlbCggaW50IGluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWlmCShjb2x1bW5MYWJlbHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldENvbHVtbk5hbWUoIGluZGV4ICk7CQkvLyBkZWZhdWx0CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoIGluZGV4ID4gZ2V0Q29sdW1uQ291bnQoICkgfHwgaW5kZXggPCAxICkgeworCQkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJCSIlcy5nZXRDb2x1bW5MYWJlbCglZCk6XG4tIEluZGV4ICVkIGlzIG91dCBvZiByYW5nZSBvZiBhdmFpbGFibGUgY29sdW1uIGluZGljZXMgJWQtJWQiLAorCQkJCQlnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwKKwkJCQkJaW5kZXgsCisJCQkJCWluZGV4LAorCQkJCQkxLAorCQkJCQlnZXRDb2x1bW5Db3VudCgpCisJCQkJKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiB0aGlzLmNvbHVtbkxhYmVsc1tpbmRleCAtIDFdLnRyaW0oICk7CisJCX0KKwl9CisKKwlwdWJsaWMgRGF0YVR5cGVzIGdldENvbHVtbkRhdGFUeXBlKCBpbnQgaW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJaWYgKCBpbmRleCA+IGdldENvbHVtbkNvdW50KCApIHx8IGluZGV4IDwgMSApIHsKKwkJCXRocm93IG5ldyBPZGFFeGNlcHRpb24oIFN0cmluZy5mb3JtYXQoCisJCQkJIiVzLmdldENvbHVtbkRhdGFUeXBlKCVkKTpcbi0gSW5kZXggJWQgaXMgb3V0IG9mIHJhbmdlIG9mIGF2YWlsYWJsZSBjb2x1bW4gaW5kaWNlcyAlZC0lZCIsCisJCQkJZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksCisJCQkJaW5kZXgsCisJCQkJaW5kZXgsCisJCQkJMSwKKwkJCQlnZXRDb2x1bW5Db3VudCgpCisJCQkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBjb2x1bW5UeXBlc1tpbmRleC0xXTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuSVJlc3VsdFNldE1ldGFEYXRhI2dldENvbHVtblR5cGUoaW50KQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q29sdW1uVHlwZSggaW50IGluZGV4ICkgdGhyb3dzIE9kYUV4Y2VwdGlvbiB7CisJCWlmICggaW5kZXggPiBnZXRDb2x1bW5Db3VudCggKSB8fCBpbmRleCA8IDEgKSB7CisJCQl0aHJvdyBuZXcgT2RhRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJCSIlcy5nZXRDb2x1bW5UeXBlKCVkKTpcbi0gSW5kZXggJWQgaXMgb3V0IG9mIHJhbmdlIG9mIGF2YWlsYWJsZSBjb2x1bW4gaW5kaWNlcyAlZC0lZCIsCisJCQkJZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksCisJCQkJaW5kZXgsCisJCQkJaW5kZXgsCisJCQkJMSwKKwkJCQlnZXRDb2x1bW5Db3VudCgpCisJCQkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBjb2x1bW5UeXBlc1tpbmRleC0xXS5nZXRCaXJ0RGF0YVR5cGVJZCgpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uVHlwZU5hbWUoaW50KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVHlwZU5hbWUoIGludCBpbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworCQlpZiAoIGluZGV4ID4gZ2V0Q29sdW1uQ291bnQoICkgfHwgaW5kZXggPCAxICkgeworCQkJdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiJXMuZ2V0Q29sdW1uVHlwZU5hbWUoJWQpOlxuLSBJbmRleCAlZCBpcyBvdXQgb2YgcmFuZ2Ugb2YgYXZhaWxhYmxlIGNvbHVtbiBpbmRpY2VzICVkLSVkIiwKKwkJCQlnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwKKwkJCQlpbmRleCwKKwkJCQlpbmRleCwKKwkJCQkxLAorCQkJCWdldENvbHVtbkNvdW50KCkKKwkJCSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBEcml2ZXIuZ2V0TmF0aXZlRGF0YVR5cGVOYW1lKGNvbHVtblR5cGVzW2luZGV4LTFdLmdldE5hdGl2ZU9kYURhdGFUeXBlSWQoKSk7CisJCX0KKwkJY2F0Y2ggKE9kYUV4Y2VwdGlvbiBvZSkgeworCQkJdGhyb3cgbmV3IE9kYUV4Y2VwdGlvbiggU3RyaW5nLmZvcm1hdCgKKwkJCQkiJXMuZ2V0Q29sdW1uVHlwZU5hbWUoJWQpOlxuLSBpbnRlcm5hbCBleGNlcHRpb24gb24gaW5kZXggJWQ6IGxhYmVsPSclcycgLyBuYW1lPSclcycgLyAlcz0nJXMnXG4tIGNhdXNlZCBieTpcbi0gJXMiLAorCQkJCWdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLAorCQkJCWluZGV4LAorCQkJCWluZGV4LAorCQkJCWNvbHVtbkxhYmVsc1tpbmRleC0xXSwKKwkJCQljb2x1bW5OYW1lc1tpbmRleC0xXSwKKwkJCQljb2x1bW5UeXBlc1tpbmRleC0xXS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwKKwkJCQljb2x1bW5UeXBlc1tpbmRleC0xXS50b1N0cmluZygpLAorCQkJCW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKQorCQkJKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGEjZ2V0Q29sdW1uRGlzcGxheUxlbmd0aChpbnQpCisJICovCisJcHVibGljIGludCBnZXRDb2x1bW5EaXNwbGF5TGVuZ3RoKCBpbnQgaW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCBTdHJpbmcuZm9ybWF0KAorCQkJIiVzLmdldENvbHVtbkRpc3BsYXlMZW5ndGgoJWQpOlxuLSBNZXRob2QgaXMgdW5zdXBwb3J0ZWQhIiwKKwkJCWdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLAorCQkJaW5kZXgKKwkJKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXRNZXRhRGF0YSNnZXRQcmVjaXNpb24oaW50KQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKCBpbnQgaW5kZXggKSB0aHJvd3MgT2RhRXhjZXB0aW9uIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5JUmVzdWx0U2V0TWV0YURhdGEjZ2V0U2NhbGUoaW50KQorCSAqLworCXB1YmxpYyBpbnQgZ2V0U2NhbGUoIGludCBpbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLklSZXN1bHRTZXRNZXRhRGF0YSNpc051bGxhYmxlKGludCkKKwkgKi8KKwlwdWJsaWMgaW50IGlzTnVsbGFibGUoIGludCBpbmRleCApIHRocm93cyBPZGFFeGNlcHRpb24geworCQlyZXR1cm4gSVJlc3VsdFNldE1ldGFEYXRhLmNvbHVtbk51bGxhYmxlVW5rbm93bjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmUyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy8ucHJvamVjdApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0czwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2U0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI2IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cworQnVuZGxlLVZlbmRvcjogRWNsaXBzZSBPU0JQCitCdW5kbGUtVmVyc2lvbjogMC45LjAucXVhbGlmaWVyCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NDtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5hcGFjaGUubG9nNGosCisgb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSI0LjExLjAiLAorIG9yZy5vYmplY3R3ZWIuYXNtO2J1bmRsZS12ZXJzaW9uPSJbNS4wLjEsNi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBjb20uZ29vZ2xlLmluamVjdDtidW5kbGUtdmVyc2lvbj0iMy4wLjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC52YWxpZGF0aW9uLAorIGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMsCisgb3JnLmhhbWNyZXN0LmNvcmUsCisgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSI0LjUuMCIsCisgb3JnLmp1bml0LnJ1bm5lci5tYW5pcHVsYXRpb247dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVyczt2ZXJzaW9uPSI0LjUuMCIsCisgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWw7dmVyc2lvbj0iNC41LjAiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7dmVyc2lvbj0iMC45LjAiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2Fib3V0LmluaSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2Fib3V0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvYWJvdXQuaW5pCkBAIC0wLDAgKzEsMTcgQEAKKyMgYWJvdXQuaW5pCisjIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcworIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCisjIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKK2Fib3V0VGV4dD0lZmVhdHVyZVRleHQKKworIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQorZmVhdHVyZUltYWdlPQorCisjIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKK2FwcE5hbWU9JWZlYXR1cmVOYW1lCisKKyMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQord2VsY29tZVBhZ2U9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9hYm91dC5tYXBwaW5ncyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9hYm91dC5tYXBwaW5ncwpAQCAtMCwwICsxLDYgQEAKKyMgYWJvdXQubWFwcGluZ3MKKyMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworMD1xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTVjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIworCisjIE5MU19NRVNTQUdFRk9STUFUX1ZBUgorCitmZWF0dXJlTmFtZT1vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cworCisjIyMjIyMjIyMjIyMjIyMjIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmVhdHVyZVRleHQ9XAorQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIFxuXAorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK1xuXAorQ29udHJpYnV0b3JzOlxuXAorICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxuCisjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGRlODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIgQEAKK3NvdXJjZS4uID0gc3JjLyxcCisgICAgICAgICAgc3JjLWdlbi8sXAorICAgICAgICAgIHh0ZW5kLWdlbi8KK2Jpbi5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKKyAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKKyAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5OGFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy5sYXVuY2ggYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4MzFkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzLmxhdW5jaApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sYXVuY2hjb25maWciPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Cis8bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMiLz4KKzwvbGlzdEF0dHJpYnV0ZT4KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgorPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgorPC9saXN0QXR0cmlidXRlPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSI9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0NCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UubTJlLmxhdW5jaGNvbmZpZy5jbGFzc3BhdGhQcm92aWRlciIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UubTJlLmxhdW5jaGNvbmZpZy5zb3VyY2VwYXRoUHJvdmlkZXIiLz4KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODg5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9wb20ueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0czwvYXJ0aWZhY3RJZD4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy1nZW48L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKyAgICA8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEluamVjdG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDkxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEluamVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuR2xvYmFsUmVnaXN0cmllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuR2xvYmFsUmVnaXN0cmllcy5HbG9iYWxTdGF0ZU1lbWVudG87CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0LklJbmplY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JUmVnaXN0cnlDb25maWd1cmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworcHVibGljIGNsYXNzIFJlcG9ydERTTEluamVjdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5qZWN0b3JQcm92aWRlciwgSVJlZ2lzdHJ5Q29uZmlndXJhdG9yIHsKKwkKKyAgICBwcm90ZWN0ZWQgR2xvYmFsU3RhdGVNZW1lbnRvIHN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbjsKKwlwcm90ZWN0ZWQgR2xvYmFsU3RhdGVNZW1lbnRvIHN0YXRlQWZ0ZXJJbmplY3RvckNyZWF0aW9uOworCXByb3RlY3RlZCBJbmplY3RvciBpbmplY3RvcjsKKworCXN0YXRpYyB7CisJCUdsb2JhbFJlZ2lzdHJpZXMuaW5pdGlhbGl6ZURlZmF1bHRzKCk7CisJfQorCisJcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKCkKKwl7CisJCWlmIChpbmplY3RvciA9PSBudWxsKSB7CisJCQlzdGF0ZUJlZm9yZUluamVjdG9yQ3JlYXRpb24gPSBHbG9iYWxSZWdpc3RyaWVzLm1ha2VDb3B5T2ZHbG9iYWxTdGF0ZSgpOworCQkJdGhpcy5pbmplY3RvciA9IGludGVybmFsQ3JlYXRlSW5qZWN0b3IoKTsKKwkJCXN0YXRlQWZ0ZXJJbmplY3RvckNyZWF0aW9uID0gR2xvYmFsUmVnaXN0cmllcy5tYWtlQ29weU9mR2xvYmFsU3RhdGUoKTsKKwkJfQorCQlyZXR1cm4gaW5qZWN0b3I7CisJfQorCQorCXByb3RlY3RlZCBJbmplY3RvciBpbnRlcm5hbENyZWF0ZUluamVjdG9yKCkgeworCSAgICByZXR1cm4gbmV3IFJlcG9ydERTTFN0YW5kYWxvbmVTZXR1cCgpLmNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXN0b3JlUmVnaXN0cnkoKSB7CisJCXN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbi5yZXN0b3JlR2xvYmFsU3RhdGUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXR1cFJlZ2lzdHJ5KCkgeworCQlnZXRJbmplY3RvcigpOworCQlzdGF0ZUFmdGVySW5qZWN0b3JDcmVhdGlvbi5yZXN0b3JlR2xvYmFsU3RhdGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTFVpSW5qZWN0b3JQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xVaUluamVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQzZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xVaUluamVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuSUluamVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworcHVibGljIGNsYXNzIFJlcG9ydERTTFVpSW5qZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIElJbmplY3RvclByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5pbnRlcm5hbC5SZXBvcnREU0xBY3RpdmF0b3IuZ2V0SW5zdGFuY2UoKS5nZXRJbmplY3Rvcigib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI0ZmNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvLnByb2plY3QKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLnNvbmFybGludC5lY2xpcHNlLmNvcmUuc29uYXJsaW50QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTYxIEBACitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorCitUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KK09SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKK2kpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCitpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCit3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KK0EgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQorYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCittb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90CitkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgoraXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKK2FuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uCisKK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCithZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKK2FwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCitjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KK2Fzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKK2Jhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCitkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bworZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKworMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKK2kpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCit3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55CitvdGhlciBwYXJ0eTsgYW5kCisKK2l2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKK2luIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgorCithKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCisKK0NvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KKworRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKK290aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAorcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQorIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCit0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcworcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCitVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgorZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKK3dpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCitwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKK1JlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKK25vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKKyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50CitpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAorbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKK3JpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQorbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KKworVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKK29mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQorb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M0Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw1NiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorUmVxdWlyZS1CdW5kbGU6IG9yZy5zbGY0ai5hcGk7YnVuZGxlLXZlcnNpb249IjEuNy4yIiwKKyBvcmcuYXBhY2hlLmxvZzRqLAorIGphdmF4LmFubm90YXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIGNvbS5nb29nbGUuaW5qZWN0O2J1bmRsZS12ZXJzaW9uPSIzLjAuMCIsCisgb3JnLmVjbGlwc2UudWksCisgb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iMy41LjAiLAorIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iMy41LjAiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQ7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXI7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmFudGxyLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAorIG9yZy5lY2xpcHNlLnh0ZW5kLAorIG9yZy5lY2xpcHNlLnhwYW5kLAorIG9yZy5lY2xpcHNlLmNvbXBhcmUsCisgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLAorIG9yZy5lY2xpcHNlLm9zYnAuZWN2aWV3LmRzbC51aTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAorIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSIzLjYuMTAwIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnByZWZlcmVuY2VzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC51dGlscztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHMudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC50YWJsZS51aTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkubGFiZWxpbmc7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLm91dGxpbmU7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnF1aWNrZml4O3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuaW50ZXJuYWwuUmVwb3J0RFNMQWN0aXZhdG9yCitJbXBvcnQtUGFja2FnZTogamF2YXguaW5qZWN0LAorIGphdmF4LnZhbGlkYXRpb24sCisgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cywKKyBvcmcuYXBhY2hlLmNvbW1vbnMuaW8sCisgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczO3ZlcnNpb249IjMuMS4wIiwKKyBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS42LjAiLAorIG9yZy5hcGFjaGUubG9nNGoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvYWJvdXQuaW5pIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvYWJvdXQuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjY3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2Fib3V0Lm1hcHBpbmdzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvYWJvdXQubWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2Fib3V0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExMDIyNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpCisKKyMjIyMjIyMjIyMjIyMjIyMgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmZWF0dXJlVGV4dD1cCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCitDb250cmlidXRvcnM6XG5cCisgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KKyMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0NjdmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICBzcmMtZ2VuLyxcCisgICAgICAgICAgeHRlbmQtZ2VuLworYmluLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKKyAgICAgICAgICAgICAgIGkxOG4vLFwKKyAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAorICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBpY29ucy8KK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKKyAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9lcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwyNTkgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICBib2R5IHsKKyAgICBzaXplOiA4LjVpbiAxMS4waW47CisgICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOworICAgIHRhYi1pbnRlcnZhbDogMC41aW47CisgICAgfQorICBwIHsgIAkKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgfQorICBwLmxpc3QgeworICAJbWFyZ2luLWxlZnQ6IDAuNWluOworICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOworICAgIH0KKyAgPC9zdHlsZT4KKworPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+CisKKzxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgorCis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCitBR1JFRU1FTlQuPC9wPgorCis8cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+CisKKzxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAorY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgorPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCitvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQorQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQorUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKK0NvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgorY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCithcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgorCis8cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKK3RoZSBQcm9ncmFtLjwvcD4KKworPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKK0NvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cworQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCit3aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgordGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KKworPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcworb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgorc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAorb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKK2xpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQorUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCitzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCitncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKK2FyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKK3BhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKK0NvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKK2FueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKK29yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcworZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCitleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAordG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQordGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAoraGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Cit0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KKworPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKK2Zvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgorY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcworQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKK3BhcnR5OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQorZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCityZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCitleGNoYW5nZS48L3A+CisKKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKK2NvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgorCis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAord2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CisKKzxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KKworPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCityZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKK2xpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgordGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKK3BvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCitpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCitpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCithcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKK3BhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQorYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KK29yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCitJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgorZXhwZW5zZS48L3A+CisKKzxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKK3BlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCitDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCittdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KKworPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKK1BST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKK0FOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQorT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQorcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCitkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KK3RoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCitkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgoraW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgorCis8cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAorTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKK1dJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KKworPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+CisKKzxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKK3RoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgorYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQorZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+CisKKzxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCitzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKK1JlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCitkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+CisKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0CitmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKK2FmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwordW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCitSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+CisKKzxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCitBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZworcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCitBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKK0ZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCitzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCitnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCitDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KK3JpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgordGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcworQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+CisKKzxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQordG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCit0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cworcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgorCisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pMThuL0kxOE4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDM3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pMThuL0kxOE4ucHJvcGVydGllcwpAQCAtMCwwICsxLDY2NCBAQAorIworI1RodSBBdWcgMDQgMTQ6MTU6MzIgQ0VTVCAyMDE2CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0LmF1dG90ZXh0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW0ucGFnZS1udW1iZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW0ucGFnZS1udW1iZXItdW5maWx0ZXJlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bS5wYWdlLXZhcmlhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtLnRvdGFsLXBhZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW0udG90YWwtcGFnZS11bmZpbHRlcmVkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmluYXJ5QWdncmVnYXRpb25UeXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmluYXJ5QWdncmVnYXRpb25UeXBlLmRpdmlkZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLmRpdmlkZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGUuZGFzaGVkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZS5kb3R0ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJUeXBlLmRvdWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGUuZ3Jvb3ZlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZS5pbnNldD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGUubm9uZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGUub3V0c2V0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZS5yaWRnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGUuc29saWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJUeXBlRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLmRhc2hlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLmRvdHRlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLmRvdWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLmdyb292ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLmluc2V0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZUVudW0ubm9uZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLm91dHNldD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtLnJpZGdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZUVudW0uc29saWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5Lm1vbm9zcGFjZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5LnNhbnMtc2VyaWY9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseS5zZXJpZj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bS5tb25vc3BhY2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseUVudW0uc2Fucy1zZXJpZj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bS5zZXJpZj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQXV0b1RleHQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0F1dG9UZXh0LmF1dG90ZXh0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NBdXRvVGV4dC5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQmluYXJ5QWdncmVnYXRpb25UeXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NCaW5hcnlBZ2dyZWdhdGlvblR5cGUuZGl2aWRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NCb3JkZXJTdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQnVpbGRJbkZvbnRGYW1pbHk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0NvbG9yPWNvbG9yIGRlZmluaXRpb24sIHNlZSBhdmFpbGFibGUgY29sb3IgZGVmaW5pdGlvbnMKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ29sb3IuYnktcGVyY2VudD1wZXJjZW50IHZhbHVlIHJhbmdpbmcgMCB0byAxMDAgdXNlZCB0byBkYXJrZW4gb3IgbGlnaHRlbiBhIGRlZmluZWQgY29sb3IKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ29sb3IuY29sb3I9b25lIGF2YWlsYWJsZSBjb2xvciBpbiB0aGlzIHJlcG9ydCBtb2RlbC48YnI+QSBjb2xvciBtYXkgYmUgZGVmaW5lZCBlaXRoZXIgYXM8dWw+PGxpPiJcI3JyZ2diYiIga25vd24gZnJvbSBIVE1MIHN5bnRheDwvbGk+PGxpPiIocixnLGIpIiB3aXRoIHIsZyxiIGFyZSBkZWNpbWFscyB3aXRoIHJhbmdlIDAgdG8gMjU1PC9saT48bGk+IihyLGcsYikiIHdpdGggcixnLGIgYXJlIGZsb2F0cyB3aXRoIHJhbmdlIDAuMCB0byAxLjA8L2xpPjxsaT5kYXJrZW5pbmcgYW5vdGhlciBjb2xvciBkZWZpbmVkIGJ5IGEgcGVyY2VudCB2YWx1ZSByYW5naW5nIDAgdG8gMTAwPC9saT48bGk+bGlnaHRlbmluZyBhbm90aGVyIGNvbG9yIGRlZmluZWQgYnkgYSBwZXJjZW50IHZhbHVlIHJhbmdpbmcgMCB0byAxMDA8L2xpPjxsaT50cmFuc2Zvcm1pbmcgb25lIGNvbG9yIGRlZmluZWQgdG93YXJkcyBhbm90aGVyIGNvbG9yIGRlZmluZWQgYnkgYSBwZXJjZW50IHZhbHVlIHJhbmdpbmcgMCB0byAxMDA8L2xpPjwvdWw+CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0NvbG9yLmRhcmtlbnM9ZGFya2VucyB0aGUgZ2l2ZW4gZGVmaW5lZCBjb2xvciBieSBhIHBlcmNlbnQgdmFsdWUKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ29sb3IubGlnaHRlbnM9bGlnaHRlbnMgdGhlIGdpdmVuIGRlZmluZWQgY29sb3IgYnkgYSBwZXJjZW50IHZhbHVlCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0NvbG9yLnRvd2FyZHM9YSBnaXZlbiBkZWZpbmVkIGNvbG9yLCBhbm90aGVyIGEgZ2l2ZW4gZGVmaW5lZCBjb2xvciBpcyB0cmFuc2Zvcm1lZCB0bworb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NDb2xvci50cmFuc2Zvcm1zPXRyYW5zZm9ybXMgYSBnaXZlbiBkZWZpbmVkIGNvbG9yIGJ5IGEgcGVyY2VudCB2YWx1ZSB0b3dhcmRzIGFub3RoZXIgZGVmaW5lZCBjb2xvcgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NDb2xvcnM9YWxsIGF2YWlsYWJsZSBjb2xvciBkZWZpbml0aW9ucyBpbiB0aGlzIHJlcG9ydCBtb2RlbAorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NDb2xvcnMuY29sb3JzPWFsbCBhdmFpbGFibGUgY29sb3IgZGVmaW5pdGlvbnMgaW4gdGhpcyByZXBvcnQgbW9kZWwKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ29udGFpbmVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NDdXJyZW5jeUZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ3VycmVuY3lGb3JtYXQuY3VycmVuY3k9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0N1cnJlbmN5Rm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ3VycmVuY3lGb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NDdXJyZW5jeUZvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDQ3VzdG9tRm9udEZhbWlseT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZS5kZXRhaWxmb290ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGUuZGV0YWlsaGVhZGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlLnRhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlRGV0YWlsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlRGV0YWlsLmFsbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZURldGFpbC5kZXRhaWxzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlRGV0YWlsLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlR3JvdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVHcm91cC5ieT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZUdyb3VwLmRldGFpbGZvb3Rlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZUdyb3VwLmRldGFpbGhlYWRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZUdyb3VwLmdyb3VwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlR3JvdXAuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyLmZvb3Rlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlci5oZWFkZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlci5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0YW1hcnRUYWJsZVByb3BlcnR5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlUHJvcGVydHkuaGlkZWxhYmVsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlUHJvcGVydHkuaW1hZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVQcm9wZXJ0eS5pbnRlcnZhbHM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGFtYXJ0VGFibGVQcm9wZXJ0eS5sb29rdXBzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRhbWFydFRhYmxlUHJvcGVydHkuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGVGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGVGb3JtYXQuZGF0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0ZUZvcm1hdC5yZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGVGb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRlRm9ybWF0LnVpPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRlVGltZUZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0ZVRpbWVGb3JtYXQuZGF0ZSt0aW1lPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NEYXRlVGltZUZvcm1hdC5yZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0RhdGVUaW1lRm9ybWF0LnRleHRhbGlnbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRGF0ZVRpbWVGb3JtYXQudWk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0VsZW1lbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0ZvbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0ZvbnQuYm9sZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRm9udC5leHRlbmRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NGb250LmZhbWlseT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDRm9udC5mb250PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NGb250LnNpemU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0ZvbnRGYW1pbHk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0ZvbnRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NGb250cy5mb250cz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDR3JpZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDR3JpZC5hcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDR3JpZC5ncmlkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NHcmlkQ2VsbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDR3JpZENlbGwuYXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0dyaWRDZWxsLmNlbGw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0dyaWRDZWxsLmNvbHVtbnNwYW49CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0dyaWRSb3c9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0dyaWRSb3cuYXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0dyaWRSb3cucm93PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NHcmlkUm93LnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NJbWFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDSW1hZ2UuaW1hZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0ltYWdlLnNjYWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NMYWJlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTGFiZWwubGFiZWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ0xhYmVsLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTWVkaWEubWVkaWE9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUuYWx0ZXJuYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLmJhY2tncm91bmRjb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTWVkaWFTdHlsZS5ib3JkZXItYm90dG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLmJvcmRlci1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLmJvcmRlci1yaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTWVkaWFTdHlsZS5ib3JkZXItdG9wPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLmZvbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUuZm9ybWF0dGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLm1hcmdpbi1ib3R0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUubWFyZ2luLWxlZnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUubWFyZ2luLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLm1hcmdpbi10b3A9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUubWVkaWE9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUucGFkZGluZy1ib3R0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUucGFkZGluZy1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLnBhZGRpbmctcmlnaHQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUucGFkZGluZy10b3A9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ01lZGlhU3R5bGUudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYVN0eWxlLnRleHRjb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTWVkaWFzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNZWRpYXMubWVkaWFzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGUuY29uY2F0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NOdW1iZXJGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ051bWJlckZvcm1hdC5udW1iZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ051bWJlckZvcm1hdC5yZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ051bWJlckZvcm1hdC50ZXh0YWxpZ249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ051bWJlckZvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZURldGFpbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZURldGFpbC5kZXRhaWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1BhZ2VGb290ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1BhZ2VGb290ZXIuZm9vdGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NQYWdlRm9vdGVyLmhlaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZUZvb3Rlci5zaG93T25MYXN0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NQYWdlSGVhZGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NQYWdlSGVhZGVyLmhlYWRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZUhlYWRlci5oZWlnaHQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1BhZ2VIZWFkZXIuc2hvd09uRmlyc3Q9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1BhZ2VUZW1wbGF0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZVRlbXBsYXRlLmJvdHRvbW1hcmdpbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZVRlbXBsYXRlLmxlZnRtYXJnaW49CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1BhZ2VUZW1wbGF0ZS5vcmllbnRhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZVRlbXBsYXRlLnBhZ2V0ZW1wbGF0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZVRlbXBsYXRlLnJpZ2h0bWFyZ2luPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NQYWdlVGVtcGxhdGUudG9wbWFyZ2luPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NQYWdlVGVtcGxhdGUudHlwZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUGFnZVRlbXBsYXRlcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUHVyZUFnZ3JlZ2F0aW9uVHlwZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUHVyZUFnZ3JlZ2F0aW9uVHlwZS5jb3VudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUHVyZUFnZ3JlZ2F0aW9uVHlwZS5ydW5uaW5nLWNvdW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydC5kYXRhbWFydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0LmRlc2NyaWJlZFwgYnk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydC5leHRlcm5hbENzc1VSST0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0LmZyb21cIGJ1bmRsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0Lm1lZGlhPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnQucGFnZXRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnQucmVuZGVyaW5nPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnQucmVwb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnREZXNpZ249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydERlc2lnbkZpbGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydERlc2lnbkZpbGUuZmlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0RGVzaWduVGVtcGxhdGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydERlc2lnblRlbXBsYXRlLmRlc2NyaWJlZFwgYnk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydERlc2lnblRlbXBsYXRlLnRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRJbXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydEltcG9ydC5pbXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydE1vZGVsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRQYWNrYWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRQYWNrYWdlLmV4dGVybmFsQ3NzVVJJPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRQYWNrYWdlLmZyb21cIGJ1bmRsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0UGFja2FnZS5sYXlvdXQtZGF0YT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0UGFja2FnZS5sYXlvdXRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRQYWNrYWdlLnBhY2thZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1NvbWVGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1NvbWVGb3JtYXRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTb21lRm9ybWF0cy5mb3JtYXR0ZXJzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZT1vbmUgYXZhaWxhYmxlIHN0eWxlIGluIHRoaXMgcmVwb3J0IG1vZGVsCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1N0eWxlLmFsdGVybmF0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUuYmFja2dyb3VuZGNvbG9yPWJhY2tncm91bmQgY29sb3IsIHVubGVzcyBhbm90aGVyIGJhY2tncm91bmQgY29sb3IgaXMgc2V0IHZpYSBtZWRpYQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5ib3JkZXItYm90dG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5ib3JkZXItbGVmdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUuYm9yZGVyLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5ib3JkZXItdG9wPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5leHRlbmRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5mb250PWZvbnQgZGVmaW5pdGlvbiwgdW5sZXNzIGFub3RoZXIgZm9udCBkZWZpbml0aW9uIGlzIHNldCB2aWEgbWVkaWEKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUuZm9ybWF0dGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5tYXJnaW4tYm90dG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5tYXJnaW4tbGVmdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUubWFyZ2luLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5tYXJnaW4tdG9wPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5tZWRpYT1kZWZpbmUgZGlmZmVyZW50IGF0dHJpYnV0ZXMsIHdoZW4gYSBzcGVjaWZpYyBtZWRpYSBpcyByZXF1ZXN0ZWQgaW4gYSByZXBvcnQgZGVmaW5pdGlvbgorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5wYWRkaW5nLWJvdHRvbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUucGFkZGluZy1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5wYWRkaW5nLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS5wYWRkaW5nLXRvcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGUuc3R5bGU9b25lIGF2YWlsYWJsZSBzdHlsZSBpbiB0aGlzIHJlcG9ydCBtb2RlbAorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdHlsZS50ZXh0YWxpZ249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1N0eWxlLnRleHRjb2xvcj10ZXh0IGNvbG9yLCB1bmxlc3MgYW5vdGhlciB0ZXh0IGNvbG9yIGlzIHNldCB2aWEgbWVkaWEKK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3R5bGVzPWFsbCBhdmFpbGFibGUgc3R5bGVzIGluIHRoaXMgcmVwb3J0IG1vZGVsCitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1N0eWxlcy5zdHlsZXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1N1YlN1YlRpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdWJTdWJUaXRsZS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3ViU3ViVGl0bGUuc3Vic3VidGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1N1YlRpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NTdWJUaXRsZS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDU3ViVGl0bGUuc3VidGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlQWdncmVnYXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlQWdncmVnYXRpb24uYWdncmVnYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUFnZ3JlZ2F0aW9uLm9uLWdyb3VwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUFnZ3JlZ2F0aW9uLnRpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUJhc2VBZ2dyZWdhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVCaW5hcnlBZ2dyZWdhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVCaW5hcnlBZ2dyZWdhdGlvbi5vZj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVDZWxsQ29sb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlQ2VsbENvbG9yLmNlbGxjb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVEYXRlRGF5SW50ZXJ2YWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlRGF0ZURheUludGVydmFsLmRheXNcIGluXCBwYXN0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZURhdGVEYXlMb29rdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlRGF0ZURheUxvb2t1cC5kYXlzXCBpblwgcGFzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVGb3JtYXR0ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlRm9ybWF0dGVyLmZvcm1hdHRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVJY29uPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUljb24uaWNvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVJbWFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVJbWFnZS5keW5hbWljPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUltYWdlLmhpZGVsYWJlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVJbWFnZS5wYXRoPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZUltYWdlLnJlc2l6ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVJbnRlcnZhbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVMb29rdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uLm9mPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZU51bWJlckludGVydmFsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZU51bWJlckludGVydmFsLnVwXCB0bz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVOdW1iZXJMb29rdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlTnVtYmVyTG9va3VwLm51bWJlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVQcm9wZXJ0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVQcm9wZXJ0eS5wcm9wZXJ0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVQdXJlQWdncmVnYXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlUmFuZ2VFbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZVN0cmluZ0xvb2t1cD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVTdHJpbmdMb29rdXAuc3RyaW5nPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZVRleHRDb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVUZXh0Q29sb3IudGV4dGNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZVRyZW5kPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZVRyZW5kLnRyZW5kPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUYWJsZVVuYXJ5QWdncmVnYXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RhYmxlVW5hcnlBZ2dyZWdhdGlvbi5vZj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGFibGVWYWx1ZUVsZW1lbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RleHQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RleHQuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RleHQudGV4dD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGltZUZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGltZUZvcm1hdC5yZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RpbWVGb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUaW1lRm9ybWF0LnRpbWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RpbWVGb3JtYXQudWk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1RpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NUaXRsZS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVGl0bGUudGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1VuYXJ5QWdncmVnYXRpb25UeXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVbmFyeUFnZ3JlZ2F0aW9uVHlwZS5hdmVyYWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVbmFyeUFnZ3JlZ2F0aW9uVHlwZS5tYXhpbXVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVbmFyeUFnZ3JlZ2F0aW9uVHlwZS5taW5pbXVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVbmFyeUFnZ3JlZ2F0aW9uVHlwZS5ydW5uaW5nLXN1bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVW5hcnlBZ2dyZWdhdGlvblR5cGUuc3VtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVb21vRm9ybWF0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NVb21vRm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDVW9tb0Zvcm1hdC50ZXh0YWxpZ249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1VvbW9Gb3JtYXQudWk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1VvbW9Gb3JtYXQudW9tbz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IuYnktcGVyY2VudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yLmNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IuZGFya2Vucz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yLmxpZ2h0ZW5zPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IudG93YXJkcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yLnRyYW5zZm9ybXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcnM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcnMuY29sb3JzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29udGFpbmVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdC5jdXJyZW5jeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0LnRleHRhbGlnbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0LnVpPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnkuY3VycmVuY3k9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5LmN1c3RvbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnkudW5mb3JtYXR0ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtLmN1cnJlbmN5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0uY3VzdG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0udW5mb3JtYXR0ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUuZGV0YWlsZm9vdGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZS5kZXRhaWxoZWFkZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZS50YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsLmFsbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwuZGV0YWlscz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAuYnk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAuZGV0YWlsZm9vdGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwLmRldGFpbGhlYWRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cC5ncm91cD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cC5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3Rlci5mb290ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXIuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIuaGVhZGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5LmhpZGVsYWJlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eS5pbWFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eS5pbnRlcnZhbHM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkubG9va3Vwcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0LmRhdGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXRDYXRlZ29yeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXRDYXRlZ29yeS5jdXN0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdENhdGVnb3J5RW51bS5jdXN0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0LmRhdGUrdGltZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0LnRleHRhbGlnbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0LnVpPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkuY3VzdG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bS5jdXN0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQuYm9sZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQuZXh0ZW5kcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQuZmFtaWx5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udC5mb250PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udC5zaXplPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRTdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRTdHlsZS5pdGFsaWM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGUubm9ybWFsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlLm9ibGlxdWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bS5pdGFsaWM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtLm5vcm1hbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRTdHlsZUVudW0ub2JsaXF1ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMuZm9udHM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZC5hcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWQuZ3JpZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGwuYXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbC5jZWxsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGwuY29sdW1uc3Bhbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3c9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93LmFzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdy5yb3c9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93LnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZS5pbWFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlLnNjYWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTaXplRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU2l6ZUVudW0uY2xpcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU2l6ZUVudW0uc2NhbGUtdG8taXRlbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU2l6ZUVudW0uc2l6ZS10by1pbWFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU291cmNlRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU291cmNlRW51bS5lbWJlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU291cmNlRW51bS5maWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtLnVybD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTGFiZWwubGFiZWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5MYWJlbC5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWEubWVkaWE9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZS5hbHRlcm5hdGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlLmJhY2tncm91bmRjb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUuYm9yZGVyLWJvdHRvbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUuYm9yZGVyLWxlZnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlLmJvcmRlci1yaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUuYm9yZGVyLXRvcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUuZm9udD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUuZm9ybWF0dGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZS5tYXJnaW4tYm90dG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZS5tYXJnaW4tbGVmdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUubWFyZ2luLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZS5tYXJnaW4tdG9wPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZS5tZWRpYT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUucGFkZGluZy1ib3R0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlLnBhZGRpbmctbGVmdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUucGFkZGluZy1yaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUucGFkZGluZy10b3A9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlLnRleHRhbGlnbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUudGV4dGNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzLm1lZGlhcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk11bHRpcGxlQWdncmVnYXRpb25UeXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGUuY29uY2F0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtLmNvbmNhdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdC5udW1iZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQucmVwb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0LnRleHRhbGlnbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnkuY3VzdG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnkuZml4ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeS5nZW5lcmFsLW51bWJlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5LnBlcmNlbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeS5zY2llbnRpZmljPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnkudW5mb3JtYXR0ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0uY3VzdG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLmZpeGVkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLmdlbmVyYWwtbnVtYmVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLnBlcmNlbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0uc2NpZW50aWZpYz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5RW51bS51bmZvcm1hdHRlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk9yaWVudGF0aW9uRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk9yaWVudGF0aW9uRW51bS5sYW5kc2NhcGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5PcmllbnRhdGlvbkVudW0ucG9ydHJhaXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRGV0YWlsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZURldGFpbC5kZXRhaWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3Rlci5mb290ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyLmhlaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIuc2hvd09uTGFzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyLmhlYWRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIuaGVpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlci5zaG93T25GaXJzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bS5hMz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bS5hND0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bS5hNT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bS51cy1sZWRnZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlU2l6ZUVudW0udXMtbGVnYWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlU2l6ZUVudW0udXMtbGV0dGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVNpemVFbnVtLnVzLXN1cGVyLWI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUuYm90dG9tbWFyZ2luPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlLmxlZnRtYXJnaW49CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUub3JpZW50YXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUucGFnZXRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlLnJpZ2h0bWFyZ2luPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlLnRvcG1hcmdpbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZS50eXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlLmNvdW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUHVyZUFnZ3JlZ2F0aW9uVHlwZS5ydW5uaW5nLWNvdW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlRW51bS5jb3VudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtLnJ1bm5pbmctY291bnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVuZGVyaW5nRW51bS5odG1sPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVuZGVyaW5nRW51bS5wZGY9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQuZGF0YW1hcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQuZGVzY3JpYmVkXCBieT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydC5leHRlcm5hbENzc1VSST0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydC5mcm9tXCBidW5kbGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQubWVkaWE9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQucGFnZXRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0LnJlbmRlcmluZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydC5yZXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQudG9vbGJhcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydEJ1aWxkSW5Gb250RmFtaWx5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduRmlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUuZmlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUuZGVzY3JpYmVkXCBieT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlLnRlbXBsYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0SW1wb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0SW1wb3J0LmltcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UuZXh0ZXJuYWxDc3NVUkk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlLmZyb21cIGJ1bmRsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UubGF5b3V0LWRhdGE9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlLnBhY2thZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU2lnbmVkTnVtYmVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXRzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHMuZm9ybWF0dGVycz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuYWx0ZXJuYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuYmFja2dyb3VuZGNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuYm9yZGVyLWJvdHRvbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlLmJvcmRlci1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuYm9yZGVyLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuYm9yZGVyLXRvcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlLmV4dGVuZHM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZS5mb250PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuZm9ybWF0dGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUubWFyZ2luLWJvdHRvbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlLm1hcmdpbi1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUubWFyZ2luLXJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUubWFyZ2luLXRvcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlLnBhZGRpbmctYm90dG9tPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUucGFkZGluZy1sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUucGFkZGluZy1yaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlLnBhZGRpbmctdG9wPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUuc3R5bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZS50ZXh0YWxpZ249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZS50ZXh0Y29sb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXMuc3R5bGVzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViU3ViVGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJTdWJUaXRsZS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlN1YlRpdGxlLnN1YnN1YnRpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViVGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJUaXRsZS5zdHlsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlLnN1YnRpdGxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVFJBTlNMQVRBQkxFU1RSSU5HPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24uYWdncmVnYXRlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbi5vbi1ncm91cD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24udGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJhc2VBZ2dyZWdhdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmluYXJ5QWdncmVnYXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uLm9mPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVDZWxsQ29sb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUNlbGxDb2xvci5jZWxsY29sb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsLmRheXNcIGluXCBwYXN0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5TG9va3VwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5TG9va3VwLmRheXNcIGluXCBwYXN0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUZvcm1hdHRlci5mb3JtYXR0ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb24uaWNvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlLmR5bmFtaWM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlLmhpZGVsYWJlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UucGF0aD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UucmVzaXplPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbnRlcnZhbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTG9va3VwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uLm9mPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwudXBcIHRvPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cC5udW1iZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eS5wcm9wZXJ0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVN0cmluZ0xvb2t1cD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwLnN0cmluZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVGV4dENvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUZXh0Q29sb3IudGV4dGNvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUcmVuZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVHJlbmQudHJlbmQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVVuYXJ5QWdncmVnYXRpb249CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVVuYXJ5QWdncmVnYXRpb24ub2Y9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0LnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dC50ZXh0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduLmNlbnRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbi5sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduLnJpZ2h0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW0uY2VudGVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bS5sZWZ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bS5yaWdodD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdC50aW1lPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXRDYXRlZ29yeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXRDYXRlZ29yeS5jdXN0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdENhdGVnb3J5RW51bS5jdXN0b209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaXRsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlLnN0eWxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGl0bGUudGl0bGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bS5iYWQtcmlzaW5nPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bS5nb29kLXNsb3Bpbmc9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtLnJpc2luZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRyZW5kSWNvbkVudW0uc2xvcGluZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRyZW5kSWNvbkVudW0uc3RhZ25hdGluZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGUuYXZlcmFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlLm1heGltdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZS5taW5pbXVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGUucnVubmluZy1zdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZS5zdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0uYXZlcmFnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5tYXhpbXVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLm1pbmltdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0ucnVubmluZy1zdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0uc3VtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bS5jbT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtLmVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0uZXg9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bS5pbmNoPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0ubW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bS5wYz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtLnB0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0ucHg9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbnNpZ25lZE51bWJlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vb21vRm9ybWF0LnJlcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQudGV4dGFsaWduPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW9tb0Zvcm1hdC51aT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQudW9tbz0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2FnZ3JlZ2F0ZS5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9hZ2dyZWdhdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjA5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9hZ2dyZWdhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2FwaV90b29scy5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9hcGlfdG9vbHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWIwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9hcGlfdG9vbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2F1dG90ZXh0LmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2F1dG90ZXh0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTUxNmRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvYXV0b3RleHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NhbGVuZGFyLXNtYWxsLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NhbGVuZGFyLXNtYWxsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTYyOWExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvY2FsZW5kYXItc21hbGwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NlbGwuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvY2VsbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwNWYyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NlbGwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NvbG9yLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NvbG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U1Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvY29sb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2NvbHVtbi5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9jb2x1bW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhM2RiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9jb2x1bW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2N1cnJlbmN5X2V1cm8ucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvY3VycmVuY3lfZXVyby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3YmU1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2N1cnJlbmN5X2V1cm8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RhdGV0aW1lLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RhdGV0aW1lLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFhZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZGF0ZXRpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RldGFpbC1hcmVhLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RldGFpbC1hcmVhLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRjNzliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZGV0YWlsLWFyZWEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RldGFpbHMuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZGV0YWlscy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmODBmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RldGFpbHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9jaGFydF8yLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9jaGFydF8yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY5ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZHNsX2NoYXJ0XzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9kYXRhbWFydC5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9kc2xfZGF0YW1hcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjBhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9kc2xfZGF0YW1hcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZHNsX2ltcG9ydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmZGNjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9yZXBvcnQuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZHNsX3JlcG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlZmIwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2RzbF9yZXBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2VudW1fYWx0X29iai5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9lbnVtX2FsdF9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzBkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9lbnVtX2FsdF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2Vycm9yLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2Vycm9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA0OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZXJyb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZpbmRlcl9kZXNjcmlwdG9yX29iai5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9maW5kZXJfZGVzY3JpcHRvcl9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzNjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9maW5kZXJfZGVzY3JpcHRvcl9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZvbnQuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZm9udC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzODk0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZvbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZvbnRfY29sb3IuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZm9udF9jb2xvci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxYTdlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZvbnRfY29sb3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2Zvb3Rlci5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9mb290ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmY2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9mb290ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ZvcmVncm91bmRfZmlsbF9jb2xvci5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9mb3JlZ3JvdW5kX2ZpbGxfY29sb3IucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDljMzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9mb3JlZ3JvdW5kX2ZpbGxfY29sb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2Zvcm1hdGJ1aWxkZXIuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZm9ybWF0YnVpbGRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NTkzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2Zvcm1hdGJ1aWxkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyaWRsYXlvdXRfb2JqLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyaWRsYXlvdXRfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZhM2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZ3JpZGxheW91dF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyb3VwLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZiYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvZ3JvdXAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyb3VwX2Zvb3Rlci5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9ncm91cF9mb290ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTgyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9ncm91cF9mb290ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2dyb3VwX2hlYWRlci5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9ncm91cF9oZWFkZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDllMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9ncm91cF9oZWFkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2hlYWRlci5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9oZWFkZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzBlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9oZWFkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2ltZy5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9pbWcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTRhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9pbWcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2xlbmd0aF9tZWFzdXJlLTE2eDE2LnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL2xlbmd0aF9tZWFzdXJlLTE2eDE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQ3YzVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvbGVuZ3RoX21lYXN1cmUtMTZ4MTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL21hc3Rlcl9wYWdlLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL21hc3Rlcl9wYWdlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjMwMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvbWFzdGVyX3BhZ2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL21vZGVsLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL21vZGVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZiODU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvbW9kZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhOWMyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3BhY2thZ2UuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvcGFja2FnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MDZmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3BhY2thZ2UuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3Byb3BlcnRpZXMucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvcHJvcGVydGllcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2NjBjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3Byb3BlcnRpZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3Jvdy5naWYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9yb3cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzE0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy9yb3cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3N0eWxlLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3N0eWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVlMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvc3R5bGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RlbXBsYXRlLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RlbXBsYXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTdhN2UwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvdGVtcGxhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RleHQuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvdGV4dC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkMGZlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RleHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RpbWUuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvaWNvbnMvdGltZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4OWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RpbWUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2ljb25zL3RyZW5kX3Jpc2luZy5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy90cmVuZF9yaXNpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzY4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9pY29ucy90cmVuZF9yaXNpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y0MTNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvcGx1Z2luLnhtbApAQCAtMCwwICsxLDQyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgICAgPGVkaXRvcgorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIgorICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgorICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICBleHRlbnNpb25zPSJyZXBvcnQiCisgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiCisgICAgICAgICAgICAgIGljb249Imljb25zL2RzbF9yZXBvcnQuZ2lmIgorICAgICAgICAgICAgICBuYW1lPSJPU0JQIFJlcG9ydERTTCBFZGl0b3IiPgorICAgICAgICA8L2VkaXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLk9wZW5EZWNsYXJhdGlvbiI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhhbmRsZXIuVmFsaWRhdGVBY3Rpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wudmFsaWRhdGUiPgorICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAJPC9oYW5kbGVyPgorICAgICAgCTwhLS0gY29weSBxdWFsaWZpZWQgbmFtZSAtLT4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWVIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZUhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5PdXRsaW5lQ29weVF1YWxpZmllZE5hbWUiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAJPGFuZD4KKyAgICAgICAgICAgIAkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJICAgICAgICAgICAgICAgIDxpdGVyYXRlPgorCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJPC9pdGVyYXRlPgorCQkJCTwvYW5kPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc0FjdGl2ZUVkaXRvckFuSW5zdGFuY2VPZlh0ZXh0RWRpdG9yIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgCisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9kZWZpbml0aW9uPgorICAgICAgICA8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc1h0ZXh0RWRpdG9yQWN0aXZlIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgCisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9kZWZpbml0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5wcmVmZXJlbmNlcy5MYW5ndWFnZVJvb3RQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9yZXBvcnQuZ2lmIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgIG5hbWU9Ik9TQlAgUmVwb3J0RFNMIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5rZXl3b3JkX1JlcG9ydERTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5zeW50YXhjb2xvcmluZy5TeW50YXhDb2xvcmluZ1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5jb2xvcmluZyIKKyAgICAgICAgICAgIG5hbWU9IlN5bnRheCBDb2xvcmluZyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wudGVtcGxhdGVzIgorICAgICAgICAgICAgbmFtZT0iVGVtcGxhdGVzIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5rZXl3b3JkX1JlcG9ydERTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfcmVwb3J0LmdpZiIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgICAgbmFtZT0iT1NCUCBSZXBvcnREU0wiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIi8+CisgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+CisJICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisJCQk8L2VuYWJsZWRXaGVuPgorCSAgICAgICAgPGZpbHRlciBuYW1lPSJwcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+CisgICAgICAgIDxrZXl3b3JkCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiCisgICAgICAgICAgICBsYWJlbD0iT1NCUCBSZXBvcnREU0wiLz4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC52YWxpZGF0ZSIKKyAgICAgICAgICAgIG5hbWU9IlZhbGlkYXRlIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwhLS0gY29weSBxdWFsaWZpZWQgbmFtZSAtLT4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSIKKyAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29weSB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50IgorICAgICAgICAgICAgbmFtZT0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICA8L2NvbW1hbmQ+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC52YWxpZGF0ZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8IS0tIGNvcHkgcXVhbGlmaWVkIG5hbWUgLS0+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWNvcHkiPgorICAgICAgICAgCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIiAKKyAgICAgICAgIAkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICAJPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWNvcHkiPgorICAgICAgICAgCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgICAgIAk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorICAgICAgICAgCTwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnh0ZXh0LnVpLm91dGxpbmU/YWZ0ZXI9YWRkaXRpb25zIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSIgCisJCQkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJICAgICAgICAgICAgCTxhbmQ+CisJICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCIgLz4KKwkJCQkJCTxpdGVyYXRlPgorCQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5JT3V0bGluZU5vZGUiIC8+CisJCQkJCQk8L2l0ZXJhdGU+CisJCQkJCTwvYW5kPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2VuZG9mPWdyb3VwLmZpbmQiPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuRmluZFJlZmVyZW5jZXNIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgIDwvZXh0ZW5zaW9uPiAgIAorCis8IS0tIGFkZGluZyByZXNvdXJjZSBmYWN0b3JpZXMgLS0+CisKKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+CisJCTxwYXJzZXIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VGYWN0b3J5IgorCQkJdHlwZT0icmVwb3J0Ij4KKwkJPC9wYXJzZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuZXh0ZW5zaW9uX3Jlc291cmNlU2VydmljZVByb3ZpZGVyIj4KKyAgICAgICAgPHJlc291cmNlU2VydmljZVByb3ZpZGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVzb3VyY2UuSVJlc291cmNlVUlTZXJ2aWNlUHJvdmlkZXIiCisgICAgICAgICAgICB1cmlFeHRlbnNpb249InJlcG9ydCI+CisgICAgICAgIDwvcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXI+CisgICAgPC9leHRlbnNpb24+CisKKworCTwhLS0gbWFya2VyIGRlZmluaXRpb25zIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wgLS0+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9InJlcG9ydGRzbC5jaGVjay5mYXN0IgorCSAgICAgICAgbmFtZT0iT1NCUCBSZXBvcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmZhc3QiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icmVwb3J0ZHNsLmNoZWNrLm5vcm1hbCIKKwkgICAgICAgIG5hbWU9Ik9TQlAgUmVwb3J0RFNMIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5ub3JtYWwiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icmVwb3J0ZHNsLmNoZWNrLmV4cGVuc2l2ZSIKKwkgICAgICAgIG5hbWU9Ik9TQlAgUmVwb3J0RFNMIFByb2JsZW0iCisJICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisJICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5jaGVjay5leHBlbnNpdmUiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucGFydGljaXBhbnQiPgorICAgICAgPHBhcnRpY2lwYW50CisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5JWHRleHRCdWlsZGVyUGFydGljaXBhbnQiPgorICAgICAgPC9wYXJ0aWNpcGFudD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX3JlcG9ydC5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLmNvbXBpbGVyLnByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiCisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnByZWZlcmVuY2VzLkJ1aWxkZXJQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX3JlcG9ydC5naWYiCisgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuY29tcGlsZXIucHJvcGVydHlQYWdlIgorICAgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorCisJPCEtLSBRdWljayBPdXRsaW5lIC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUucXVpY2tvdXRsaW5lLlNob3dRdWlja091dGxpbmVBY3Rpb25IYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKwkJPGNvbW1hbmQKKwkJCWRlc2NyaXB0aW9uPSJPcGVuIHRoZSBxdWljayBvdXRsaW5lLiIKKwkJCWlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQluYW1lPSJRdWljayBPdXRsaW5lIj4KKwkJPC9jb21tYW5kPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIFF1aWNrIE91dGxpbmUiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorICAgIDwhLS0gcXVpY2tmaXggbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wgLS0+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnJlcG9ydGRzbC5jaGVjay5mYXN0Ij4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkucmVwb3J0ZHNsLmNoZWNrLm5vcm1hbCI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnJlcG9ydGRzbC5jaGVjay5leHBlbnNpdmUiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgPC9leHRlbnNpb24+CisKKwk8IS0tIFByb2plY3QgV2l6YXJkcyAtLT4KKwk8IS0tCisgICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQud2l6YXJkcy51aS5uZXdXaXphcmRzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWxsaW5vbmVkc2xzLnVpLndpemFyZC5BbGxJbk9uZURTTHNOZXdQcm9qZWN0V2l6YXJkIgorICAgICAgICAgICAgaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmltZy9pbWcvZHNsX2FsbGlub25lLTEucG5nIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWxsaW5vbmVkc2xzLnVpLndpemFyZC5BbGxJbk9uZURTTHNOZXdQcm9qZWN0V2l6YXJkIgorICAgICAgICAgICAgbmFtZT0iQWxsLUluLU9uZS1EU0xzIFByb2plY3QiCisgICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIj4KKyAgICAgIDwvd2l6YXJkPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQud2l6YXJkcy51aS5uZXdXaXphcmRzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWxsaW5vbmVkc2xzLnVpLndpemFyZC5TY3NzVGhlbWVOZXdQcm9qZWN0V2l6YXJkIgorICAgICAgICAgICAgaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmltZy9pbWcvZHNsX3Njc3N0aGVtZS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hbGxpbm9uZWRzbHMudWkud2l6YXJkLlNjc3NUaGVtZU5ld1Byb2plY3RXaXphcmQiCisgICAgICAgICAgICBuYW1lPSJWYWxvIFNBU1MgVGhlbWUgUHJvamVjdCIKKyAgICAgICAgICAgIHByb2plY3Q9InRydWUiPgorICAgICAgPC93aXphcmQ+CisgICAgICA8Y2F0ZWdvcnkKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LndpemFyZHMudWkubmV3V2l6YXJkcyIKKyAgICAgICAgICAgIGljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2Uub3NicC51dGlscy5pbWcvaW1nL29zYmVlLnBuZyIKKyAgICAgICAgICAgIG5hbWU9Ik9TQlAgUHJvamVjdHMiPgorICAgICAgPC9jYXRlZ29yeT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICAtLT4KKyAgIAk8IS0tIFJlbmFtZSBSZWZhY3RvcmluZyAtLT4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLkRlZmF1bHRSZW5hbWVFbGVtZW50SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudCI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnQiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKwkgICAgPHBhZ2UKKwkgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiCisJICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlUGFnZSIKKwkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wucmVmYWN0b3JpbmciCisJICAgICAgICBuYW1lPSJSZWZhY3RvcmluZyI+CisJICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKwkgICAgPC9wYWdlPgorCTwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudFZpZXdlcnMiPgorICAgIDx2aWV3ZXIgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJyZXBvcnQiPgorICAgIDwvdmlld2VyPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIj4KKyAgICA8dmlld2VyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJyZXBvcnQiIGxhYmVsPSJSZXBvcnREU0wgQ29tcGFyZSI+CisgICAgIDwvdmlld2VyPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+CisgICAgPHByb3ZpZGVyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IubW9kZWwuWHRleHREb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icmVwb3J0Ij4KKyAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9wbHVnaW4ueG1sX2dlbiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3BsdWdpbi54bWxfZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmRlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9wbHVnaW4ueG1sX2dlbgpAQCAtMCwwICsxLDU2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgICAgPGVkaXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCisgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icmVwb3J0IgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmVkaXRvci5KYXZhRWRpdG9ySW5wdXRNYXRjaGVyIgorICAgICAgICAgICAgbmFtZT0iUmVwb3J0RFNMIEVkaXRvciI+CisgICAgICAgIDwvZWRpdG9yPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLk9wZW5EZWNsYXJhdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oeXBlcmxpbmtpbmcuT3BlbkRlY2xhcmF0aW9uIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaGFuZGxlci5WYWxpZGF0ZUFjdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC52YWxpZGF0ZSI+CisgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgIAk8L2hhbmRsZXI+CisgICAgICAJPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZUhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIAk8YW5kPgorICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCIgLz4KKwkgICAgICAgICAgICAgICAgPGl0ZXJhdGU+CisJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuSU91dGxpbmVOb2RlIiAvPgorCQkJCQk8L2l0ZXJhdGU+CisJCQkJPC9hbmQ+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KKyAgICAgICAgPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9ImlzQWN0aXZlRWRpdG9yQW5JbnN0YW5jZU9mWHRleHRFZGl0b3IiLz4KKyAgICAgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvci5sYW5ndWFnZU5hbWUiIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuWHRleHRFZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9ImlzWHRleHRFZGl0b3JBY3RpdmUiLz4KKyAgICAgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvci5sYW5ndWFnZU5hbWUiIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgIG5hbWU9IlJlcG9ydERTTCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuY29sb3JpbmciCisgICAgICAgICAgICBuYW1lPSJTeW50YXggQ29sb3JpbmciPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnRlbXBsYXRlcy5YdGV4dFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLnRlbXBsYXRlcyIKKyAgICAgICAgICAgIG5hbWU9IlRlbXBsYXRlcyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuTGFuZ3VhZ2VSb290UHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIgorICAgICAgICAgICAgbmFtZT0iUmVwb3J0RFNMIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5rZXl3b3JkX1JlcG9ydERTTCIvPgorICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgorCSAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJPC9lbmFibGVkV2hlbj4KKwkgICAgICAgIDxmaWx0ZXIgbmFtZT0icHJvamVjdE5hdHVyZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZSIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgorICAgICAgICA8a2V5d29yZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIgorICAgICAgICAgICAgbGFiZWw9IlJlcG9ydERTTCIvPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCIKKyAgICAgICAgICAgIG5hbWU9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgdG9vbHRpcD0iVHJpZ2dlciBleHBlbnNpdmUgdmFsaWRhdGlvbiI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDwhLS0gY29weSBxdWFsaWZpZWQgbmFtZSAtLT4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiIAorICAgICAgICAgCQlzdHlsZT0icHVzaCIgdG9vbHRpcD0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICAgICAgICAJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICAJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICAJPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UueHRleHQudWkub3V0bGluZT9hZnRlcj1hZGRpdGlvbnMiPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIiAKKwkJCQlzdHlsZT0icHVzaCIgdG9vbHRpcD0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICAgICAJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkgICAgICAgICAgICAJPGFuZD4KKwkgICAgICAgICAgICAJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuWHRleHRFZGl0b3Iub3BlbmVkIiAvPgorCQkJCQkJPGl0ZXJhdGU+CisJCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJCTwvaXRlcmF0ZT4KKwkJCQkJPC9hbmQ+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/ZW5kb2Y9Z3JvdXAuZmluZCI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5GaW5kUmVmZXJlbmNlcyI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCSAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5maW5kcmVmcy5GaW5kUmVmZXJlbmNlc0hhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5GaW5kUmVmZXJlbmNlcyI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+ICAgCisKKzwhLS0gYWRkaW5nIHJlc291cmNlIGZhY3RvcmllcyAtLT4KKworCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KKwkJPHBhcnNlcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkiCisJCQl0eXBlPSJyZXBvcnQiPgorCQk8L3BhcnNlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS54dGV4dC5leHRlbnNpb25fcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIiPgorICAgICAgICA8cmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5JUmVzb3VyY2VVSVNlcnZpY2VQcm92aWRlciIKKyAgICAgICAgICAgIHVyaUV4dGVuc2lvbj0icmVwb3J0Ij4KKyAgICAgICAgPC9yZXNvdXJjZVNlcnZpY2VQcm92aWRlcj4KKyAgICA8L2V4dGVuc2lvbj4KKworCisJPCEtLSBtYXJrZXIgZGVmaW5pdGlvbnMgZm9yIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCAtLT4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icmVwb3J0ZHNsLmNoZWNrLmZhc3QiCisJICAgICAgICBuYW1lPSJSZXBvcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmZhc3QiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0icmVwb3J0ZHNsLmNoZWNrLm5vcm1hbCIKKwkgICAgICAgIG5hbWU9IlJlcG9ydERTTCBQcm9ibGVtIgorCSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorCSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuY2hlY2subm9ybWFsIi8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9InJlcG9ydGRzbC5jaGVjay5leHBlbnNpdmUiCisJICAgICAgICBuYW1lPSJSZXBvcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmV4cGVuc2l2ZSIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wYXJ0aWNpcGFudCI+CisgICAgICA8cGFydGljaXBhbnQKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLklYdGV4dEJ1aWxkZXJQYXJ0aWNpcGFudCIKKyAgICAgICAgICAgIGZpbGVFeHRlbnNpb25zPSJyZXBvcnQiCisgICAgICAgICAgICA+CisgICAgICA8L3BhcnRpY2lwYW50PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLmNvbXBpbGVyLnByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5jb21waWxlci5wcm9wZXJ0eVBhZ2UiCisgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkua2V5d29yZF9SZXBvcnREU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorCisJPCEtLSBRdWljayBPdXRsaW5lIC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUucXVpY2tvdXRsaW5lLlNob3dRdWlja091dGxpbmVBY3Rpb25IYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKwkJPGNvbW1hbmQKKwkJCWRlc2NyaXB0aW9uPSJPcGVuIHRoZSBxdWljayBvdXRsaW5lLiIKKwkJCWlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQluYW1lPSJRdWljayBPdXRsaW5lIj4KKwkJPC9jb21tYW5kPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIFF1aWNrIE91dGxpbmUiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorICAgIDwhLS0gcXVpY2tmaXggbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wgLS0+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnJlcG9ydGRzbC5jaGVjay5mYXN0Ij4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkucmVwb3J0ZHNsLmNoZWNrLm5vcm1hbCI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnJlcG9ydGRzbC5jaGVjay5leHBlbnNpdmUiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgPC9leHRlbnNpb24+CisgICAJPCEtLSBSZW5hbWUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5EZWZhdWx0UmVuYW1lRWxlbWVudEhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnQiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50IgorICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisJICAgIDxwYWdlCisJICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIgorCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLlJlZmFjdG9yaW5nUHJlZmVyZW5jZVBhZ2UiCisJICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLnJlZmFjdG9yaW5nIgorCSAgICAgICAgbmFtZT0iUmVmYWN0b3JpbmciPgorCSAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmtleXdvcmRfUmVwb3J0RFNMIi8+CisJICAgIDwvcGFnZT4KKwk8L2V4dGVuc2lvbj4KKworPCEtLSBUeXBlIEhpZXJhcmNoeSAgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHlIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHkiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuUXVpY2tUeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uaGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlblR5cGVIaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBUeXBlIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEub3Blbi5oaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iUXVpY2sgVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTwhLS0gQ2FsbCBIaWVyYWNoeSAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwkKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBDYWxsIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5zbWFwLlN0cmF0dW1CcmVha3BvaW50QWRhcHRlckZhY3RvcnkiCisgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IiPgorICAgICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQiLz4KKyAgICAgIDwvZmFjdG9yeT4gCisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgorICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5ydWxlckFjdGlvbnMiPgorCSAgICAgPGFjdGlvbgorCSAgICAgICAgICAgICBsYWJlbD0iTm90IFVzZWQiCisJICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyVG9nZ2xlQnJlYWtwb2ludEFjdGlvbkRlbGVnYXRlIgorCSAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKwkgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCisJICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuZG91YmxlQ2xpY2tCcmVha3BvaW50QWN0aW9uIi8+CisJICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLlJ1bGVyQ29udGV4dCIKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuUnVsZXJQb3B1cEFjdGlvbnMiPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgbGFiZWw9IlRvZ2dsZSBCcmVha3BvaW50IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJUb2dnbGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgICBtZW51YmFyUGF0aD0iZGVidWciCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLnJ1bGVyQ29udGV4dE1lbnUudG9nZ2xlQnJlYWtwb2ludEFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgIGxhYmVsPSJOb3QgdXNlZCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyRW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRBY3Rpb25EZWxlZ2F0ZSIKKyAgICAgICAgICAgIG1lbnViYXJQYXRoPSJkZWJ1ZyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wucnVsZXJDb250ZXh0TWVudS5lbmFibGVEaXNhYmxlQnJlYWtwb2ludEFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgbGFiZWw9IkJyZWFrcG9pbnQgUHJvcGVydGllcyIKKyAgICAgICAgICAgaGVscENvbnRleHRJZD0iYnJlYWtwb2ludF9wcm9wZXJ0aWVzX2FjdGlvbl9jb250ZXh0IgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmFjdGlvbnMuSmF2YUJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb25EZWxlZ2F0ZSIKKyAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLnByb3BlcnRpZXMiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wucnVsZXJDb250ZXh0TWVudS5vcGVuQnJlYXBvaW50UHJvcGVydGllc0FjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgIDwvdmlld2VyQ29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICAgPCEtLSBJbnRyb2R1Y2UgTG9jYWwgVmFyaWFibGUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0VmFyaWFibGVIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0TG9jYWxWYXJpYWJsZSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLnJlZmFjdG9yaW5nLkV4dHJhY3RMb2NhbFZhcmlhYmxlIgorICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4gIAorICAgPCEtLSBPcGVuIGltcGxlbWVudGF0aW9uIC0tPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5uYXZpZ2F0aW9uLk9wZW5JbXBsZW1lbnRhdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLk9wZW5JbXBsZW1lbnRhdGlvbkNvbW1hbmQiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKyAgICAgIDwvaGFuZGxlcj4KKyAgIDwvZXh0ZW5zaW9uPgorIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6bmF2aWdhdGU/YWZ0ZXI9b3Blbi5leHQ0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuT3BlbkltcGxlbWVudGF0aW9uQ29tbWFuZCI+CisJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisJCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzIj4KKyAgICA8dmlld2VyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0wuY29tcGFyZS5jb250ZW50Vmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5jb21wYXJlLkluamVjdGFibGVWaWV3ZXJDcmVhdG9yIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icmVwb3J0Ij4KKyAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5jb21wYXJlLkluamVjdGFibGVWaWV3ZXJDcmVhdG9yIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0icmVwb3J0IiBsYWJlbD0iUmVwb3J0RFNMIENvbXBhcmUiPgorICAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm1vZGVsLlh0ZXh0RG9jdW1lbnRQcm92aWRlciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9InJlcG9ydCI+CisgICAgPC9wcm92aWRlcj4KKyAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkNzdhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3BvbS54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpPC9hcnRpZmFjdElkPgorICAgIDxidWlsZD4KKyAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjLWdlbjwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvQWJzdHJhY3RSZXBvcnREU0xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9BYnN0cmFjdFJlcG9ydERTTFVpTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMmQxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvQWJzdHJhY3RSZXBvcnREU0xVaU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMzc1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5EZWZhdWx0VWlNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKKy8qKgorICogTWFudWFsIG1vZGlmaWNhdGlvbnMgZ28gdG8ge29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTFVpTW9kdWxlfQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlcG9ydERTTFVpTW9kdWxlIGV4dGVuZHMgRGVmYXVsdFVpTW9kdWxlIHsKKwkKKwlwdWJsaWMgQWJzdHJhY3RSZXBvcnREU0xVaU1vZHVsZShBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbikgeworCQlzdXBlcihwbHVnaW4pOworCX0KKwkKKwkKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuSW1wbGljaXRVaUZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuSUFsbENvbnRhaW5lcnNTdGF0ZT4gcHJvdmlkZUlBbGxDb250YWluZXJzU3RhdGUoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQuQWNjZXNzLmdldEphdmFQcm9qZWN0c1N0YXRlKCk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLkltcGxpY2l0VWlGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yPiBiaW5kWHRleHRFZGl0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5lZGl0b3IuWGJhc2VFZGl0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLkltcGxpY2l0VWlGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm1vZGVsLlh0ZXh0RG9jdW1lbnRQcm92aWRlcj4gYmluZFh0ZXh0RG9jdW1lbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmVkaXRvci5YYmFzZURvY3VtZW50UHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklQcm9wb3NhbENvbmZsaWN0SGVscGVyPiBiaW5kSVByb3Bvc2FsQ29uZmxpY3RIZWxwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5BbnRsclByb3Bvc2FsQ29uZmxpY3RIZWxwZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVIaWdobGlnaHRpbmdMZXhlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLkxleGVyVUlCaW5kaW5ncy5ISUdITElHSFRJTkcpKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxSZXBvcnREU0xMZXhlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVIaWdobGlnaHRpbmdUb2tlbkRlZlByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklUb2tlbkRlZlByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQudWkuTGV4ZXJVSUJpbmRpbmdzLkhJR0hMSUdIVElORykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuRGVmUHJvdmlkZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zQnVpbGRlclNjb3BlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuaW1wbC5SZXNvdXJjZURlc2NyaXB0aW9uc1Byb3ZpZGVyLk5BTUVEX0JVSUxERVJfU0NPUEUpKS50byhvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLmNsdXN0ZXJpbmcuQ3VycmVudERlc2NyaXB0aW9ucy5SZXNvdXJjZVNldEF3YXJlLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklYdGV4dEVkaXRvckNhbGxiYWNrPiBiaW5kSVh0ZXh0RWRpdG9yQ2FsbGJhY2soKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLm5hdHVyZS5OYXR1cmVBZGRpbmdFZGl0b3JDYWxsYmFjay5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUlSZXNvdXJjZURlc2NyaXB0aW9uc1BlcnNpc3RlZChjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VEZXNjcmlwdGlvbnNQcm92aWRlci5QRVJTSVNURURfREVTQ1JJUFRJT05TKSkudG8ob3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5idWlsZGVyU3RhdGUuSUJ1aWxkZXJTdGF0ZS5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5Eb2N1bWVudEJhc2VkRGlydHlSZXNvdXJjZT4gYmluZERvY3VtZW50QmFzZWREaXJ0eVJlc291cmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5pbXBsLlBlcnNpc3RlbnREYXRhQXdhcmVEaXJ0eVJlc291cmNlLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5nZW5lcmF0b3IuR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50PiBiaW5kSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5CdWlsZGVyUGFydGljaXBhbnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdlbmVyYXRvci5HZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCBiaW5kSVdvcmtzcGFjZVJvb3RUb0luc3RhbmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlQnVpbGRlclByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVJbml0aWFsaXplci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKCJidWlsZGVyUHJlZmVyZW5jZUluaXRpYWxpemVyIikpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VBY2Nlc3MuSW5pdGlhbGl6ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5sYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI+IGJpbmRJTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmxhYmVsaW5nLlJlcG9ydERTTExhYmVsUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmxhYmVsaW5nLkxhYmVsUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJlc291cmNlVUlTZXJ2aWNlTGFiZWxQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkucmVzb3VyY2UuUmVzb3VyY2VTZXJ2aWNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmNsYXNzKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5sYWJlbGluZy5SZXBvcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5vdXRsaW5lLk91dGxpbmVUcmVlUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuSU91dGxpbmVUcmVlUHJvdmlkZXI+IGJpbmRJT3V0bGluZVRyZWVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLm91dGxpbmUuUmVwb3J0RFNMT3V0bGluZVRyZWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3Iub3V0bGluZS5PdXRsaW5lVHJlZVByb3ZpZGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLmltcGwuSU91dGxpbmVUcmVlU3RydWN0dXJlUHJvdmlkZXI+IGJpbmRJT3V0bGluZVRyZWVTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLm91dGxpbmUuUmVwb3J0RFNMT3V0bGluZVRyZWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguSXNzdWVSZXNvbHV0aW9uUHJvdmlkZXI+IGJpbmRJc3N1ZVJlc29sdXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLnF1aWNrZml4LlJlcG9ydERTTFF1aWNrZml4UHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmNvbnRlbnRBc3Npc3QuQ29udGVudEFzc2lzdEZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JQ29udGVudFByb3Bvc2FsUHJvdmlkZXI+IGJpbmRJQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LlJlcG9ydERTTFByb3Bvc2FsUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdENvbnRleHQuRmFjdG9yeT4gYmluZENvbnRlbnRBc3Npc3RDb250ZXh0JEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5QYXJzZXJCYXNlZENvbnRlbnRBc3Npc3RDb250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5JQ29udGVudEFzc2lzdFBhcnNlcj4gYmluZElDb250ZW50QXNzaXN0UGFyc2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5SZXBvcnREU0xQYXJzZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbnRlbnRBc3Npc3RMZXhlclByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFJlcG9ydERTTExleGVyLmNsYXNzKS50b1Byb3ZpZGVyKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlclByb3ZpZGVyLmNyZWF0ZShvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMTGV4ZXIuY2xhc3MpKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlQ29udGVudEFzc2lzdExleGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuTGV4ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC51aS5MZXhlclVJQmluZGluZ3MuQ09OVEVOVF9BU1NJU1QpKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQoIlJlZmFjdG9yaW5nUHJlZmVyZW5jZXMiKSkudG8ob3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlcy5Jbml0aWFsaXplci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLnJlZmFjdG9yaW5nLlJlZmFjdG9yRWxlbWVudE5hbWVGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuSVJlbmFtZVN1cHBvcnQuRmFjdG9yeT4gYmluZElSZW5hbWVTdXBwb3J0JEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSmR0UmVuYW1lU3VwcG9ydC5GYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVTdHJhdGVneS5Qcm92aWRlcj4gYmluZElSZW5hbWVTdHJhdGVneSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudC5Kdm1NZW1iZXJSZW5hbWVTdHJhdGVneS5Qcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucmVmYWN0b3JpbmcuUmVmYWN0b3JFbGVtZW50TmFtZUZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSnZtTWVtYmVyUmVuYW1lU3RyYXRlZ3kkUHJvdmlkZXIkRGVsZWdhdGUoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVuYW1lU3RyYXRlZ3kuUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50Lkp2bU1lbWJlclJlbmFtZVN0cmF0ZWd5LlByb3ZpZGVyLkRlbGVnYXRlLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5pbXBsLkRlZmF1bHRSZW5hbWVTdHJhdGVneVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYmluZENsYXNzTG9hZGVyVG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5JSnZtVHlwZVByb3ZpZGVyLkZhY3Rvcnk+IGJpbmRJSnZtVHlwZVByb3ZpZGVyJEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLmpkdC5KZHRUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0QmFzZWRTaW1wbGVUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLklUeXBlc1Byb3Bvc2FsUHJvdmlkZXI+IGJpbmRJVHlwZXNQcm9wb3NhbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLkpkdFR5cGVzUHJvcG9zYWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5qZHQuSUphdmFQcm9qZWN0UHJvdmlkZXI+IGJpbmRJSmF2YVByb2plY3RQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy54dGV4dC51aS5YdGV4dFJlc291cmNlU2V0QmFzZWRQcm9qZWN0UHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlByZWZpeE1hdGNoZXI+IGJpbmRQcmVmaXhNYXRjaGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuRlFOUHJlZml4TWF0Y2hlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklWYWxpZGF0aW9uSm9iU2NoZWR1bGVyPiBiaW5kSVZhbGlkYXRpb25Kb2JTY2hlZHVsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0VmFsaWRhdGlvbkpvYlNjaGVkdWxlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuaW1wbC5SZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXI+IGJpbmRSZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSnZtUmVmYWN0b3JpbmdSZXNvdXJjZVNldFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuQWJzdHJhY3RBbnRsclRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlcj4gYmluZEFic3RyYWN0QW50bHJUb2tlblRvQXR0cmlidXRlSWRNYXBwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5zeW50YXhjb2xvcmluZy5YYmFzZVRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RKYXZhQmFzZWRDb250ZW50UHJvcG9zYWxQcm92aWRlci5SZWZlcmVuY2VQcm9wb3NhbENyZWF0b3I+IGJpbmRBYnN0cmFjdEphdmFCYXNlZENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyJFJlZmVyZW5jZVByb3Bvc2FsQ3JlYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmNvbnRlbnRhc3Npc3QuWGJhc2VSZWZlcmVuY2VQcm9wb3NhbENyZWF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3Nvcj4gYmluZElDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuUmVwZWF0ZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSVNlbWFudGljSGlnaGxpZ2h0aW5nQ2FsY3VsYXRvcj4gYmluZElTZW1hbnRpY0hpZ2hsaWdodGluZ0NhbGN1bGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWdobGlnaHRpbmcuWGJhc2VIaWdobGlnaHRpbmdDYWxjdWxhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24+IGJpbmRJSGlnaGxpZ2h0aW5nQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZ2hsaWdodGluZy5YYmFzZUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyUHJvdmlkZXI+IGJpbmRJRU9iamVjdEhvdmVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5ob3Zlci5YYmFzZUhvdmVyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlRGlzcGF0Y2hpbmdFT2JqZWN0VGV4dEhvdmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyPiBiaW5kSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlSG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5EZWZhdWx0UXVpY2tmaXhQcm92aWRlci5Dcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXI+IGJpbmREZWZhdWx0UXVpY2tmaXhQcm92aWRlciRDcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5xdWlja2ZpeC5YYmFzZUNyb3NzUmVmUmVzb2x1dGlvbkNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS52YWxpZGF0aW9uLlhiYXNlVUlWYWxpZGF0b3I+IGJpbmRYYmFzZVVJVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkudmFsaWRhdGlvbi5YYmFzZVVJVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLklIeXBlcmxpbmtIZWxwZXI+IGJpbmRJSHlwZXJsaW5rSGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkubmF2aWdhdGlvbi5UeXBlTGl0ZXJhbEF3YXJlSHlwZXJsaW5rSGVscGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLklGZWF0dXJlU2NvcGVUcmFja2VyLlByb3ZpZGVyPiBiaW5kSUZlYXR1cmVTY29wZVRyYWNrZXIkUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLk9wdGltaXppbmdGZWF0dXJlU2NvcGVUcmFja2VyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5maW5kcmVmcy5GaW5kUmVmZXJlbmNlc0hhbmRsZXI+IGJpbmRGaW5kUmVmZXJlbmNlc0hhbmRsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbEZpbmRSZWZlcmVuY2VIYW5kbGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuUmVmZXJlbmNlUXVlcnlFeGVjdXRvcj4gYmluZFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3I+IGJpbmRJRGVwZW5kZW50RWxlbWVudHNDYWxjdWxhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuSnZtTW9kZWxEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyPiBiaW5kSVJlbmFtZVJlZmFjdG9yaW5nUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVmZXJlbmNlVXBkYXRlcj4gYmluZElSZWZlcmVuY2VVcGRhdGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuWGJhc2VSZWZlcmVuY2VVcGRhdGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5JUmVuYW1lQ29udGV4dEZhY3Rvcnk+IGJpbmRJUmVuYW1lQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVDb250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50LkpkdFJlbmFtZVBhcnRpY2lwYW50LkNvbnRleHRGYWN0b3J5PiBiaW5kSmR0UmVuYW1lUGFydGljaXBhbnQkQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5Kdm1Nb2RlbEpkdFJlbmFtZVBhcnRpY2lwYW50Q29udGV4dC5Db250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuSVJlbmFtZVN0cmF0ZWd5PiBiaW5kSVJlbmFtZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuRGVmYXVsdEp2bU1vZGVsUmVuYW1lU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLmltcGwuT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyPiBiaW5kT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwub3V0bGluZS5Kdm1PdXRsaW5lTm9kZUVsZW1lbnRPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5HbG9iYWxVUklFZGl0b3JPcGVuZXI+IGJpbmRHbG9iYWxVUklFZGl0b3JPcGVuZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkubmF2aWdhdGlvbi5HbG9iYWxEZXJpdmVkTWVtYmVyQXdhcmVVUklFZGl0b3JPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vY2N1cnJlbmNlcy5JT2NjdXJyZW5jZUNvbXB1dGVyPiBiaW5kSU9jY3VycmVuY2VDb21wdXRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm9jY3VycmVuY2UuSnZtTW9kZWxPY2N1cnJlbmNlQ29tcHV0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5xdWVyeS5JSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24+IGJpbmRJSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24oKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucXVlcnkuSUphdmFTZWFyY2hQYXJ0aWNpcGF0aW9uLk5vLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlTGFuZ3VhZ2VTcGVjaWZpY1VSSUVkaXRvck9wZW5lcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWlmIChvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKSB7IAorCQkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklVUklFZGl0b3JPcGVuZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkuTGFuZ3VhZ2VTcGVjaWZpYy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwubmF2aWdhdGlvbi5EZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpOyAKKwkJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5uYXZpZ2F0aW9uLklEZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm5hdmlnYXRpb24uRGVyaXZlZE1lbWJlckF3YXJlRWRpdG9yT3BlbmVyLmNsYXNzKTsgCisJCX07CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3Rvcj4gYmluZElIeXBlcmxpbmtEZXRlY3RvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLm5hdmlnYXRpb24uWGJhc2VIeXBlcmxpbmtEZXRlY3Rvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzPiBiaW5kSmF2YVR5cGVRdWlja2ZpeGVzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzTm9JbXBvcnRTZWN0aW9uLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uPiBwcm92aWRlVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5BY2Nlc3NpYmxlQ29kZXRlbXBsYXRlc0FjdGl2YXRvci5nZXRUZW1wbGF0ZXNMYW5ndWFnZUNvbmZpZ3VyYXRpb25Qcm92aWRlcigpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucmVnaXN0cnkuTGFuZ3VhZ2VSZWdpc3RyeT4gcHJvdmlkZUxhbmd1YWdlUmVnaXN0cnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLkFjY2Vzc2libGVDb2RldGVtcGxhdGVzQWN0aXZhdG9yLmdldExhbmd1YWdlUmVnaXN0cnkoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyPiBiaW5kTGFuZ3VhZ2VSZWdpc3RyYXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZT4gYmluZFh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuQWR2YW5jZWRUZW1wbGF0ZXNQcmVmZXJlbmNlUGFnZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5wYXJ0aWFsRWRpdGluZy5JUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXI+IGJpbmRJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLlBhcnRpYWxSZXBvcnREU0xDb250ZW50QXNzaXN0UGFyc2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5jb21wYXJlLkNvbXBhcmVGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UuY29tcGFyZS5JVmlld2VyQ3JlYXRvcj4gYmluZElWaWV3ZXJDcmVhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5EZWZhdWx0Vmlld2VyQ3JlYXRvci5jbGFzczsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTIyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL1JlcG9ydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZ3VpY2UuQWJzdHJhY3RHdWljZUF3YXJlRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuaW50ZXJuYWwuUmVwb3J0RFNMQWN0aXZhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZC4gQ3VzdG9taXphdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIGEgbmV3bHkKKyAqIGludHJvZHVjZWQgc3ViY2xhc3MuIAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEd1aWNlQXdhcmVFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeSB7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKwkJcmV0dXJuIFJlcG9ydERTTEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBSZXBvcnREU0xBY3RpdmF0b3IuZ2V0SW5zdGFuY2UoKS5nZXRJbmplY3RvcihSZXBvcnREU0xBY3RpdmF0b3IuT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9SRVBPUlREU0xfUkVQT1JURFNMKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RSZXBvcnREU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RSZXBvcnREU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExN2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdFJlcG9ydERTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwNjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdENvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGdlbmVyYXRlZCwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzdXBlcmNsYXNzIHtAbGluayBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5jb250ZW50YXNzaXN0LlhiYXNlV2l0aEFubm90YXRpb25zUHJvcG9zYWxQcm92aWRlcn0uCisgKiBNZXRob2RzIGFyZSBkeW5hbWljYWxseSBkaXNwYXRjaGVkIG9uIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIGkuZS4sIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSAKKyAqIHdpdGggYSBtb3JlIGNvbmNyZXRlIHN1YnR5cGUuIAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFJlcG9ydERTTFByb3Bvc2FsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5jb250ZW50YXNzaXN0LlhiYXNlV2l0aEFubm90YXRpb25zUHJvcG9zYWxQcm92aWRlciB7CisJCQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0TW9kZWxfUGNrZyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydFBhY2thZ2VfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydFBhY2thZ2VfSW1wb3J0cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydFBhY2thZ2VfRXh0ZXJuYWxDc3NVUkkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRQYWNrYWdlX0V4dGVybmFsQ3NzVVJJQnVuZGxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9QYWdldGVtcGxhdGVzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9Gb3JtYXR0ZXJzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9Db2xvcnMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRQYWNrYWdlX0ZvbnRzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9NZWRpYXMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRQYWNrYWdlX1N0eWxlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydFBhY2thZ2VfUmVwb3J0cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBhZ2VUZW1wbGF0ZXNfUGFnZXRlbXBsYXRlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVNvbWVGb3JtYXRzX0Zvcm1hdHRlcnMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDb2xvcnNfQ29sb3JzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udHNfRm9udHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYXNfTWVkaWFzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlc19TdHlsZXMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlVGVtcGxhdGVfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBhZ2VUZW1wbGF0ZV9TaXplKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX09yaWVudGF0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX1RvcE1hcmdpblZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX1RvcE1hcmdpblVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlVGVtcGxhdGVfTGVmdE1hcmdpblZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX0xlZnRNYXJnaW5Vbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlVGVtcGxhdGVfUmlnaHRNYXJnaW5WYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlVGVtcGxhdGVfSGVhZGVyKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZVRlbXBsYXRlX0Zvb3RlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbG9yX05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDb2xvcl9Db2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbG9yX0Jhc2Vjb2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDb2xvcl9EYXJrZW5zYnkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDb2xvcl9MaWdodGVuc2J5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29sb3JfVHJhbnNmb3Jtc2J5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29sb3JfVGFyZ2V0Y29sb3IoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udF9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udF9FeHRlbmRzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUZvbnRfRmFtaWx5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udF9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUZvbnRfQm9sZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUZvbnRfU2l6ZXZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udF9TaXpldW5pdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUJ1aWxkSW5Gb250RmFtaWx5X0N1c3RvbShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUN1c3RvbUZvbnRGYW1pbHlfQ3VzdG9tKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQm9yZGVyU3R5bGVfVHlwZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUJvcmRlclN0eWxlX1dpZHRodmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVCb3JkZXJTdHlsZV9XaWR0aHVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVCb3JkZXJTdHlsZV9Db2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfRXh0ZW5kcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9Gb3JtYXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfRm9udChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9CYWNrZ3JvdW5kY29sb3IoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9UZXh0Y29sb3IoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfVGV4dGFsaWduKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfQm9yZGVyVG9wKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfQm9yZGVyQm90dG9tKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfQm9yZGVyTGVmdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX0JvcmRlclJpZ2h0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfUGFkZGluZ1RvcFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3R5bGVfUGFkZGluZ1RvcFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9QYWRkaW5nQm90dG9tVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9QYWRkaW5nQm90dG9tVW5pdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX1BhZGRpbmdMZWZ0VmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9QYWRkaW5nTGVmdFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9QYWRkaW5nUmlnaHRWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX1BhZGRpbmdSaWdodFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NYXJnaW5Ub3BWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX01hcmdpblRvcFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NYXJnaW5Cb3R0b21WYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX01hcmdpbkJvdHRvbVVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NYXJnaW5MZWZ0VmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NYXJnaW5MZWZ0VW5pdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN0eWxlX01hcmdpblJpZ2h0VmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NYXJnaW5SaWdodFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdHlsZV9NZWRpYXN0eWxlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfTWVkaWEoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9Gb3JtYXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9Gb250KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfQmFja2dyb3VuZGNvbG9yKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX1RleHRjb2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX1RleHRhbGlnbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfQm9yZGVyVG9wKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9Cb3JkZXJCb3R0b20oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX0JvcmRlckxlZnQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX0JvcmRlclJpZ2h0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9QYWRkaW5nVG9wVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX1BhZGRpbmdUb3BVbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9QYWRkaW5nQm90dG9tVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX1BhZGRpbmdCb3R0b21Vbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9QYWRkaW5nTGVmdFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9QYWRkaW5nTGVmdFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX1BhZGRpbmdSaWdodFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9QYWRkaW5nUmlnaHRVbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTWVkaWFTdHlsZV9NYXJnaW5Ub3BWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfTWFyZ2luVG9wVW5pdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfTWFyZ2luQm90dG9tVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX01hcmdpbkJvdHRvbVVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX01hcmdpbkxlZnRWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU1lZGlhU3R5bGVfTWFyZ2luTGVmdFVuaXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX01hcmdpblJpZ2h0VmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVNZWRpYVN0eWxlX01hcmdpblJpZ2h0VW5pdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVVvbW9Gb3JtYXRfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVVvbW9Gb3JtYXRfVWlfcGF0dGVybihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVVvbW9Gb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVVb21vRm9ybWF0X1RleHRhbGlnbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZU51bWJlckZvcm1hdF9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTnVtYmVyRm9ybWF0X1VpX3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVOdW1iZXJGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTnVtYmVyRm9ybWF0X1JlcG9ydF9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlTnVtYmVyRm9ybWF0X1RleHRhbGlnbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUN1cnJlbmN5Rm9ybWF0X05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDdXJyZW5jeUZvcm1hdF9VaV9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ3VycmVuY3lGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ3VycmVuY3lGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDdXJyZW5jeUZvcm1hdF9UZXh0YWxpZ24oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlRm9ybWF0X05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlRm9ybWF0X1VpX3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlRm9ybWF0X1JlcG9ydF9jYXRlZ29yeShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlRm9ybWF0X1RleHRhbGlnbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGVUaW1lRm9ybWF0X05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlVGltZUZvcm1hdF9VaV9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZVRpbWVGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZVRpbWVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRlVGltZUZvcm1hdF9UZXh0YWxpZ24oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUaW1lRm9ybWF0X05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUaW1lRm9ybWF0X1VpX3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUaW1lRm9ybWF0X1JlcG9ydF9jYXRlZ29yeShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRpbWVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUaW1lRm9ybWF0X1RleHRhbGlnbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0X0Rlc2NyaXB0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0X0Rlc2NyaXB0aW9uVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRfVG9vbGJhcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRfRGF0YW1hcnRSZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0X1JlbmRlcmluZyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9FeHRlcm5hbENzc1VSSShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9FeHRlcm5hbENzc1VSSUJ1bmRsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9QYWdlVGVtcGxhdGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0X01lZGlhKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9EZXNpZ24oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnREZXNpZ25GaWxlX05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXNjcmlwdGlvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydERlc2lnblRlbXBsYXRlX0hlYWRlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydERlc2lnblRlbXBsYXRlX0RldGFpbChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydERlc2lnblRlbXBsYXRlX0Zvb3RlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBhZ2VIZWFkZXJfU2hvd09uRmlyc3QoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlSGVhZGVyX0hlaWdodFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZUhlYWRlcl9IZWlnaHRVbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZUhlYWRlcl9FbGVtZW50cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVBhZ2VEZXRhaWxfRWxlbWVudHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlRm9vdGVyX1Nob3dPbkxhc3QoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVQYWdlRm9vdGVyX0hlaWdodFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZUZvb3Rlcl9IZWlnaHRVbml0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUGFnZUZvb3Rlcl9FbGVtZW50cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUdyaWRfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUdyaWRfUm93cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUdyaWRSb3dfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUdyaWRSb3dfU3R5bGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlR3JpZFJvd19DZWxscyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUdyaWRDZWxsX05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVHcmlkQ2VsbF9Db2x1bW5zcGFuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlR3JpZENlbGxfRWxlbWVudHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlX1N0eWxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVfRGV0YWlsaGVhZGVyKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZV9IZWFkZXJzdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlX0RldGFpbGZvb3RlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVfRm9vdGVyc3R5bGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZV9Hcm91cHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlX0RldGFpbChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVHcm91cF9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZUdyb3VwX0dyb3VwaW5nUmVmKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVHcm91cF9IZWFkZXIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlR3JvdXBfRGV0YWlsaGVhZGVyKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZUdyb3VwX0hlYWRlcnN0eWxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVHcm91cF9EZXRhaWxmb290ZXIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlR3JvdXBfRm9vdGVyc3R5bGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZUdyb3VwX0Zvb3RlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfUm93cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfUm93cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVEZXRhaWxfU3R5bGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZURldGFpbF9Db2x1bW5Gb3JtYXR0ZXJzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZVByb3BlcnR5X0NvbHVtbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVQcm9wZXJ0eV9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlUHJvcGVydHlfSGFzSW1hZ2UoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlUHJvcGVydHlfSW1hZ2UoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlUHJvcGVydHlfSGlkZUxhYmVsSW50ZXJ2YWwoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVEYXRhbWFydFRhYmxlUHJvcGVydHlfSW50ZXJ2YWxzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0YW1hcnRUYWJsZVByb3BlcnR5X0hpZGVMYWJlbExvb2t1cChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGFtYXJ0VGFibGVQcm9wZXJ0eV9Mb29rdXBzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVGb3JtYXR0ZXJfRm9ybWF0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVJbWFnZV9JbWFnZVBhdGhQYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVJbWFnZV9IYXNQYXJhbWV0ZXIoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUltYWdlX0hpZGVJbWFnZUxhYmVsKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVJbWFnZV9SZXNpemUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUltYWdlX1Jlc2l6ZVN0cmluZyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlUHJvcGVydHlfVmFsdWVSZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlQWdncmVnYXRpb25fT25Hcm91cChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUFnZ3JlZ2F0aW9uX1RleHQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZVB1cmVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbl9WYWx1ZVJlZnMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX1ZhbHVlUmVmcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9WYWx1ZVJlZnMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJSYW5nZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlRGF0ZURheUludGVydmFsX0RhdGVJbnRlcnZhbFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVEYXRlRGF5SW50ZXJ2YWxfRGF0ZVJhbmdlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVOdW1iZXJMb29rdXBfTG9va3VwVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZU51bWJlckxvb2t1cF9EaXNjcmV0ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlU3RyaW5nTG9va3VwX0xvb2t1cFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVTdHJpbmdMb29rdXBfRGlzY3JldGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZURhdGVEYXlMb29rdXBfTG9va3VwVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZURhdGVEYXlMb29rdXBfRGlzY3JldGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZVRleHRDb2xvcl9Db2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUNlbGxDb2xvcl9Db2xvcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUljb25fSWNvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlVHJlbmRfSWNvbihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVRpdGxlX1RleHQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUaXRsZV9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVTdWJUaXRsZV9UZXh0KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3ViVGl0bGVfU3R5bGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlU3ViU3ViVGl0bGVfVGV4dChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVN1YlN1YlRpdGxlX1N0eWxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUxhYmVsX1RleHQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVMYWJlbF9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUZXh0X1RleHQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVUZXh0X1N0eWxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUF1dG9UZXh0X1R5cGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVBdXRvVGV4dF9TdHlsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVJbWFnZV9TaXplKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW1hZ2VfU2NhbGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVJbWFnZV9Tb3VyY2VUeXBlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW1hZ2VfRmlsZW5hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRJbXBvcnRfSW1wb3J0ZWROYW1lc3BhY2UoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisgICAgCisJcHVibGljIHZvaWQgY29tcGxldGVfUmVwb3J0TW9kZWwoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9SZXBvcnRQYWNrYWdlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGFnZVRlbXBsYXRlcyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1NvbWVGb3JtYXRzKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ29sb3JzKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfRm9udHMoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9NZWRpYXMoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9NZWRpYShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1N0eWxlcyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BhZ2VUZW1wbGF0ZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1Vuc2lnbmVkTnVtYmVyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVW5pdEVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QYWdlU2l6ZUVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9PcmllbnRhdGlvbkVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Db2xvcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0ZvbnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Gb250U3R5bGVFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfRm9udEZhbWlseShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0J1aWxkSW5Gb250RmFtaWx5KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQnVpbGRJbkZvbnRGYW1pbHlFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ3VzdG9tRm9udEZhbWlseShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0JvcmRlclN0eWxlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfU3R5bGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9NZWRpYVN0eWxlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGV4dEFsaWduRW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1NvbWVGb3JtYXQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Vb21vRm9ybWF0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfTnVtYmVyRm9ybWF0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ3VycmVuY3lGb3JtYXQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGVGb3JtYXQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfRGF0ZVRpbWVGb3JtYXQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RpbWVGb3JtYXQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUmVwb3J0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUmVuZGVyaW5nRW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JlcG9ydERlc2lnbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JlcG9ydERlc2lnbkZpbGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9SZXBvcnREZXNpZ25UZW1wbGF0ZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0NvbnRhaW5lcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1BhZ2VIZWFkZXIoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QYWdlRGV0YWlsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUGFnZUZvb3RlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0VsZW1lbnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9HcmlkKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfR3JpZFJvdyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0dyaWRDZWxsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfRGF0YW1hcnRUYWJsZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFtYXJ0VGFibGVHcm91cChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0RhdGFtYXJ0VGFibGVEZXRhaWwoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9EYXRhbWFydFRhYmxlUHJvcGVydHkoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9QdXJlQWdncmVnYXRpb25UeXBlRW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0JpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZUZvcm1hdHRlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlSW1hZ2UoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZVZhbHVlRWxlbWVudChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlUHJvcGVydHkoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZUFnZ3JlZ2F0aW9uKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVCYXNlQWdncmVnYXRpb24oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZVB1cmVBZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlQmluYXJ5QWdncmVnYXRpb24oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZUludGVydmFsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVOdW1iZXJJbnRlcnZhbChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlRGF0ZURheUludGVydmFsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVMb29rdXAoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZU51bWJlckxvb2t1cChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlU3RyaW5nTG9va3VwKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVEYXRlRGF5TG9va3VwKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVSYW5nZUVsZW1lbnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9TaWduZWROdW1iZXIoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UYWJsZVRleHRDb2xvcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RhYmxlQ2VsbENvbG9yKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVJY29uKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVGFibGVUcmVuZChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RyZW5kSWNvbkVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UaXRsZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1N1YlRpdGxlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfU3ViU3ViVGl0bGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9MYWJlbChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RleHQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9BdXRvVGV4dChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0JvcmRlclR5cGVFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQXV0b1RleHRFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfSW1hZ2UoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9JbWFnZVNpemVFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfSW1hZ2VTb3VyY2VFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUmVwb3J0SW1wb3J0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1RSQU5TTEFUQUJMRVNUUklORyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxSZXBvcnREU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbFJlcG9ydERTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiNzRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxSZXBvcnREU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5BYnN0cmFjdFJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5wYXJ0aWFsRWRpdGluZy5JUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuRm9sbG93RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51dGlsLlBvbHltb3JwaGljRGlzcGF0Y2hlcjsKKworLyoqCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdyAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBQYXJ0aWFsUmVwb3J0RFNMQ29udGVudEFzc2lzdFBhcnNlciBleHRlbmRzIFJlcG9ydERTTFBhcnNlciBpbXBsZW1lbnRzIElQYXJ0aWFsQ29udGVudEFzc2lzdFBhcnNlciB7CisKKwlwcml2YXRlIEFic3RyYWN0UnVsZSBydWxlOworCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZvcihBYnN0cmFjdFJ1bGUgcnVsZSkgeworCQl0aGlzLnJ1bGUgPSBydWxlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxGb2xsb3dFbGVtZW50PiBnZXRGb2xsb3dFbGVtZW50cyhBYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlciBwYXJzZXIpIHsKKwkJaWYgKHJ1bGUgPT0gbnVsbCB8fCBydWxlLmVJc1Byb3h5KCkpCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCVN0cmluZyBtZXRob2ROYW1lID0gImVudHJ5UnVsZSIgKyBydWxlLmdldE5hbWUoKTsKKwkJUG9seW1vcnBoaWNEaXNwYXRjaGVyPENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4+IGRpc3BhdGNoZXIgPSAKKwkJCW5ldyBQb2x5bW9ycGhpY0Rpc3BhdGNoZXI8Q29sbGVjdGlvbjxGb2xsb3dFbGVtZW50Pj4obWV0aG9kTmFtZSwgMCwgMCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwYXJzZXIpKTsKKwkJZGlzcGF0Y2hlci5pbnZva2UoKTsKKwkJcmV0dXJuIHBhcnNlci5nZXRGb2xsb3dFbGVtZW50cygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL1JlcG9ydERTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL1JlcG9ydERTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTg4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUmVwb3J0RFNMUGFyc2VyLmphdmEKQEAgLTAsMCArMSw5MDcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFic3RyYWN0RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5BYnN0cmFjdENvbnRlbnRBc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuRm9sbG93RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNlcnZpY2VzLlJlcG9ydERTTEdyYW1tYXJBY2Nlc3M7CisKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQYXJzZXIgeworCQorCUBJbmplY3QKKwlwcml2YXRlIFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwcml2YXRlIE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4gbmFtZU1hcHBpbmdzOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMUGFyc2VyIGNyZWF0ZVBhcnNlcigpIHsKKwkJb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFJlcG9ydERTTFBhcnNlciByZXN1bHQgPSBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFJlcG9ydERTTFBhcnNlcihudWxsKTsKKwkJcmVzdWx0LnNldEdyYW1tYXJBY2Nlc3MoZ3JhbW1hckFjY2Vzcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVsZU5hbWUoQWJzdHJhY3RFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKG5hbWVNYXBwaW5ncyA9PSBudWxsKSB7CisJCQluYW1lTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4oKSB7CisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCQkJeworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCksICJydWxlX19Db2xvcl9fQWx0ZXJuYXRpdmVzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRm9udEZhbWlseV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1NvbWVGb3JtYXRfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1JlcG9ydERlc2lnbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbnRhaW5lckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQ29udGFpbmVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRWxlbWVudF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpLCAicnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fQWx0ZXJuYXRpdmVzXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVWYWx1ZUVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1RhYmxlVmFsdWVFbGVtZW50X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1RhYmxlQmFzZUFnZ3JlZ2F0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbnRlcnZhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVGFibGVJbnRlcnZhbF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19UYWJsZUxvb2t1cF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19UYWJsZVJhbmdlRWxlbWVudF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc181XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc182XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMF8wXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8xXzNfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCksICJydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc180XzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMCgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMSgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8zKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xXzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVW5pdEVudW1fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1BhZ2VTaXplRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9yaWVudGF0aW9uRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3JpZW50YXRpb25FbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFN0eWxlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRm9udFN0eWxlRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQnVpbGRJbkZvbnRGYW1pbHlFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVGV4dEFsaWduRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX0N1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyaW5nRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUmVuZGVyaW5nRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19QdXJlQWdncmVnYXRpb25UeXBlRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVHJlbmRJY29uRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Cb3JkZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQXV0b1RleHRFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VTaXplRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSW1hZ2VTaXplRW51bV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSW1hZ2VTb3VyY2VFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfNV8yKCksICJydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzVfMl8yKCksICJydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1BhZ2VUZW1wbGF0ZXNfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ29sb3JzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Gb250c19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX01lZGlhc19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fTWVkaWFfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19TdHlsZXNfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NvbG9yX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwXzJfMSgpLCAicnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwXzJfMigpLCAicnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwXzJfMygpLCAicnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fRm9udF9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0R3JvdXBfMF8zKCksICJydWxlX19Gb250X19Hcm91cF8wXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEdyb3VwXzBfNCgpLCAicnVsZV9fRm9udF9fR3JvdXBfMF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19Gb250X19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX0ZvbnRfX0dyb3VwXzNfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Cb3JkZXJTdHlsZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fU3R5bGVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fU3R5bGVfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzAoKSwgInJ1bGVfX1N0eWxlX19Hcm91cF80XzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzEoKSwgInJ1bGVfX1N0eWxlX19Hcm91cF80XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzIoKSwgInJ1bGVfX1N0eWxlX19Hcm91cF80XzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzJfMigpLCAicnVsZV9fU3R5bGVfX0dyb3VwXzRfMl8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF8zKCksICJydWxlX19TdHlsZV9fR3JvdXBfNF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF80KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF81KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF81X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF82KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF83KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF83X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF84KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF84X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF85KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF85X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF8xMCgpLCAicnVsZV9fU3R5bGVfX0dyb3VwXzRfMTBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzExKCksICJydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEdyb3VwXzRfMTIoKSwgInJ1bGVfX1N0eWxlX19Hcm91cF80XzEyX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF8xMygpLCAicnVsZV9fU3R5bGVfX0dyb3VwXzRfMTNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRHcm91cF80XzE0KCksICJydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEdyb3VwXzRfMTUoKSwgInJ1bGVfX1N0eWxlX19Hcm91cF80XzE1X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfNF8xNigpLCAicnVsZV9fU3R5bGVfX0dyb3VwXzRfMTZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCksICJydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRHcm91cF8zXzIoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18yXzIoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRHcm91cF8zXzMoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM180KCksICJydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzRfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwXzNfNSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM181X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRHcm91cF8zXzYoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM183KCksICJydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzdfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwXzNfOCgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM184X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRHcm91cF8zXzkoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfOV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xMCgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xMigpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xMygpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xNCgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xNSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0R3JvdXBfM18xNigpLCAicnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGVGb3JtYXRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19SZXBvcnRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX1JlcG9ydF9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19SZXBvcnRfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0R3JvdXBfOSgpLCAicnVsZV9fUmVwb3J0X19Hcm91cF85X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldEdyb3VwXzlfMigpLCAicnVsZV9fUmVwb3J0X19Hcm91cF85XzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduRmlsZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19SZXBvcnREZXNpZ25GaWxlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlSGVhZGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1BhZ2VIZWFkZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUGFnZURldGFpbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0dyaWRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRBY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19HcmlkX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fR3JpZFJvd19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX0dyaWRSb3dfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX0dyaWRSb3dfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fR3JpZENlbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fR3JpZENlbGxfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19HcmlkQ2VsbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0R3JvdXBfNCgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0R3JvdXBfNF8xKCksICJydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF80XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEdyb3VwXzZfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF82XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0R3JvdXBfNygpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEdyb3VwXzdfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCksICJydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0dyb3VwXzFfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRHcm91cF8xXzMoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fR3JvdXBfMV8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlRm9ybWF0dGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlRm9ybWF0dGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlSW1hZ2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRHcm91cF8zXzIoKSwgInJ1bGVfX1RhYmxlSW1hZ2VfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlUHJvcGVydHlfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fR3JvdXBfMl8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSwgInJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVVbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlQmluYXJ5QWdncmVnYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVOdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVEYXRlRGF5SW50ZXJ2YWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVN0cmluZ0xvb2t1cEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19UYWJsZVN0cmluZ0xvb2t1cF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5TG9va3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlRGF0ZURheUxvb2t1cF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVUZXh0Q29sb3JfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlQ2VsbENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlQ2VsbENvbG9yX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGFibGVJY29uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RhYmxlVHJlbmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1RpdGxlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZUFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1RpdGxlX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN1YlRpdGxlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1N1YlRpdGxlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1N1YlRpdGxlX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1N1YlN1YlRpdGxlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdWJTdWJUaXRsZUFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1N1YlN1YlRpdGxlX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0xhYmVsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX0xhYmVsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRleHRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fVGV4dF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1RleHRfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQXV0b1RleHRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0QWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fQXV0b1RleHRfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSW1hZ2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fSW1hZ2VfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0SW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1JlcG9ydEltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wKCksICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMF8xKCksICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCksICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF81KCksICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF82KCksICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19PcE90aGVyX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81KCksICJydWxlX19PcE90aGVyX19Hcm91cF81X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMCgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wXzAoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzYoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzZfMV8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzBfMCgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMV8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzMoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzNfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzEoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMF8xXzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wXzBfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzFfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xXzBfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF81KCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfM18wKCksICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzcoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfN18xKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMCgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMigpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80KCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80XzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xXzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzBfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1N0YXRpY1F1YWxpZmllcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMCgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80KCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wXzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8yXzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0TW9kZWxBY2Nlc3MoKS5nZXRQY2tnQXNzaWdubWVudCgpLCAicnVsZV9fUmVwb3J0TW9kZWxfX1Bja2dBc3NpZ25tZW50Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCksICJydWxlX19SZXBvcnRQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzQXNzaWdubWVudF80KCksICJydWxlX19SZXBvcnRQYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfNV8yXzEoKSwgInJ1bGVfX1JlcG9ydFBhY2thZ2VfX0V4dGVybmFsQ3NzVVJJQXNzaWdubWVudF81XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzVfMl8yXzEoKSwgInJ1bGVfX1JlcG9ydFBhY2thZ2VfX0V4dGVybmFsQ3NzVVJJQnVuZGxlQXNzaWdubWVudF81XzJfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRQYWdldGVtcGxhdGVzQXNzaWdubWVudF81XzMoKSwgInJ1bGVfX1JlcG9ydFBhY2thZ2VfX1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzVfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Rm9ybWF0dGVyc0Fzc2lnbm1lbnRfNV80KCksICJydWxlX19SZXBvcnRQYWNrYWdlX19Gb3JtYXR0ZXJzQXNzaWdubWVudF81XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldENvbG9yc0Fzc2lnbm1lbnRfNV81KCksICJydWxlX19SZXBvcnRQYWNrYWdlX19Db2xvcnNBc3NpZ25tZW50XzVfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Rm9udHNBc3NpZ25tZW50XzVfNigpLCAicnVsZV9fUmVwb3J0UGFja2FnZV9fRm9udHNBc3NpZ25tZW50XzVfNiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TWVkaWFzQXNzaWdubWVudF81XzcoKSwgInJ1bGVfX1JlcG9ydFBhY2thZ2VfX01lZGlhc0Fzc2lnbm1lbnRfNV83Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRTdHlsZXNBc3NpZ25tZW50XzVfOCgpLCAicnVsZV9fUmVwb3J0UGFja2FnZV9fU3R5bGVzQXNzaWdubWVudF81XzgiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFJlcG9ydHNBc3NpZ25tZW50XzYoKSwgInJ1bGVfX1JlcG9ydFBhY2thZ2VfX1JlcG9ydHNBc3NpZ25tZW50XzYiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc0FjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1BhZ2VUZW1wbGF0ZXNfX1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzQXNzaWdubWVudF8zKCksICJydWxlX19Tb21lRm9ybWF0c19fRm9ybWF0dGVyc0Fzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0NvbG9yc19fQ29sb3JzQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0ZvbnRzX19Gb250c0Fzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNBc3NpZ25tZW50XzMoKSwgInJ1bGVfX01lZGlhc19fTWVkaWFzQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fTWVkaWFfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzQXNzaWdubWVudF8zKCksICJydWxlX19TdHlsZXNfX1N0eWxlc0Fzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19QYWdlVGVtcGxhdGVfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0U2l6ZUFzc2lnbm1lbnRfNCgpLCAicnVsZV9fUGFnZVRlbXBsYXRlX19TaXplQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE9yaWVudGF0aW9uQXNzaWdubWVudF82KCksICJydWxlX19QYWdlVGVtcGxhdGVfX09yaWVudGF0aW9uQXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblZhbHVlQXNzaWdubWVudF84KCksICJydWxlX19QYWdlVGVtcGxhdGVfX1RvcE1hcmdpblZhbHVlQXNzaWdubWVudF84Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblVuaXRBc3NpZ25tZW50XzkoKSwgInJ1bGVfX1BhZ2VUZW1wbGF0ZV9fVG9wTWFyZ2luVW5pdEFzc2lnbm1lbnRfOSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRMZWZ0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzExKCksICJydWxlX19QYWdlVGVtcGxhdGVfX0xlZnRNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdE1hcmdpblVuaXRBc3NpZ25tZW50XzEyKCksICJydWxlX19QYWdlVGVtcGxhdGVfX0xlZnRNYXJnaW5Vbml0QXNzaWdubWVudF8xMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21NYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTQoKSwgInJ1bGVfX1BhZ2VUZW1wbGF0ZV9fQm90dG9tTWFyZ2luVmFsdWVBc3NpZ25tZW50XzE0Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEJvdHRvbU1hcmdpblVuaXRBc3NpZ25tZW50XzE1KCksICJydWxlX19QYWdlVGVtcGxhdGVfX0JvdHRvbU1hcmdpblVuaXRBc3NpZ25tZW50XzE1Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzE3KCksICJydWxlX19QYWdlVGVtcGxhdGVfX1JpZ2h0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzE3Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTgoKSwgInJ1bGVfX1BhZ2VUZW1wbGF0ZV9fUmlnaHRNYXJnaW5Vbml0QXNzaWdubWVudF8xOCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRIZWFkZXJBc3NpZ25tZW50XzE5KCksICJydWxlX19QYWdlVGVtcGxhdGVfX0hlYWRlckFzc2lnbm1lbnRfMTkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0Rm9vdGVyQXNzaWdubWVudF8yMCgpLCAicnVsZV9fUGFnZVRlbXBsYXRlX19Gb290ZXJBc3NpZ25tZW50XzIwIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fQ29sb3JfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvckFzc2lnbm1lbnRfMl8wKCksICJydWxlX19Db2xvcl9fQ29sb3JBc3NpZ25tZW50XzJfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8xXzEoKSwgInJ1bGVfX0NvbG9yX19CYXNlY29sb3JBc3NpZ25tZW50XzJfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0RGFya2Vuc2J5QXNzaWdubWVudF8yXzFfMygpLCAicnVsZV9fQ29sb3JfX0RhcmtlbnNieUFzc2lnbm1lbnRfMl8xXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRCYXNlY29sb3JBc3NpZ25tZW50XzJfMl8xKCksICJydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldExpZ2h0ZW5zYnlBc3NpZ25tZW50XzJfMl8zKCksICJydWxlX19Db2xvcl9fTGlnaHRlbnNieUFzc2lnbm1lbnRfMl8yXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRCYXNlY29sb3JBc3NpZ25tZW50XzJfM18xKCksICJydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldFRyYW5zZm9ybXNieUFzc2lnbm1lbnRfMl8zXzMoKSwgInJ1bGVfX0NvbG9yX19UcmFuc2Zvcm1zYnlBc3NpZ25tZW50XzJfM18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VGFyZ2V0Y29sb3JBc3NpZ25tZW50XzJfM181KCksICJydWxlX19Db2xvcl9fVGFyZ2V0Y29sb3JBc3NpZ25tZW50XzJfM181Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8wXzEoKSwgInJ1bGVfX0ZvbnRfX05hbWVBc3NpZ25tZW50XzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0RXh0ZW5kc0Fzc2lnbm1lbnRfMF8zXzEoKSwgInJ1bGVfX0ZvbnRfX0V4dGVuZHNBc3NpZ25tZW50XzBfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRGYW1pbHlBc3NpZ25tZW50XzBfNF8xKCksICJydWxlX19Gb250X19GYW1pbHlBc3NpZ25tZW50XzBfNF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRTdHlsZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fRm9udF9fU3R5bGVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEJvbGRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX0ZvbnRfX0JvbGRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFNpemV2YWx1ZUFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX0ZvbnRfX1NpemV2YWx1ZUFzc2lnbm1lbnRfM18wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFNpemV1bml0QXNzaWdubWVudF8zXzBfMigpLCAicnVsZV9fRm9udF9fU2l6ZXVuaXRBc3NpZ25tZW50XzNfMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tQXNzaWdubWVudCgpLCAicnVsZV9fQnVpbGRJbkZvbnRGYW1pbHlfX0N1c3RvbUFzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbUFzc2lnbm1lbnQoKSwgInJ1bGVfX0N1c3RvbUZvbnRGYW1pbHlfX0N1c3RvbUFzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19Cb3JkZXJTdHlsZV9fVHlwZUFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZUFjY2VzcygpLmdldFdpZHRodmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0JvcmRlclN0eWxlX19XaWR0aHZhbHVlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0V2lkdGh1bml0QXNzaWdubWVudF8yKCksICJydWxlX19Cb3JkZXJTdHlsZV9fV2lkdGh1bml0QXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0Q29sb3JBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0JvcmRlclN0eWxlX19Db2xvckFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1N0eWxlX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0RXh0ZW5kc0Fzc2lnbm1lbnRfM18xKCksICJydWxlX19TdHlsZV9fRXh0ZW5kc0Fzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Rm9ybWF0QXNzaWdubWVudF80XzBfMSgpLCAicnVsZV9fU3R5bGVfX0Zvcm1hdEFzc2lnbm1lbnRfNF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRGb250QXNzaWdubWVudF80XzFfMSgpLCAicnVsZV9fU3R5bGVfX0ZvbnRBc3NpZ25tZW50XzRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yQXNzaWdubWVudF80XzJfMSgpLCAicnVsZV9fU3R5bGVfX0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfNF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQXNzaWdubWVudF80XzJfMl8xKCksICJydWxlX19TdHlsZV9fQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUFzc2lnbm1lbnRfNF8yXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFRleHRjb2xvckFzc2lnbm1lbnRfNF8zXzEoKSwgInJ1bGVfX1N0eWxlX19UZXh0Y29sb3JBc3NpZ25tZW50XzRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VGV4dGFsaWduQXNzaWdubWVudF80XzRfMSgpLCAicnVsZV9fU3R5bGVfX1RleHRhbGlnbkFzc2lnbm1lbnRfNF80XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJUb3BBc3NpZ25tZW50XzRfNV8xKCksICJydWxlX19TdHlsZV9fQm9yZGVyVG9wQXNzaWdubWVudF80XzVfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlckJvdHRvbUFzc2lnbm1lbnRfNF82XzEoKSwgInJ1bGVfX1N0eWxlX19Cb3JkZXJCb3R0b21Bc3NpZ25tZW50XzRfNl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyTGVmdEFzc2lnbm1lbnRfNF83XzEoKSwgInJ1bGVfX1N0eWxlX19Cb3JkZXJMZWZ0QXNzaWdubWVudF80XzdfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlclJpZ2h0QXNzaWdubWVudF80XzhfMSgpLCAicnVsZV9fU3R5bGVfX0JvcmRlclJpZ2h0QXNzaWdubWVudF80XzhfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfNF85XzEoKSwgInJ1bGVfX1N0eWxlX19QYWRkaW5nVG9wVmFsdWVBc3NpZ25tZW50XzRfOV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcFVuaXRBc3NpZ25tZW50XzRfOV8yKCksICJydWxlX19TdHlsZV9fUGFkZGluZ1RvcFVuaXRBc3NpZ25tZW50XzRfOV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVZhbHVlQXNzaWdubWVudF80XzEwXzEoKSwgInJ1bGVfX1N0eWxlX19QYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzRfMTBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21Vbml0QXNzaWdubWVudF80XzEwXzIoKSwgInJ1bGVfX1N0eWxlX19QYWRkaW5nQm90dG9tVW5pdEFzc2lnbm1lbnRfNF8xMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xMV8xKCksICJydWxlX19TdHlsZV9fUGFkZGluZ0xlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF80XzExXzIoKSwgInJ1bGVfX1N0eWxlX19QYWRkaW5nTGVmdFVuaXRBc3NpZ25tZW50XzRfMTFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdSaWdodFZhbHVlQXNzaWdubWVudF80XzEyXzEoKSwgInJ1bGVfX1N0eWxlX19QYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xMl8yKCksICJydWxlX19TdHlsZV9fUGFkZGluZ1JpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xMl8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luVG9wVmFsdWVBc3NpZ25tZW50XzRfMTNfMSgpLCAicnVsZV9fU3R5bGVfX01hcmdpblRvcFZhbHVlQXNzaWdubWVudF80XzEzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BVbml0QXNzaWdubWVudF80XzEzXzIoKSwgInJ1bGVfX1N0eWxlX19NYXJnaW5Ub3BVbml0QXNzaWdubWVudF80XzEzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfNF8xNF8xKCksICJydWxlX19TdHlsZV9fTWFyZ2luQm90dG9tVmFsdWVBc3NpZ25tZW50XzRfMTRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTRfMigpLCAicnVsZV9fU3R5bGVfX01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xNV8xKCksICJydWxlX19TdHlsZV9fTWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF80XzE1XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfNF8xNV8yKCksICJydWxlX19TdHlsZV9fTWFyZ2luTGVmdFVuaXRBc3NpZ25tZW50XzRfMTVfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VmFsdWVBc3NpZ25tZW50XzRfMTZfMSgpLCAicnVsZV9fU3R5bGVfX01hcmdpblJpZ2h0VmFsdWVBc3NpZ25tZW50XzRfMTZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xNl8yKCksICJydWxlX19TdHlsZV9fTWFyZ2luUmlnaHRVbml0QXNzaWdubWVudF80XzE2XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNZWRpYXN0eWxlc0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fU3R5bGVfX01lZGlhc3R5bGVzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNZWRpYUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fTWVkaWFBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEZvcm1hdEFzc2lnbm1lbnRfM18wXzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0Zvcm1hdEFzc2lnbm1lbnRfM18wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEZvbnRBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19NZWRpYVN0eWxlX19Gb250QXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fQmFja2dyb3VuZGNvbG9yQXNzaWdubWVudF8zXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUFzc2lnbm1lbnRfM18yXzJfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUFzc2lnbm1lbnRfM18yXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yQXNzaWdubWVudF8zXzNfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fVGV4dGNvbG9yQXNzaWdubWVudF8zXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VGV4dGFsaWduQXNzaWdubWVudF8zXzRfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fVGV4dGFsaWduQXNzaWdubWVudF8zXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wQXNzaWdubWVudF8zXzVfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fQm9yZGVyVG9wQXNzaWdubWVudF8zXzVfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyQm90dG9tQXNzaWdubWVudF8zXzZfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fQm9yZGVyQm90dG9tQXNzaWdubWVudF8zXzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyTGVmdEFzc2lnbm1lbnRfM183XzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0JvcmRlckxlZnRBc3NpZ25tZW50XzNfN18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJSaWdodEFzc2lnbm1lbnRfM184XzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX0JvcmRlclJpZ2h0QXNzaWdubWVudF8zXzhfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcFZhbHVlQXNzaWdubWVudF8zXzlfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fUGFkZGluZ1RvcFZhbHVlQXNzaWdubWVudF8zXzlfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcFVuaXRBc3NpZ25tZW50XzNfOV8yKCksICJydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfM185XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xMF8xKCksICJydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTBfMigpLCAicnVsZV9fTWVkaWFTdHlsZV9fUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRWYWx1ZUFzc2lnbm1lbnRfM18xMV8xKCksICJydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nTGVmdFZhbHVlQXNzaWdubWVudF8zXzExXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0VW5pdEFzc2lnbm1lbnRfM18xMV8yKCksICJydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nTGVmdFVuaXRBc3NpZ25tZW50XzNfMTFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0VmFsdWVBc3NpZ25tZW50XzNfMTJfMSgpLCAicnVsZV9fTWVkaWFTdHlsZV9fUGFkZGluZ1JpZ2h0VmFsdWVBc3NpZ25tZW50XzNfMTJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0VW5pdEFzc2lnbm1lbnRfM18xMl8yKCksICJydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nUmlnaHRVbml0QXNzaWdubWVudF8zXzEyXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblRvcFZhbHVlQXNzaWdubWVudF8zXzEzXzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX01hcmdpblRvcFZhbHVlQXNzaWdubWVudF8zXzEzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblRvcFVuaXRBc3NpZ25tZW50XzNfMTNfMigpLCAicnVsZV9fTWVkaWFTdHlsZV9fTWFyZ2luVG9wVW5pdEFzc2lnbm1lbnRfM18xM18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xNF8xKCksICJydWxlX19NZWRpYVN0eWxlX19NYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xNF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21Vbml0QXNzaWdubWVudF8zXzE0XzIoKSwgInJ1bGVfX01lZGlhU3R5bGVfX01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF8zXzE1XzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX01hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfM18xNV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfM18xNV8yKCksICJydWxlX19NZWRpYVN0eWxlX19NYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfM18xNV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5SaWdodFZhbHVlQXNzaWdubWVudF8zXzE2XzEoKSwgInJ1bGVfX01lZGlhU3R5bGVfX01hcmdpblJpZ2h0VmFsdWVBc3NpZ25tZW50XzNfMTZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luUmlnaHRVbml0QXNzaWdubWVudF8zXzE2XzIoKSwgInJ1bGVfX01lZGlhU3R5bGVfX01hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfM18xNl8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19Vb21vRm9ybWF0X19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuQXNzaWdubWVudF80KCksICJydWxlX19Vb21vRm9ybWF0X19VaV9wYXR0ZXJuQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNigpLCAicnVsZV9fVW9tb0Zvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzYiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbkFzc2lnbm1lbnRfOCgpLCAicnVsZV9fVW9tb0Zvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF84Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX051bWJlckZvcm1hdF9fTmFtZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuQXNzaWdubWVudF80KCksICJydWxlX19OdW1iZXJGb3JtYXRfX1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82KCksICJydWxlX19OdW1iZXJGb3JtYXRfX1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpLCAicnVsZV9fTnVtYmVyRm9ybWF0X19SZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSwgInJ1bGVfX051bWJlckZvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF85Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fQ3VycmVuY3lGb3JtYXRfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuQXNzaWdubWVudF80KCksICJydWxlX19DdXJyZW5jeUZvcm1hdF9fVWlfcGF0dGVybkFzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpLCAicnVsZV9fQ3VycmVuY3lGb3JtYXRfX1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83KCksICJydWxlX19DdXJyZW5jeUZvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSwgInJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19UZXh0YWxpZ25Bc3NpZ25tZW50XzkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0RhdGVGb3JtYXRfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSwgInJ1bGVfX0RhdGVGb3JtYXRfX1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0ZUZvcm1hdF9fUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpLCAicnVsZV9fRGF0ZUZvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbkFzc2lnbm1lbnRfOSgpLCAicnVsZV9fRGF0ZUZvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF85Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fRGF0ZVRpbWVGb3JtYXRfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuQXNzaWdubWVudF80KCksICJydWxlX19EYXRlVGltZUZvcm1hdF9fVWlfcGF0dGVybkFzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0ZVRpbWVGb3JtYXRfX1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83KCksICJydWxlX19EYXRlVGltZUZvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSwgInJ1bGVfX0RhdGVUaW1lRm9ybWF0X19UZXh0YWxpZ25Bc3NpZ25tZW50XzkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1RpbWVGb3JtYXRfX05hbWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSwgInJ1bGVfX1RpbWVGb3JtYXRfX1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpLCAicnVsZV9fVGltZUZvcm1hdF9fUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpLCAicnVsZV9fVGltZUZvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbkFzc2lnbm1lbnRfOSgpLCAicnVsZV9fVGltZUZvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF85Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1JlcG9ydF9fTmFtZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfMl8wKCksICJydWxlX19SZXBvcnRfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19SZXBvcnRfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRUb29sYmFyQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1JlcG9ydF9fVG9vbGJhckFzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldERhdGFtYXJ0UmVmQXNzaWdubWVudF82KCksICJydWxlX19SZXBvcnRfX0RhdGFtYXJ0UmVmQXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldFJlbmRlcmluZ0Fzc2lnbm1lbnRfOCgpLCAicnVsZV9fUmVwb3J0X19SZW5kZXJpbmdBc3NpZ25tZW50XzgiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklBc3NpZ25tZW50XzlfMSgpLCAicnVsZV9fUmVwb3J0X19FeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfOV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldEV4dGVybmFsQ3NzVVJJQnVuZGxlQXNzaWdubWVudF85XzJfMSgpLCAicnVsZV9fUmVwb3J0X19FeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfOV8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0UGFnZVRlbXBsYXRlQXNzaWdubWVudF8xMSgpLCAicnVsZV9fUmVwb3J0X19QYWdlVGVtcGxhdGVBc3NpZ25tZW50XzExIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldE1lZGlhQXNzaWdubWVudF8xMygpLCAicnVsZV9fUmVwb3J0X19NZWRpYUFzc2lnbm1lbnRfMTMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RGVzaWduQXNzaWdubWVudF8xNCgpLCAicnVsZV9fUmVwb3J0X19EZXNpZ25Bc3NpZ25tZW50XzE0Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkZpbGVBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19SZXBvcnREZXNpZ25GaWxlX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXRIZWFkZXJBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19IZWFkZXJBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXREZXRhaWxBc3NpZ25tZW50XzQoKSwgInJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19EZXRhaWxBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXRGb290ZXJBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Gb290ZXJBc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUhlYWRlckFjY2VzcygpLmdldFNob3dPbkZpcnN0QXNzaWdubWVudF8zKCksICJydWxlX19QYWdlSGVhZGVyX19TaG93T25GaXJzdEFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlSGVhZGVyQWNjZXNzKCkuZ2V0SGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1BhZ2VIZWFkZXJfX0hlaWdodFZhbHVlQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRIZWlnaHRVbml0QXNzaWdubWVudF82KCksICJydWxlX19QYWdlSGVhZGVyX19IZWlnaHRVbml0QXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNygpLCAicnVsZV9fUGFnZUhlYWRlcl9fRWxlbWVudHNBc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZURldGFpbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zKCksICJydWxlX19QYWdlRGV0YWlsX19FbGVtZW50c0Fzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0U2hvd09uTGFzdEFzc2lnbm1lbnRfMygpLCAicnVsZV9fUGFnZUZvb3Rlcl9fU2hvd09uTGFzdEFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0SGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1BhZ2VGb290ZXJfX0hlaWdodFZhbHVlQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJBY2Nlc3MoKS5nZXRIZWlnaHRVbml0QXNzaWdubWVudF82KCksICJydWxlX19QYWdlRm9vdGVyX19IZWlnaHRVbml0QXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfNygpLCAicnVsZV9fUGFnZUZvb3Rlcl9fRWxlbWVudHNBc3NpZ25tZW50XzciKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fR3JpZF9fTmFtZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRBY2Nlc3MoKS5nZXRSb3dzQXNzaWdubWVudF80KCksICJydWxlX19HcmlkX19Sb3dzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX0dyaWRSb3dfX05hbWVBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93QWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fR3JpZFJvd19fU3R5bGVBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93QWNjZXNzKCkuZ2V0Q2VsbHNBc3NpZ25tZW50XzUoKSwgInJ1bGVfX0dyaWRSb3dfX0NlbGxzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19HcmlkQ2VsbF9fTmFtZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0Q29sdW1uc3BhbkFzc2lnbm1lbnRfM18xKCksICJydWxlX19HcmlkQ2VsbF9fQ29sdW1uc3BhbkFzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzUoKSwgInJ1bGVfX0dyaWRDZWxsX19FbGVtZW50c0Fzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZV9fU3R5bGVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0RGV0YWlsaGVhZGVyQXNzaWdubWVudF8zXzAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0RldGFpbGhlYWRlckFzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRIZWFkZXJzdHlsZUFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0hlYWRlcnN0eWxlQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0RGV0YWlsZm9vdGVyQXNzaWdubWVudF80XzAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0RldGFpbGZvb3RlckFzc2lnbm1lbnRfNF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRGb290ZXJzdHlsZUFzc2lnbm1lbnRfNF8xXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVfX0Zvb3RlcnN0eWxlQXNzaWdubWVudF80XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0R3JvdXBzQXNzaWdubWVudF81KCksICJydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cHNBc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldERldGFpbEFzc2lnbm1lbnRfNigpLCAicnVsZV9fRGF0YW1hcnRUYWJsZV9fRGV0YWlsQXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fTmFtZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRHcm91cGluZ1JlZkFzc2lnbm1lbnRfMygpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cGluZ1JlZkFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRIZWFkZXJBc3NpZ25tZW50XzUoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fSGVhZGVyQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldERldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wKCksICJydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0RldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEhlYWRlcnN0eWxlQXNzaWdubWVudF82XzFfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19IZWFkZXJzdHlsZUFzc2lnbm1lbnRfNl8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0RGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fRGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0Rm9vdGVyc3R5bGVBc3NpZ25tZW50XzdfMV8xKCksICJydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0Zvb3RlcnN0eWxlQXNzaWdubWVudF83XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRGb290ZXJBc3NpZ25tZW50XzgoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fRm9vdGVyQXNzaWdubWVudF84Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjY2VzcygpLmdldFN0eWxlQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fU3R5bGVBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY2Nlc3MoKS5nZXRSb3dzQXNzaWdubWVudF80KCksICJydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX1Jvd3NBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19TdHlsZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjY2VzcygpLmdldFJvd3NBc3NpZ25tZW50XzQoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fUm93c0Fzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fU3R5bGVBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0Q29sdW1uRm9ybWF0dGVyc0Fzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0NvbHVtbkZvcm1hdHRlcnNBc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldENvbHVtbkFzc2lnbm1lbnRfMCgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Db2x1bW5Bc3NpZ25tZW50XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX1N0eWxlQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRIYXNJbWFnZUFzc2lnbm1lbnRfMV8xXzAoKSwgInJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fSGFzSW1hZ2VBc3NpZ25tZW50XzFfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEltYWdlQXNzaWdubWVudF8xXzFfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19JbWFnZUFzc2lnbm1lbnRfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SGlkZUxhYmVsSW50ZXJ2YWxBc3NpZ25tZW50XzFfMl8xKCksICJydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0hpZGVMYWJlbEludGVydmFsQXNzaWdubWVudF8xXzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNBc3NpZ25tZW50XzFfMl8zKCksICJydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0ludGVydmFsc0Fzc2lnbm1lbnRfMV8yXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SGlkZUxhYmVsTG9va3VwQXNzaWdubWVudF8xXzNfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19IaWRlTGFiZWxMb29rdXBBc3NpZ25tZW50XzFfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNBc3NpZ25tZW50XzFfM18zKCksICJydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0xvb2t1cHNBc3NpZ25tZW50XzFfM18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlRm9ybWF0dGVyQWNjZXNzKCkuZ2V0Rm9ybWF0QXNzaWdubWVudF8yKCksICJydWxlX19UYWJsZUZvcm1hdHRlcl9fRm9ybWF0QXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRJbWFnZVBhdGhQYXR0ZXJuQXNzaWdubWVudF8yKCksICJydWxlX19UYWJsZUltYWdlX19JbWFnZVBhdGhQYXR0ZXJuQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRIYXNQYXJhbWV0ZXJBc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fVGFibGVJbWFnZV9fSGFzUGFyYW1ldGVyQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldEhpZGVJbWFnZUxhYmVsQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1RhYmxlSW1hZ2VfX0hpZGVJbWFnZUxhYmVsQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldFJlc2l6ZUFzc2lnbm1lbnRfM18yXzAoKSwgInJ1bGVfX1RhYmxlSW1hZ2VfX1Jlc2l6ZUFzc2lnbm1lbnRfM18yXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldFJlc2l6ZVN0cmluZ0Fzc2lnbm1lbnRfM18yXzEoKSwgInJ1bGVfX1RhYmxlSW1hZ2VfX1Jlc2l6ZVN0cmluZ0Fzc2lnbm1lbnRfM18yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFZhbHVlUmVmQXNzaWdubWVudF8xKCksICJydWxlX19UYWJsZVByb3BlcnR5X19WYWx1ZVJlZkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWdncmVnYXRpb25Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRPbkdyb3VwQXNzaWdubWVudF8yXzBfMSgpLCAicnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fT25Hcm91cEFzc2lnbm1lbnRfMl8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFRleHRBc3NpZ25tZW50XzJfMV8xKCksICJydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19UZXh0QXNzaWdubWVudF8yXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudCgpLCAicnVsZV9fVGFibGVQdXJlQWdncmVnYXRpb25fX0FnZ3JlZ2F0aW9uQXNzaWdubWVudCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRBZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMCgpLCAicnVsZV9fVGFibGVVbmFyeUFnZ3JlZ2F0aW9uX19BZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVJlZnNBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbl9fVmFsdWVSZWZzQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudF8wKCksICJydWxlX19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fX0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFZhbHVlUmVmc0Fzc2lnbm1lbnRfMygpLCAicnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19WYWx1ZVJlZnNBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudF8wKCksICJydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19BZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VmFsdWVSZWZzQXNzaWdubWVudF8zKCksICJydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19WYWx1ZVJlZnNBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFZhbHVlUmVmc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9fVmFsdWVSZWZzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yKCksICJydWxlX19UYWJsZU51bWJlckludGVydmFsX19OdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJSYW5nZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fVGFibGVOdW1iZXJJbnRlcnZhbF9fTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXREYXRlSW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fVGFibGVEYXRlRGF5SW50ZXJ2YWxfX0RhdGVJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsQWNjZXNzKCkuZ2V0RGF0ZVJhbmdlQXNzaWdubWVudF8zKCksICJydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fRGF0ZVJhbmdlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwQWNjZXNzKCkuZ2V0TG9va3VwVmFsdWVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Mb29rdXBWYWx1ZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldERpc2NyZXRlQXNzaWdubWVudF8zKCksICJydWxlX19UYWJsZU51bWJlckxvb2t1cF9fRGlzY3JldGVBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXRMb29rdXBWYWx1ZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fVGFibGVTdHJpbmdMb29rdXBfX0xvb2t1cFZhbHVlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlU3RyaW5nTG9va3VwQWNjZXNzKCkuZ2V0RGlzY3JldGVBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1RhYmxlU3RyaW5nTG9va3VwX19EaXNjcmV0ZUFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXRMb29rdXBWYWx1ZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fVGFibGVEYXRlRGF5TG9va3VwX19Mb29rdXBWYWx1ZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXREaXNjcmV0ZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fVGFibGVEYXRlRGF5TG9va3VwX19EaXNjcmV0ZUFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRleHRDb2xvckFjY2VzcygpLmdldENvbG9yQXNzaWdubWVudF8xKCksICJydWxlX19UYWJsZVRleHRDb2xvcl9fQ29sb3JBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVDZWxsQ29sb3JBY2Nlc3MoKS5nZXRDb2xvckFzc2lnbm1lbnRfMSgpLCAicnVsZV9fVGFibGVDZWxsQ29sb3JfX0NvbG9yQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlSWNvbkFjY2VzcygpLmdldEljb25Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1RhYmxlSWNvbl9fSWNvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0SWNvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fVGFibGVUcmVuZF9fSWNvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZUFjY2VzcygpLmdldFRleHRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1RpdGxlX19UZXh0QXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fVGl0bGVfX1N0eWxlQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVBY2Nlc3MoKS5nZXRUZXh0QXNzaWdubWVudF8yKCksICJydWxlX19TdWJUaXRsZV9fVGV4dEFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldFN0eWxlQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1N1YlRpdGxlX19TdHlsZUFzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0VGV4dEFzc2lnbm1lbnRfMigpLCAicnVsZV9fU3ViU3ViVGl0bGVfX1RleHRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVBY2Nlc3MoKS5nZXRTdHlsZUFzc2lnbm1lbnRfM18xKCksICJydWxlX19TdWJTdWJUaXRsZV9fU3R5bGVBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbEFjY2VzcygpLmdldFRleHRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX0xhYmVsX19UZXh0QXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0U3R5bGVBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fTGFiZWxfX1N0eWxlQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFjY2VzcygpLmdldFRleHRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1RleHRfX1RleHRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFjY2VzcygpLmdldFN0eWxlQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX1RleHRfX1N0eWxlQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xKCksICJydWxlX19BdXRvVGV4dF9fVHlwZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEFjY2VzcygpLmdldFN0eWxlQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX0F1dG9UZXh0X19TdHlsZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0U2l6ZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSW1hZ2VfX1NpemVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRTY2FsZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19JbWFnZV9fU2NhbGVBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZUFjY2VzcygpLmdldFNvdXJjZVR5cGVBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0ltYWdlX19Tb3VyY2VUeXBlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0RmlsZW5hbWVBc3NpZ25tZW50XzQoKSwgInJ1bGVfX0ltYWdlX19GaWxlbmFtZUFzc2lnbm1lbnRfNCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fUmVwb3J0SW1wb3J0X19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCksICJydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCksICJydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzBfMSgpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZEFzc2lnbm1lbnRfMF8yKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xKCksICJydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF81KCksICJydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlQXNzaWdubWVudF82XzEoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoQXNzaWdubWVudF8yXzFfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXNlc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEFzc2lnbm1lbnRfNV8yKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF8zXzBfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCb2R5QXNzaWdubWVudF81KCksICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzJfMF8wXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSaWdodEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80KCksICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCksICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEFycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF80KCksICJydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV80XzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSgpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpLCAicnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljQXNzaWdubWVudF8xXzBfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEV4dGVuc2lvbkFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMF8yKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8wXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgInJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAicnVsZV9fU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgInJ1bGVfX01lZGlhU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMSgpLCAicnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Vbm9yZGVyZWRHcm91cF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksICJydWxlX19UYWJsZUltYWdlX19Vbm9yZGVyZWRHcm91cF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksICJydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19Vbm9yZGVyZWRHcm91cF8yIik7CisJCQkJfQorCQkJfTsKKwkJfQorCQlyZXR1cm4gbmFtZU1hcHBpbmdzLmdldChlbGVtZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4gZ2V0Rm9sbG93RWxlbWVudHMoQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXIgcGFyc2VyKSB7CisJCXRyeSB7CisJCQlvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMUGFyc2VyIHR5cGVkUGFyc2VyID0gKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIpIHBhcnNlcjsKKwkJCXR5cGVkUGFyc2VyLmVudHJ5UnVsZVJlcG9ydE1vZGVsKCk7CisJCQlyZXR1cm4gdHlwZWRQYXJzZXIuZ2V0Rm9sbG93RWxlbWVudHMoKTsKKwkJfSBjYXRjaChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluaXRpYWxIaWRkZW5Ub2tlbnMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geyAiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiB9OworCX0KKwkKKwlwdWJsaWMgUmVwb3J0RFNMR3JhbW1hckFjY2VzcyBnZXRHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5ncmFtbWFyQWNjZXNzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQWNjZXNzKFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworCQl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1M2VkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nCkBAIC0wLDAgKzEsMTAwMTUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworZ3JhbW1hciBJbnRlcm5hbFJlcG9ydERTTDsKKworb3B0aW9ucyB7CisJc3VwZXJDbGFzcz1BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKKwliYWNrdHJhY2s9dHJ1ZTsKKwkKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKK30KKworQHBhcnNlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbDsgCisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW0uSGlkZGVuVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkRGQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJ2aWNlcy5SZXBvcnREU0xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworIAorIAlwcml2YXRlIFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAJCisgICAgcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAJdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKyAgICAJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRm9yVG9rZW5OYW1lKFN0cmluZyB0b2tlbk5hbWUpIHsKKyAgICAJcmV0dXJuIHRva2VuTmFtZTsKKyAgICB9CisKK30KKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnRNb2RlbAorZW50cnlSdWxlUmVwb3J0TW9kZWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydE1vZGVsUnVsZSgpKTsgfQorCSBydWxlUmVwb3J0TW9kZWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRNb2RlbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSZXBvcnRNb2RlbAorcnVsZVJlcG9ydE1vZGVsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydE1vZGVsQWNjZXNzKCkuZ2V0UGNrZ0Fzc2lnbm1lbnQoKSk7IH0KKyhydWxlX19SZXBvcnRNb2RlbF9fUGNrZ0Fzc2lnbm1lbnQpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydE1vZGVsQWNjZXNzKCkuZ2V0UGNrZ0Fzc2lnbm1lbnQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnRQYWNrYWdlCitlbnRyeVJ1bGVSZXBvcnRQYWNrYWdlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsgfQorCSBydWxlUmVwb3J0UGFja2FnZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0UGFja2FnZQorcnVsZVJlcG9ydFBhY2thZ2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGFnZVRlbXBsYXRlcworZW50cnlSdWxlUGFnZVRlbXBsYXRlcyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc1J1bGUoKSk7IH0KKwkgcnVsZVBhZ2VUZW1wbGF0ZXMKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBhZ2VUZW1wbGF0ZXMKK3J1bGVQYWdlVGVtcGxhdGVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZXNfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVNvbWVGb3JtYXRzCitlbnRyeVJ1bGVTb21lRm9ybWF0cyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNSdWxlKCkpOyB9CisJIHJ1bGVTb21lRm9ybWF0cworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFNvbWVGb3JtYXRzCitydWxlU29tZUZvcm1hdHMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ29sb3JzCitlbnRyeVJ1bGVDb2xvcnMgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yc1J1bGUoKSk7IH0KKwkgcnVsZUNvbG9ycworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yc1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDb2xvcnMKK3J1bGVDb2xvcnMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Db2xvcnNfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRm9udHMKK2VudHJ5UnVsZUZvbnRzIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250c1J1bGUoKSk7IH0KKwkgcnVsZUZvbnRzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRm9udHMKK3J1bGVGb250cworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fRm9udHNfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVNZWRpYXMKK2VudHJ5UnVsZU1lZGlhcyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzUnVsZSgpKTsgfQorCSBydWxlTWVkaWFzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE1lZGlhcworcnVsZU1lZGlhcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX01lZGlhc19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVNZWRpYQorZW50cnlSdWxlTWVkaWEgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE1lZGlhUnVsZSgpKTsgfQorCSBydWxlTWVkaWEKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBNZWRpYQorcnVsZU1lZGlhCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE1lZGlhQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19NZWRpYV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVN0eWxlcworZW50cnlSdWxlU3R5bGVzIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNSdWxlKCkpOyB9CisJIHJ1bGVTdHlsZXMKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU3R5bGVzCitydWxlU3R5bGVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fU3R5bGVzX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBhZ2VUZW1wbGF0ZQorZW50cnlSdWxlUGFnZVRlbXBsYXRlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOyB9CisJIHJ1bGVQYWdlVGVtcGxhdGUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGFnZVRlbXBsYXRlCitydWxlUGFnZVRlbXBsYXRlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVVuc2lnbmVkTnVtYmVyCitlbnRyeVJ1bGVVbnNpZ25lZE51bWJlciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5zaWduZWROdW1iZXJSdWxlKCkpOyB9CisJIHJ1bGVVbnNpZ25lZE51bWJlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuc2lnbmVkTnVtYmVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFVuc2lnbmVkTnVtYmVyCitydWxlVW5zaWduZWROdW1iZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5zaWduZWROdW1iZXJBY2Nlc3MoKS5nZXROdW1iZXJQYXJzZXJSdWxlQ2FsbCgpKTsgfQorCXJ1bGVOdW1iZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbnNpZ25lZE51bWJlckFjY2VzcygpLmdldE51bWJlclBhcnNlclJ1bGVDYWxsKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ29sb3IKK2VudHJ5UnVsZUNvbG9yIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvclJ1bGUoKSk7IH0KKwkgcnVsZUNvbG9yCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ29sb3IKK3J1bGVDb2xvcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQ29sb3JfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGb250CitlbnRyeVJ1bGVGb250IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKTsgfQorCSBydWxlRm9udAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRm9udAorcnVsZUZvbnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOyB9CisocnVsZV9fRm9udF9fVW5vcmRlcmVkR3JvdXApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRm9udEZhbWlseQorZW50cnlSdWxlRm9udEZhbWlseSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseVJ1bGUoKSk7IH0KKwkgcnVsZUZvbnRGYW1pbHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEZvbnRGYW1pbHkKK3J1bGVGb250RmFtaWx5CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Gb250RmFtaWx5X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUJ1aWxkSW5Gb250RmFtaWx5CitlbnRyeVJ1bGVCdWlsZEluRm9udEZhbWlseSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlSdWxlKCkpOyB9CisJIHJ1bGVCdWlsZEluRm9udEZhbWlseQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEJ1aWxkSW5Gb250RmFtaWx5CitydWxlQnVpbGRJbkZvbnRGYW1pbHkKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRDdXN0b21Bc3NpZ25tZW50KCkpOyB9CisocnVsZV9fQnVpbGRJbkZvbnRGYW1pbHlfX0N1c3RvbUFzc2lnbm1lbnQpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRDdXN0b21Bc3NpZ25tZW50KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ3VzdG9tRm9udEZhbWlseQorZW50cnlSdWxlQ3VzdG9tRm9udEZhbWlseSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseVJ1bGUoKSk7IH0KKwkgcnVsZUN1c3RvbUZvbnRGYW1pbHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDdXN0b21Gb250RmFtaWx5UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEN1c3RvbUZvbnRGYW1pbHkKK3J1bGVDdXN0b21Gb250RmFtaWx5CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEN1c3RvbUZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRDdXN0b21Bc3NpZ25tZW50KCkpOyB9CisocnVsZV9fQ3VzdG9tRm9udEZhbWlseV9fQ3VzdG9tQXNzaWdubWVudCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDdXN0b21Gb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tQXNzaWdubWVudCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUJvcmRlclN0eWxlCitlbnRyeVJ1bGVCb3JkZXJTdHlsZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVSdWxlKCkpOyB9CisJIHJ1bGVCb3JkZXJTdHlsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEJvcmRlclN0eWxlCitydWxlQm9yZGVyU3R5bGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0JvcmRlclN0eWxlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU3R5bGUKK2VudHJ5UnVsZVN0eWxlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7IH0KKwkgcnVsZVN0eWxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU3R5bGUKK3J1bGVTdHlsZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fU3R5bGVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVNZWRpYVN0eWxlCitlbnRyeVJ1bGVNZWRpYVN0eWxlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsgfQorCSBydWxlTWVkaWFTdHlsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgTWVkaWFTdHlsZQorcnVsZU1lZGlhU3R5bGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU29tZUZvcm1hdAorZW50cnlSdWxlU29tZUZvcm1hdCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdFJ1bGUoKSk7IH0KKwkgcnVsZVNvbWVGb3JtYXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFNvbWVGb3JtYXQKK3J1bGVTb21lRm9ybWF0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Tb21lRm9ybWF0X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVVvbW9Gb3JtYXQKK2VudHJ5UnVsZVVvbW9Gb3JtYXQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOyB9CisJIHJ1bGVVb21vRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBVb21vRm9ybWF0CitydWxlVW9tb0Zvcm1hdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Vb21vRm9ybWF0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVOdW1iZXJGb3JtYXQKK2VudHJ5UnVsZU51bWJlckZvcm1hdCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsgfQorCSBydWxlTnVtYmVyRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE51bWJlckZvcm1hdAorcnVsZU51bWJlckZvcm1hdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDdXJyZW5jeUZvcm1hdAorZW50cnlSdWxlQ3VycmVuY3lGb3JtYXQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpKTsgfQorCSBydWxlQ3VycmVuY3lGb3JtYXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDdXJyZW5jeUZvcm1hdAorcnVsZUN1cnJlbmN5Rm9ybWF0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZURhdGVGb3JtYXQKK2VudHJ5UnVsZURhdGVGb3JtYXQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOyB9CisJIHJ1bGVEYXRlRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRlRm9ybWF0CitydWxlRGF0ZUZvcm1hdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRlVGltZUZvcm1hdAorZW50cnlSdWxlRGF0ZVRpbWVGb3JtYXQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0UnVsZSgpKTsgfQorCSBydWxlRGF0ZVRpbWVGb3JtYXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRlVGltZUZvcm1hdAorcnVsZURhdGVUaW1lRm9ybWF0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRpbWVGb3JtYXQKK2VudHJ5UnVsZVRpbWVGb3JtYXQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRSdWxlKCkpOyB9CisJIHJ1bGVUaW1lRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUaW1lRm9ybWF0CitydWxlVGltZUZvcm1hdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UaW1lRm9ybWF0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnQKK2VudHJ5UnVsZVJlcG9ydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UnVsZSgpKTsgfQorCSBydWxlUmVwb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlcG9ydAorcnVsZVJlcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnREZXNpZ24KK2VudHJ5UnVsZVJlcG9ydERlc2lnbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduUnVsZSgpKTsgfQorCSBydWxlUmVwb3J0RGVzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlcG9ydERlc2lnbgorcnVsZVJlcG9ydERlc2lnbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19SZXBvcnREZXNpZ25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnREZXNpZ25GaWxlCitlbnRyeVJ1bGVSZXBvcnREZXNpZ25GaWxlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25GaWxlUnVsZSgpKTsgfQorCSBydWxlUmVwb3J0RGVzaWduRmlsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkZpbGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0RGVzaWduRmlsZQorcnVsZVJlcG9ydERlc2lnbkZpbGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduRmlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUmVwb3J0RGVzaWduRmlsZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduRmlsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0RGVzaWduVGVtcGxhdGUKK2VudHJ5UnVsZVJlcG9ydERlc2lnblRlbXBsYXRlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZVJ1bGUoKSk7IH0KKwkgcnVsZVJlcG9ydERlc2lnblRlbXBsYXRlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0RGVzaWduVGVtcGxhdGUKK3J1bGVSZXBvcnREZXNpZ25UZW1wbGF0ZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGFnZUhlYWRlcgorZW50cnlSdWxlUGFnZUhlYWRlciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUhlYWRlclJ1bGUoKSk7IH0KKwkgcnVsZVBhZ2VIZWFkZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlSGVhZGVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBhZ2VIZWFkZXIKK3J1bGVQYWdlSGVhZGVyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1BhZ2VIZWFkZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBhZ2VEZXRhaWwKK2VudHJ5UnVsZVBhZ2VEZXRhaWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VEZXRhaWxSdWxlKCkpOyB9CisJIHJ1bGVQYWdlRGV0YWlsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZURldGFpbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQYWdlRGV0YWlsCitydWxlUGFnZURldGFpbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRGV0YWlsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRGV0YWlsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQYWdlRm9vdGVyCitlbnRyeVJ1bGVQYWdlRm9vdGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyUnVsZSgpKTsgfQorCSBydWxlUGFnZUZvb3RlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGFnZUZvb3RlcgorcnVsZVBhZ2VGb290ZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUGFnZUZvb3Rlcl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRWxlbWVudAorZW50cnlSdWxlRWxlbWVudCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudFJ1bGUoKSk7IH0KKwkgcnVsZUVsZW1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEVsZW1lbnQKK3J1bGVFbGVtZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19FbGVtZW50X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUdyaWQKK2VudHJ5UnVsZUdyaWQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEdyaWRSdWxlKCkpOyB9CisJIHJ1bGVHcmlkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBHcmlkCitydWxlR3JpZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19HcmlkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVHcmlkUm93CitlbnRyeVJ1bGVHcmlkUm93IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93UnVsZSgpKTsgfQorCSBydWxlR3JpZFJvdworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgR3JpZFJvdworcnVsZUdyaWRSb3cKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fR3JpZFJvd19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlR3JpZENlbGwKK2VudHJ5UnVsZUdyaWRDZWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbFJ1bGUoKSk7IH0KKwkgcnVsZUdyaWRDZWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgR3JpZENlbGwKK3J1bGVHcmlkQ2VsbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fR3JpZENlbGxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhbWFydFRhYmxlCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUnVsZSgpKTsgfQorCSBydWxlRGF0YW1hcnRUYWJsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZQorcnVsZURhdGFtYXJ0VGFibGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZUdyb3VwCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXAgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cFJ1bGUoKSk7IH0KKwkgcnVsZURhdGFtYXJ0VGFibGVHcm91cAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhbWFydFRhYmxlR3JvdXAKK3J1bGVEYXRhbWFydFRhYmxlR3JvdXAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlclJ1bGUoKSk7IH0KKwkgcnVsZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIKK3J1bGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlclJ1bGUoKSk7IH0KKwkgcnVsZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIKK3J1bGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZURldGFpbAorZW50cnlSdWxlRGF0YW1hcnRUYWJsZURldGFpbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbFJ1bGUoKSk7IH0KKwkgcnVsZURhdGFtYXJ0VGFibGVEZXRhaWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIERhdGFtYXJ0VGFibGVEZXRhaWwKK3J1bGVEYXRhbWFydFRhYmxlRGV0YWlsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVQcm9wZXJ0eQorZW50cnlSdWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOyB9CisJIHJ1bGVEYXRhbWFydFRhYmxlUHJvcGVydHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZVByb3BlcnR5CitydWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUltYWdlCitlbnRyeVJ1bGVUYWJsZUltYWdlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlUnVsZSgpKTsgfQorCSBydWxlVGFibGVJbWFnZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVJbWFnZQorcnVsZVRhYmxlSW1hZ2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVWYWx1ZUVsZW1lbnQKK2VudHJ5UnVsZVRhYmxlVmFsdWVFbGVtZW50IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudFJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlVmFsdWVFbGVtZW50Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVWYWx1ZUVsZW1lbnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVWYWx1ZUVsZW1lbnQKK3J1bGVUYWJsZVZhbHVlRWxlbWVudAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1RhYmxlVmFsdWVFbGVtZW50X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVWYWx1ZUVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVByb3BlcnR5CitlbnRyeVJ1bGVUYWJsZVByb3BlcnR5IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVByb3BlcnR5UnVsZSgpKTsgfQorCSBydWxlVGFibGVQcm9wZXJ0eQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlUHJvcGVydHlSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVQcm9wZXJ0eQorcnVsZVRhYmxlUHJvcGVydHkKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVQcm9wZXJ0eV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVBZ2dyZWdhdGlvbgorZW50cnlSdWxlVGFibGVBZ2dyZWdhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlQWdncmVnYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlQWdncmVnYXRpb24KK3J1bGVUYWJsZUFnZ3JlZ2F0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uCitlbnRyeVJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25SdWxlKCkpOyB9CisJIHJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uCitydWxlVGFibGVCYXNlQWdncmVnYXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19UYWJsZUJhc2VBZ2dyZWdhdGlvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVQdXJlQWdncmVnYXRpb24KK2VudHJ5UnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVQdXJlQWdncmVnYXRpb24KK3J1bGVUYWJsZVB1cmVBZ2dyZWdhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudCgpKTsgfQorKHJ1bGVfX1RhYmxlUHVyZUFnZ3JlZ2F0aW9uX19BZ2dyZWdhdGlvbkFzc2lnbm1lbnQpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRBZ2dyZWdhdGlvbkFzc2lnbm1lbnQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVVuYXJ5QWdncmVnYXRpb24KK2VudHJ5UnVsZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfQorCSBydWxlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbgorcnVsZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24KK2VudHJ5UnVsZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfQorCSBydWxlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbgorcnVsZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCitlbnRyeVJ1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfQorCSBydWxlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbgorcnVsZVRhYmxlQmluYXJ5QWdncmVnYXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVJbnRlcnZhbAorZW50cnlSdWxlVGFibGVJbnRlcnZhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbnRlcnZhbFJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlSW50ZXJ2YWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUludGVydmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlSW50ZXJ2YWwKK3J1bGVUYWJsZUludGVydmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19UYWJsZUludGVydmFsX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbnRlcnZhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlTnVtYmVySW50ZXJ2YWwKK2VudHJ5UnVsZVRhYmxlTnVtYmVySW50ZXJ2YWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxSdWxlKCkpOyB9CisJIHJ1bGVUYWJsZU51bWJlckludGVydmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZU51bWJlckludGVydmFsCitydWxlVGFibGVOdW1iZXJJbnRlcnZhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZURhdGVEYXlJbnRlcnZhbAorZW50cnlSdWxlVGFibGVEYXRlRGF5SW50ZXJ2YWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsUnVsZSgpKTsgfQorCSBydWxlVGFibGVEYXRlRGF5SW50ZXJ2YWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlJbnRlcnZhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZURhdGVEYXlJbnRlcnZhbAorcnVsZVRhYmxlRGF0ZURheUludGVydmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlTG9va3VwCitlbnRyeVJ1bGVUYWJsZUxvb2t1cCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBSdWxlKCkpOyB9CisJIHJ1bGVUYWJsZUxvb2t1cAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlTG9va3VwCitydWxlVGFibGVMb29rdXAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19UYWJsZUxvb2t1cF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVOdW1iZXJMb29rdXAKK2VudHJ5UnVsZVRhYmxlTnVtYmVyTG9va3VwIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cFJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlTnVtYmVyTG9va3VwCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJMb29rdXBSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVOdW1iZXJMb29rdXAKK3J1bGVUYWJsZU51bWJlckxvb2t1cAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVOdW1iZXJMb29rdXBfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVN0cmluZ0xvb2t1cAorZW50cnlSdWxlVGFibGVTdHJpbmdMb29rdXAgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlU3RyaW5nTG9va3VwUnVsZSgpKTsgfQorCSBydWxlVGFibGVTdHJpbmdMb29rdXAKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVN0cmluZ0xvb2t1cFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVN0cmluZ0xvb2t1cAorcnVsZVRhYmxlU3RyaW5nTG9va3VwCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlU3RyaW5nTG9va3VwQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UYWJsZVN0cmluZ0xvb2t1cF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlRGF0ZURheUxvb2t1cAorZW50cnlSdWxlVGFibGVEYXRlRGF5TG9va3VwIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBSdWxlKCkpOyB9CisJIHJ1bGVUYWJsZURhdGVEYXlMb29rdXAKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVEYXRlRGF5TG9va3VwCitydWxlVGFibGVEYXRlRGF5TG9va3VwCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUxvb2t1cEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVEYXRlRGF5TG9va3VwX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlUmFuZ2VFbGVtZW50CitlbnRyeVJ1bGVUYWJsZVJhbmdlRWxlbWVudCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVSYW5nZUVsZW1lbnRSdWxlKCkpOyB9CisJIHJ1bGVUYWJsZVJhbmdlRWxlbWVudAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlUmFuZ2VFbGVtZW50CitydWxlVGFibGVSYW5nZUVsZW1lbnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVSYW5nZUVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19UYWJsZVJhbmdlRWxlbWVudF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU2lnbmVkTnVtYmVyCitlbnRyeVJ1bGVTaWduZWROdW1iZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlclJ1bGUoKSk7IH0KKwkgcnVsZVNpZ25lZE51bWJlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBTaWduZWROdW1iZXIKK3J1bGVTaWduZWROdW1iZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVUZXh0Q29sb3IKK2VudHJ5UnVsZVRhYmxlVGV4dENvbG9yIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRleHRDb2xvclJ1bGUoKSk7IH0KKwkgcnVsZVRhYmxlVGV4dENvbG9yCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVUZXh0Q29sb3IKK3J1bGVUYWJsZVRleHRDb2xvcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRleHRDb2xvckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVUZXh0Q29sb3JfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlVGV4dENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUNlbGxDb2xvcgorZW50cnlSdWxlVGFibGVDZWxsQ29sb3IgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQ2VsbENvbG9yUnVsZSgpKTsgfQorCSBydWxlVGFibGVDZWxsQ29sb3IKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUNlbGxDb2xvclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZUNlbGxDb2xvcgorcnVsZVRhYmxlQ2VsbENvbG9yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQ2VsbENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UYWJsZUNlbGxDb2xvcl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVDZWxsQ29sb3JBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlSWNvbgorZW50cnlSdWxlVGFibGVJY29uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25SdWxlKCkpOyB9CisJIHJ1bGVUYWJsZUljb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVJY29uCitydWxlVGFibGVJY29uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlSWNvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fVGFibGVJY29uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlVHJlbmQKK2VudHJ5UnVsZVRhYmxlVHJlbmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlVHJlbmRSdWxlKCkpOyB9CisJIHJ1bGVUYWJsZVRyZW5kCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUcmVuZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVRyZW5kCitydWxlVGFibGVUcmVuZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UYWJsZVRyZW5kX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUaXRsZQorZW50cnlSdWxlVGl0bGUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRpdGxlUnVsZSgpKTsgfQorCSBydWxlVGl0bGUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUaXRsZQorcnVsZVRpdGxlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UaXRsZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGl0bGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVN1YlRpdGxlCitlbnRyeVJ1bGVTdWJUaXRsZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVSdWxlKCkpOyB9CisJIHJ1bGVTdWJUaXRsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN1YlRpdGxlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFN1YlRpdGxlCitydWxlU3ViVGl0bGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1N1YlRpdGxlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU3ViU3ViVGl0bGUKK2VudHJ5UnVsZVN1YlN1YlRpdGxlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdWJTdWJUaXRsZVJ1bGUoKSk7IH0KKwkgcnVsZVN1YlN1YlRpdGxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU3ViU3ViVGl0bGUKK3J1bGVTdWJTdWJUaXRsZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdWJTdWJUaXRsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVMYWJlbAorZW50cnlSdWxlTGFiZWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExhYmVsUnVsZSgpKTsgfQorCSBydWxlTGFiZWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBMYWJlbAorcnVsZUxhYmVsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19MYWJlbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGFiZWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRleHQKK2VudHJ5UnVsZVRleHQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRleHRSdWxlKCkpOyB9CisJIHJ1bGVUZXh0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUZXh0CitydWxlVGV4dAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUZXh0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19UZXh0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUZXh0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRvVGV4dAorZW50cnlSdWxlQXV0b1RleHQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0UnVsZSgpKTsgfQorCSBydWxlQXV0b1RleHQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBdXRvVGV4dAorcnVsZUF1dG9UZXh0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19BdXRvVGV4dF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUltYWdlCitlbnRyeVJ1bGVJbWFnZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VSdWxlKCkpOyB9CisJIHJ1bGVJbWFnZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEltYWdlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEltYWdlCitydWxlSW1hZ2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0ltYWdlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0SW1wb3J0CitlbnRyeVJ1bGVSZXBvcnRJbXBvcnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydFJ1bGUoKSk7IH0KKwkgcnVsZVJlcG9ydEltcG9ydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSZXBvcnRJbXBvcnQKK3J1bGVSZXBvcnRJbXBvcnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0SW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19SZXBvcnRJbXBvcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorZW50cnlSdWxlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0KKwkgcnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3J1bGVSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORworZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyB9CisJIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVFJBTlNMQVRBQkxFU1RSSU5HCitydWxlVFJBTlNMQVRBQkxFU1RSSU5HCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKwlSVUxFX1NUUklORworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbgorZW50cnlSdWxlWEFubm90YXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbgorcnVsZVhBbm5vdGF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEV4cHJlc3Npb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEV4cHJlc3Npb24KK3J1bGVYRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKwlydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQXNzaWdubWVudAorZW50cnlSdWxlWEFzc2lnbm1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsgfQorCSBydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQXNzaWdubWVudAorcnVsZVhBc3NpZ25tZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduCitlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcFNpbmdsZUFzc2lnbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wU2luZ2xlQXNzaWduCitydWxlT3BTaW5nbGVBc3NpZ24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorCisJJz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGlBc3NpZ24KK2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpQXNzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpQXNzaWduCitydWxlT3BNdWx0aUFzc2lnbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE9yRXhwcmVzc2lvbgorcnVsZVhPckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BPcgorZW50cnlSdWxlT3BPciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IH0KKwkgcnVsZU9wT3IKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3IKK3J1bGVPcE9yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyB9CisKKwknfHwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbgorZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEFuZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5kRXhwcmVzc2lvbgorcnVsZVhBbmRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQW5kCitlbnRyeVJ1bGVPcEFuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRSdWxlKCkpOyB9CisJIHJ1bGVPcEFuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQW5kCitydWxlT3BBbmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CisKKwknJiYnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFcXVhbGl0eUV4cHJlc3Npb24KK3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wRXF1YWxpdHkKK2VudHJ5UnVsZU9wRXF1YWxpdHkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyB9CisJIHJ1bGVPcEVxdWFsaXR5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcEVxdWFsaXR5CitydWxlT3BFcXVhbGl0eQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhSZWxhdGlvbmFsRXhwcmVzc2lvbgorcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcENvbXBhcmUKK2VudHJ5UnVsZU9wQ29tcGFyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfQorCSBydWxlT3BDb21wYXJlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQ29tcGFyZQorcnVsZU9wQ29tcGFyZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KK2VudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE90aGVyCitlbnRyeVJ1bGVPcE90aGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgfQorCSBydWxlT3BPdGhlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BPdGhlcgorcnVsZU9wT3RoZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBZGRpdGl2ZUV4cHJlc3Npb24KK3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQWRkCitlbnRyeVJ1bGVPcEFkZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9CisJIHJ1bGVPcEFkZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQWRkCitydWxlT3BBZGQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGkKK2VudHJ5UnVsZU9wTXVsdGkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpCitydWxlT3BNdWx0aQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24KK2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFVuYXJ5T3BlcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhVbmFyeU9wZXJhdGlvbgorcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFVuYXJ5CitlbnRyeVJ1bGVPcFVuYXJ5IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgfQorCSBydWxlT3BVbmFyeQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BVbmFyeQorcnVsZU9wVW5hcnkKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhDYXN0ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc3RlZEV4cHJlc3Npb24KK3J1bGVYQ2FzdGVkRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbgorZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFBvc3RmaXhPcGVyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUG9zdGZpeE9wZXJhdGlvbgorcnVsZVhQb3N0Zml4T3BlcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wUG9zdGZpeAorZW50cnlSdWxlT3BQb3N0Zml4IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9CisJIHJ1bGVPcFBvc3RmaXgKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BQb3N0Zml4CitydWxlT3BQb3N0Zml4CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9CisJIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE1lbWJlckZlYXR1cmVDYWxsCitydWxlWE1lbWJlckZlYXR1cmVDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbgorZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFByaW1hcnlFeHByZXNzaW9uCitydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhMaXRlcmFsCitlbnRyeVJ1bGVYTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXRlcmFsCitydWxlWExpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsCitlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ29sbGVjdGlvbkxpdGVyYWwKK3J1bGVYQ29sbGVjdGlvbkxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNldExpdGVyYWwKK2VudHJ5UnVsZVhTZXRMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTZXRMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNldExpdGVyYWwKK3J1bGVYU2V0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTGlzdExpdGVyYWwKK2VudHJ5UnVsZVhMaXN0TGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWExpc3RMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXN0TGl0ZXJhbAorcnVsZVhMaXN0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2xvc3VyZQorZW50cnlSdWxlWENsb3N1cmUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgfQorCSBydWxlWENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2xvc3VyZQorcnVsZVhDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCitlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyB9CisJIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uSW5DbG9zdXJlCitydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNob3J0Q2xvc3VyZQorZW50cnlSdWxlWFNob3J0Q2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IH0KKwkgcnVsZVhTaG9ydENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTaG9ydENsb3N1cmUKK3J1bGVYU2hvcnRDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhJZkV4cHJlc3Npb24KK2VudHJ5UnVsZVhJZkV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYSWZFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYSWZFeHByZXNzaW9uCitydWxlWElmRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbgorZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFN3aXRjaEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3dpdGNoRXhwcmVzc2lvbgorcnVsZVhTd2l0Y2hFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDYXNlUGFydAorZW50cnlSdWxlWENhc2VQYXJ0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9CisJIHJ1bGVYQ2FzZVBhcnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc2VQYXJ0CitydWxlWENhc2VQYXJ0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbgorZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZvckxvb3BFeHByZXNzaW9uCitydWxlWEZvckxvb3BFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhXaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhXaGlsZUV4cHJlc3Npb24KK3J1bGVYV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWERvV2hpbGVFeHByZXNzaW9uCitydWxlWERvV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24KK2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmxvY2tFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQmxvY2tFeHByZXNzaW9uCitydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgorZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVmFyaWFibGVEZWNsYXJhdGlvbgorcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKK2VudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwKK2VudHJ5UnVsZVhGZWF0dXJlQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBydWxlWEZlYXR1cmVDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGZWF0dXJlQ2FsbAorcnVsZVhGZWF0dXJlQ2FsbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElECitlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgfQorCSBydWxlRmVhdHVyZUNhbGxJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRmVhdHVyZUNhbGxJRAorcnVsZUZlYXR1cmVDYWxsSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSWRPclN1cGVyCitlbnRyeVJ1bGVJZE9yU3VwZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0KKwkgcnVsZUlkT3JTdXBlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBJZE9yU3VwZXIKK3J1bGVJZE9yU3VwZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbAorZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb25zdHJ1Y3RvckNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDb25zdHJ1Y3RvckNhbGwKK3J1bGVYQ29uc3RydWN0b3JDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbAorZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYQm9vbGVhbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJvb2xlYW5MaXRlcmFsCitydWxlWEJvb2xlYW5MaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdWxsTGl0ZXJhbAorZW50cnlSdWxlWE51bGxMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVsbExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bGxMaXRlcmFsCitydWxlWE51bGxMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsCitlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVtYmVyTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhOdW1iZXJMaXRlcmFsCitydWxlWE51bWJlckxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwKK2VudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTdHJpbmdMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFN0cmluZ0xpdGVyYWwKK3J1bGVYU3RyaW5nTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwKK2VudHJ5UnVsZVhUeXBlTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWFR5cGVMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhUeXBlTGl0ZXJhbAorcnVsZVhUeXBlTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uCitlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRocm93RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFRocm93RXhwcmVzc2lvbgorcnVsZVhUaHJvd0V4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhSZXR1cm5FeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFJldHVybkV4cHJlc3Npb24KK3J1bGVYUmV0dXJuRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhdGNoQ2xhdXNlCitlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0KKwkgcnVsZVhDYXRjaENsYXVzZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2F0Y2hDbGF1c2UKK3J1bGVYQ2F0Y2hDbGF1c2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZQorZW50cnlSdWxlUXVhbGlmaWVkTmFtZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IH0KKwkgcnVsZVF1YWxpZmllZE5hbWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWUKK3J1bGVRdWFsaWZpZWROYW1lCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU51bWJlcgorZW50cnlSdWxlTnVtYmVyIAorQGluaXQgeworCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworfQorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyB9CisJIHJ1bGVOdW1iZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CitmaW5hbGx5IHsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisvLyBSdWxlIE51bWJlcgorcnVsZU51bWJlcgorICAgIEBpbml0IHsKKwkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bVR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVR5cGVSZWZlcmVuY2UKK3J1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUFycmF5QnJhY2tldHMKK2VudHJ5UnVsZUFycmF5QnJhY2tldHMgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyB9CisJIHJ1bGVBcnJheUJyYWNrZXRzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBcnJheUJyYWNrZXRzCitydWxlQXJyYXlCcmFja2V0cworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmCitlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgfQorCSBydWxlWEZ1bmN0aW9uVHlwZVJlZgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZ1bmN0aW9uVHlwZVJlZgorcnVsZVhGdW5jdGlvblR5cGVSZWYKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsgfQorCSBydWxlSnZtVXBwZXJCb3VuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVXBwZXJCb3VuZAorcnVsZUp2bVVwcGVyQm91bmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bVVwcGVyQm91bmRBbmRlZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1VcHBlckJvdW5kQW5kZWQKK3J1bGVKdm1VcHBlckJvdW5kQW5kZWQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtTG93ZXJCb3VuZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bUxvd2VyQm91bmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUxvd2VyQm91bmQKK3J1bGVKdm1Mb3dlckJvdW5kCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyB9CisJIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtTG93ZXJCb3VuZEFuZGVkCitydWxlSnZtTG93ZXJCb3VuZEFuZGVkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgfQorCSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVmFsaWRJRAorZW50cnlSdWxlVmFsaWRJRCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJRFJ1bGUoKSk7IH0KKwkgcnVsZVZhbGlkSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFZhbGlkSUQKK3J1bGVWYWxpZElECisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKwlSVUxFX0lECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24KK2VudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEltcG9ydERlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJbXBvcnREZWNsYXJhdGlvbgorcnVsZVhJbXBvcnREZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfQorCSBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKy8vIFJ1bGUgVW5pdEVudW0KK3J1bGVVbml0RW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fVW5pdEVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIFBhZ2VTaXplRW51bQorcnVsZVBhZ2VTaXplRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VTaXplRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1BhZ2VTaXplRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VTaXplRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIE9yaWVudGF0aW9uRW51bQorcnVsZU9yaWVudGF0aW9uRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9yaWVudGF0aW9uRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09yaWVudGF0aW9uRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9yaWVudGF0aW9uRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIEZvbnRTdHlsZUVudW0KK3J1bGVGb250U3R5bGVFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFN0eWxlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0ZvbnRTdHlsZUVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250U3R5bGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgQnVpbGRJbkZvbnRGYW1pbHlFbnVtCitydWxlQnVpbGRJbkZvbnRGYW1pbHlFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fQnVpbGRJbkZvbnRGYW1pbHlFbnVtX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgVGV4dEFsaWduRW51bQorcnVsZVRleHRBbGlnbkVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUZXh0QWxpZ25FbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fVGV4dEFsaWduRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRleHRBbGlnbkVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0KK3J1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQorcnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgRGF0ZUZvcm1hdENhdGVnb3J5RW51bQorcnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKAknY3VzdG9tJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCitydWxlRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldENVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSk7IH0KKygJJ2N1c3RvbScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgVGltZUZvcm1hdENhdGVnb3J5RW51bQorcnVsZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKAknY3VzdG9tJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIFJlbmRlcmluZ0VudW0KK3J1bGVSZW5kZXJpbmdFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyaW5nRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1JlbmRlcmluZ0VudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJpbmdFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0KK3J1bGVQdXJlQWdncmVnYXRpb25UeXBlRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bQorcnVsZVVuYXJ5QWdncmVnYXRpb25UeXBlRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KK3J1bGVCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldERJVkVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSk7IH0KKygJJ2RpdmlkZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldERJVkVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0KK3J1bGVNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRDT05DQVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyB9CisoCSdjb25jYXQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldENPTkNBVEVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBUcmVuZEljb25FbnVtCitydWxlVHJlbmRJY29uRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRyZW5kSWNvbkVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19UcmVuZEljb25FbnVtX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIEJvcmRlclR5cGVFbnVtCitydWxlQm9yZGVyVHlwZUVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0JvcmRlclR5cGVFbnVtX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBBdXRvVGV4dEVudW0KK3J1bGVBdXRvVGV4dEVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19BdXRvVGV4dEVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBJbWFnZVNpemVFbnVtCitydWxlSW1hZ2VTaXplRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19JbWFnZVNpemVFbnVtX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VTaXplRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIEltYWdlU291cmNlRW51bQorcnVsZUltYWdlU291cmNlRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0ltYWdlU291cmNlRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCitydWxlX19Db2xvcl9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldENvbG9yQXNzaWdubWVudF8yXzAoKSk7IH0KKyhydWxlX19Db2xvcl9fQ29sb3JBc3NpZ25tZW50XzJfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldENvbG9yQXNzaWdubWVudF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CisocnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRHcm91cF8yXzIoKSk7IH0KKyhydWxlX19Db2xvcl9fR3JvdXBfMl8yX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0R3JvdXBfMl8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEdyb3VwXzJfMygpKTsgfQorKHJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRHcm91cF8yXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Gb250RmFtaWx5X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5QWNjZXNzKCkuZ2V0QnVpbGRJbkZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZUJ1aWxkSW5Gb250RmFtaWx5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseUFjY2VzcygpLmdldEJ1aWxkSW5Gb250RmFtaWx5UGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbUZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZUN1c3RvbUZvbnRGYW1pbHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Tb21lRm9ybWF0X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0VW9tb0Zvcm1hdFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlVW9tb0Zvcm1hdAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRVb21vRm9ybWF0UGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldE51bWJlckZvcm1hdFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlTnVtYmVyRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldE51bWJlckZvcm1hdFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRDdXJyZW5jeUZvcm1hdFBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKwlydWxlQ3VycmVuY3lGb3JtYXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0Q3VycmVuY3lGb3JtYXRQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0RGF0ZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKwlydWxlRGF0ZUZvcm1hdAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlRm9ybWF0UGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldERhdGVUaW1lRm9ybWF0UGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorCXJ1bGVEYXRlVGltZUZvcm1hdAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlVGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRUaW1lRm9ybWF0UGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorCXJ1bGVUaW1lRm9ybWF0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldFRpbWVGb3JtYXRQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0RGVzaWduX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25BY2Nlc3MoKS5nZXRSZXBvcnREZXNpZ25GaWxlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVSZXBvcnREZXNpZ25GaWxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduQWNjZXNzKCkuZ2V0UmVwb3J0RGVzaWduRmlsZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkFjY2VzcygpLmdldFJlcG9ydERlc2lnblRlbXBsYXRlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVSZXBvcnREZXNpZ25UZW1wbGF0ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkFjY2VzcygpLmdldFJlcG9ydERlc2lnblRlbXBsYXRlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fRWxlbWVudF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldFRpdGxlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVUaXRsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRUaXRsZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRTdWJUaXRsZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlU3ViVGl0bGUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0U3ViVGl0bGVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0U3ViU3ViVGl0bGVQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVN1YlN1YlRpdGxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldFN1YlN1YlRpdGxlUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldExhYmVsUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorCXJ1bGVMYWJlbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRMYWJlbFBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRUZXh0UGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorCXJ1bGVUZXh0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldFRleHRQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0QXV0b1RleHRQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CisJcnVsZUF1dG9UZXh0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEF1dG9UZXh0UGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEltYWdlUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorCXJ1bGVJbWFnZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRJbWFnZVBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXREYXRhbWFydFRhYmxlUGFyc2VyUnVsZUNhbGxfNygpKTsgfQorCXJ1bGVEYXRhbWFydFRhYmxlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldERhdGFtYXJ0VGFibGVQYXJzZXJSdWxlQ2FsbF83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfOCgpKTsgfQorCXJ1bGVEYXRhbWFydFRhYmxlUHJvcGVydHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfOCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEdyaWRQYXJzZXJSdWxlQ2FsbF85KCkpOyB9CisJcnVsZUdyaWQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0R3JpZFBhcnNlclJ1bGVDYWxsXzkoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19BbHRlcm5hdGl2ZXNfMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRBbGxLZXl3b3JkXzNfMCgpKTsgfQorCisJJ2FsbCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0QWxsS2V5d29yZF8zXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IH0KKyhydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8zXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1RhYmxlVmFsdWVFbGVtZW50X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVRhYmxlUHJvcGVydHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVRhYmxlQWdncmVnYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fVGFibGVCYXNlQWdncmVnYXRpb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVUYWJsZVVuYXJ5QWdncmVnYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKwlydWxlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19UYWJsZUludGVydmFsX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUludGVydmFsQWNjZXNzKCkuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlVGFibGVOdW1iZXJJbnRlcnZhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxBY2Nlc3MoKS5nZXRUYWJsZU51bWJlckludGVydmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbnRlcnZhbEFjY2VzcygpLmdldFRhYmxlRGF0ZURheUludGVydmFsUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVUYWJsZURhdGVEYXlJbnRlcnZhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxBY2Nlc3MoKS5nZXRUYWJsZURhdGVEYXlJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19UYWJsZUxvb2t1cF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZU51bWJlckxvb2t1cFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlVGFibGVOdW1iZXJMb29rdXAKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUxvb2t1cEFjY2VzcygpLmdldFRhYmxlTnVtYmVyTG9va3VwUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZVN0cmluZ0xvb2t1cFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlVGFibGVTdHJpbmdMb29rdXAKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUxvb2t1cEFjY2VzcygpLmdldFRhYmxlU3RyaW5nTG9va3VwUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZURhdGVEYXlMb29rdXBQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVRhYmxlRGF0ZURheUxvb2t1cAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwQWNjZXNzKCkuZ2V0VGFibGVEYXRlRGF5TG9va3VwUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1RhYmxlUmFuZ2VFbGVtZW50X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlVGV4dENvbG9yUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVUYWJsZVRleHRDb2xvcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0VGFibGVUZXh0Q29sb3JQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlQ2VsbENvbG9yUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVUYWJsZUNlbGxDb2xvcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0VGFibGVDZWxsQ29sb3JQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlSWNvblBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKwlydWxlVGFibGVJY29uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVSYW5nZUVsZW1lbnRBY2Nlc3MoKS5nZXRUYWJsZUljb25QYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlVHJlbmRQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CisJcnVsZVRhYmxlVHJlbmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlVHJlbmRQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8zXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYQW5ub3RhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBsdXNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJys9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKworCSctPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNFcXVhbHNTaWduS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CisKKwknKj0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFNvbGlkdXNFcXVhbHNTaWduS2V5d29yZF8zKCkpOyB9CisKKwknLz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFNvbGlkdXNFcXVhbHNTaWduS2V5d29yZF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyB9CisKKwknJT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBlcmNlbnRTaWduRXF1YWxzU2lnbktleXdvcmRfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKyhydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgfQorKHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKworCSc9PScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduS2V5d29yZF8xKCkpOyB9CisKKwknIT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IH0KKworCSc9PT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8zKCkpOyB9CisKKwknIT09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJz49JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8yKCkpOyB9CisKKwknPicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgfQorCisJJzwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyB9CisKKwknLT4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsgfQorCisJJy4uPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF8yX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMygpKTsgfQorCisJJy4uJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgfQorCisJJz0+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgfQorCisJJzw+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtDb2xvbktleXdvcmRfOCgpKTsgfQorCisJJz86JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtDb2xvbktleXdvcmRfOCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzAoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyB9CisKKwknPicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzAoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyB9CisKKwknPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMV8yKCkpOyB9CisKKwknPT4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMV8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzAoKSk7IH0KKworCScrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKworCSctJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzAoKSk7IH0KKworCScqJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrQXN0ZXJpc2tLZXl3b3JkXzEoKSk7IH0KKworCScqKicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tBc3Rlcmlza0tleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFNvbGlkdXNLZXl3b3JkXzIoKSk7IH0KKworCScvJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRTb2xpZHVzS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25LZXl3b3JkXzMoKSk7IH0KKworCSclJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRQZXJjZW50U2lnbktleXdvcmRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWENhc3RlZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrS2V5d29yZF8wKCkpOyB9CisKKwknIScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKworCSctJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8yKCkpOyB9CisKKwknKycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldFBsdXNTaWduUGx1c1NpZ25LZXl3b3JkXzAoKSk7IH0KKworCScrKycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRQbHVzU2lnblBsdXNTaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0h5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CisKKwknLS0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzBfMF8wXzFfMCgpKTsgfQorCisJJy4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMF8wXzBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzAoKSk7IH0KKworCScuJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzEoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhDb25zdHJ1Y3RvckNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ29uc3RydWN0b3JDYWxsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEJsb2NrRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCbG9ja0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3dpdGNoRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKwlydWxlWFN3aXRjaEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3dpdGNoRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKAlydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24pCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CisJcnVsZVhGZWF0dXJlQ2FsbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorCXJ1bGVYTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WElmRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKwlydWxlWElmRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhJZkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyB9CisoCXJ1bGVYRm9yTG9vcEV4cHJlc3Npb24pCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZvckxvb3BFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF84KCkpOyB9CisJcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF84KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOSgpKTsgfQorCXJ1bGVYV2hpbGVFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFdoaWxlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzkoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhEb1doaWxlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEwKCkpOyB9CisJcnVsZVhEb1doaWxlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhEb1doaWxlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEwKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVGhyb3dFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTEoKSk7IH0KKwlydWxlWFRocm93RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJldHVybkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMigpKTsgfQorCXJ1bGVYUmV0dXJuRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZXR1cm5FeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTMoKSk7IH0KKwlydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEzKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xNCgpKTsgfQorCXJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWENvbGxlY3Rpb25MaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ29sbGVjdGlvbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKAlydWxlWENsb3N1cmUpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVYQm9vbGVhbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhCb29sZWFuTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CisJcnVsZVhOdW1iZXJMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bGxMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorCXJ1bGVYTnVsbExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdWxsTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFN0cmluZ0xpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CisJcnVsZVhTdHJpbmdMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYU3RyaW5nTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorCXJ1bGVYVHlwZUxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhUeXBlTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhTZXRMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYU2V0TGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhTZXRMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYTGlzdExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKyhydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyB9CisocnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCkpOyB9CisocnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVBc3NpZ25tZW50XzFfMCgpKTsgfQorKHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFZhbEtleXdvcmRfMV8xKCkpOyB9CisKKwkndmFsJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VmFsS2V5d29yZF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCkpOyB9CisocnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzEoKSk7IH0KKyhydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVZhbGlkSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8xKCkpOyB9CisKKwknZXh0ZW5kcycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFN0YXRpY0tleXdvcmRfMigpKTsgfQorCisJJ3N0YXRpYycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0U3RhdGljS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8zKCkpOyB9CisKKwknaW1wb3J0JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbnNpb25LZXl3b3JkXzQoKSk7IH0KKworCSdleHRlbnNpb24nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlRmVhdHVyZUNhbGxJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEZlYXR1cmVDYWxsSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRTdXBlcktleXdvcmRfMSgpKTsgfQorCisJJ3N1cGVyJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCkpOyB9CisocnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xKCkpOyB9CisocnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEZhbHNlS2V5d29yZF8xXzAoKSk7IH0KKworCSdmYWxzZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRGYWxzZUtleXdvcmRfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVBc3NpZ25tZW50XzFfMSgpKTsgfQorKHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorKHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyB9CisocnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SEVYVGVybWluYWxSdWxlQ2FsbF8wKCkpOyB9CisJUlVMRV9IRVgKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRIRVhUZXJtaW5hbFJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19OdW1iZXJfX0dyb3VwXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8wXzAoKSk7IH0KKwlSVUxFX0lOVAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8wXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkpOyB9CisJUlVMRV9ERUNJTUFMCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMCgpKTsgfQorCVJVTEVfSU5UCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8xKCkpOyB9CisJUlVMRV9ERUNJTUFMCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFhGdW5jdGlvblR5cGVSZWZQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhGdW5jdGlvblR5cGVSZWYKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0WEZ1bmN0aW9uVHlwZVJlZlBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZUp2bVR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CisocnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMV8yKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMV8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xXzBfMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFdpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMV8wXzNfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzc2lnbm1lbnRfMV8wXzNfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fVW5pdEVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0TU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ21tJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldE1NRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldENNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdjbScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW5pdEVudW1BY2Nlc3MoKS5nZXRDTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5pdEVudW1BY2Nlc3MoKS5nZXRQVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAkncHQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0UFRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0SU5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ2luY2gnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0SU5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0UENFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKygJJ3BjJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldFBDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldEVNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOyB9CisoCSdlbScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW5pdEVudW1BY2Nlc3MoKS5nZXRFTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5pdEVudW1BY2Nlc3MoKS5nZXRFWEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsgfQorKAknZXgnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0RVhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0UFhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IH0KKygJJ3B4JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldFBYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbml0RW51bUFjY2VzcygpLmdldFBFUkNFTlRBR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzgoKSk7IH0KKygJJyUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuaXRFbnVtQWNjZXNzKCkuZ2V0UEVSQ0VOVEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VTaXplRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0QTRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ2E0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRBNEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0QTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ2EzJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRBM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0QTVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKygJJ2E1JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRBNUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0VVNfTEVUVEVSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisoCSd1cy1sZXR0ZXInIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VTaXplRW51bUFjY2VzcygpLmdldFVTX0xFVFRFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0VVNfTEVHQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKygJJ3VzLWxlZ2FsJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRVU19MRUdBTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0VVNfTEVER0VSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOyB9CisoCSd1cy1sZWRnZXInIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VTaXplRW51bUFjY2VzcygpLmdldFVTX0xFREdFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0VVNfU1VQRVJfQkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsgfQorKAkndXMtc3VwZXItYicgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0VVNfU1VQRVJfQkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09yaWVudGF0aW9uRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3JpZW50YXRpb25FbnVtQWNjZXNzKCkuZ2V0UE9SVFJBSVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ3BvcnRyYWl0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcmllbnRhdGlvbkVudW1BY2Nlc3MoKS5nZXRQT1JUUkFJVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3JpZW50YXRpb25FbnVtQWNjZXNzKCkuZ2V0TEFORFNDQVBFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdsYW5kc2NhcGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9yaWVudGF0aW9uRW51bUFjY2VzcygpLmdldExBTkRTQ0FQRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ZvbnRTdHlsZUVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvbnRTdHlsZUVudW1BY2Nlc3MoKS5nZXROT1JNQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ25vcm1hbCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFN0eWxlRW51bUFjY2VzcygpLmdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFN0eWxlRW51bUFjY2VzcygpLmdldElUQUxJQ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAknaXRhbGljJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250U3R5bGVFbnVtQWNjZXNzKCkuZ2V0SVRBTElDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250U3R5bGVFbnVtQWNjZXNzKCkuZ2V0T0JMSVFVRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknb2JsaXF1ZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFN0eWxlRW51bUFjY2VzcygpLmdldE9CTElRVUVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19CdWlsZEluRm9udEZhbWlseUVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldE1PTk9TUEFDRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknbW9ub3NwYWNlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCdWlsZEluRm9udEZhbWlseUVudW1BY2Nlc3MoKS5nZXRNT05PU1BBQ0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldFNBTlNfU0VSSUZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ3NhbnMtc2VyaWYnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldFNBTlNfU0VSSUZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldFNFUklGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdzZXJpZicgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtQWNjZXNzKCkuZ2V0U0VSSUZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19UZXh0QWxpZ25FbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUZXh0QWxpZ25FbnVtQWNjZXNzKCkuZ2V0TEVGVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknbGVmdCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldExFRlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRleHRBbGlnbkVudW1BY2Nlc3MoKS5nZXRDRU5URVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ2NlbnRlcicgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldENFTlRFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldFJJR0hURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdyaWdodCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldFJJR0hURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRVTkZPUk1BVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAkndW5mb3JtYXR0ZWQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFVORk9STUFUVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRHRU5FUkFMX05VTUJFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAknZ2VuZXJhbC1udW1iZXInIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldEdFTkVSQUxfTlVNQkVSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRGSVhFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknZml4ZWQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldEZJWEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRQRVJDRU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisoCSdwZXJjZW50JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRQRVJDRU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRTQ0lFTlRJRklDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisoCSdzY2llbnRpZmljJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRTQ0lFTlRJRklDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IH0KKygJJ2N1c3RvbScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0VU5GT1JNQVRURURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ3VuZm9ybWF0dGVkJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFVORk9STUFUVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldENVUlJFTkNZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdjdXJyZW5jeScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRDVVJSRU5DWUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKygJJ2N1c3RvbScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1BY2Nlc3MoKS5nZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZW5kZXJpbmdFbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJpbmdFbnVtQWNjZXNzKCkuZ2V0SFRNTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknaHRtbCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyaW5nRW51bUFjY2VzcygpLmdldEhUTUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlbmRlcmluZ0VudW1BY2Nlc3MoKS5nZXRQREZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ3BkZicgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyaW5nRW51bUFjY2VzcygpLmdldFBERkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1B1cmVBZ2dyZWdhdGlvblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldENPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CisoCSdjb3VudCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRDT1VOVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRSVU5OSU5HQ09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ3J1bm5pbmctY291bnQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0UlVOTklOR0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ3N1bScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0U1VNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRBVkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ2F2ZXJhZ2UnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldEFWRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0TUlORW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdtaW5pbXVtJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRNSU5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldE1BWEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorKAknbWF4aW11bScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0TUFYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRSVU5OSU5HU1VNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisoCSdydW5uaW5nLXN1bScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0UlVOTklOR1NVTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1RyZW5kSWNvbkVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRyZW5kSWNvbkVudW1BY2Nlc3MoKS5nZXRSSVNJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ3Jpc2luZycgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldFJJU0lOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldEJBRFJJU0lOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAknYmFkLXJpc2luZycgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldEJBRFJJU0lOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKygJJ3Nsb3BpbmcnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRyZW5kSWNvbkVudW1BY2Nlc3MoKS5nZXRTTE9QSU5HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUcmVuZEljb25FbnVtQWNjZXNzKCkuZ2V0R09PRFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ2dvb2Qtc2xvcGluZycgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldEdPT0RTTE9QSU5HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUcmVuZEljb25FbnVtQWNjZXNzKCkuZ2V0U1RBR05BVElOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgfQorKAknc3RhZ25hdGluZycgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VHJlbmRJY29uRW51bUFjY2VzcygpLmdldFNUQUdOQVRJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Cb3JkZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXROT05FRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CisoCSdub25lJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldE5PTkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0U09MSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ3NvbGlkJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldFNPTElERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldERPVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknZG90dGVkJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldERPVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXREQVNIRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ2Rhc2hlZCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXREQVNIRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0RE9VQkxFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisoCSdkb3VibGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0RE9VQkxFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldEdST09WRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorKAknZ3Jvb3ZlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldEdST09WRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRSSURHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsgfQorKAkncmlkZ2UnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0UklER0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0SU5TRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IH0KKygJJ2luc2V0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldElOU0VURW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldE9VVFNFVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCgpKTsgfQorKAknb3V0c2V0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJUeXBlRW51bUFjY2VzcygpLmdldE9VVFNFVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dG9UZXh0RW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0UEFHRV9OVU1CRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ3BhZ2UtbnVtYmVyJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEVudW1BY2Nlc3MoKS5nZXRQQUdFX05VTUJFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0VE9UQUxfUEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAkndG90YWwtcGFnZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0VE9UQUxfUEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0UEFHRV9OVU1CRVJfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAkncGFnZS1udW1iZXItdW5maWx0ZXJlZCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0UEFHRV9OVU1CRVJfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0VE9UQUxfUEFHRV9VTkZJTFRFUkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisoCSd0b3RhbC1wYWdlLXVuZmlsdGVyZWQnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0RW51bUFjY2VzcygpLmdldFRPVEFMX1BBR0VfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0UEFHRV9WQVJJQUJMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgfQorKAkncGFnZS12YXJpYWJsZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRFbnVtQWNjZXNzKCkuZ2V0UEFHRV9WQVJJQUJMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ltYWdlU2l6ZUVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRTSVpFX1RPX0lNQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CisoCSdzaXplLXRvLWltYWdlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0U0laRV9UT19JTUFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VTaXplRW51bUFjY2VzcygpLmdldFNDQUxFX1RPX0lURU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ3NjYWxlLXRvLWl0ZW0nIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEltYWdlU2l6ZUVudW1BY2Nlc3MoKS5nZXRTQ0FMRV9UT19JVEVNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0Q0xJUEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknY2xpcCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VTaXplRW51bUFjY2VzcygpLmdldENMSVBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19JbWFnZVNvdXJjZUVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEZJTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ2ZpbGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEZJTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldFVSTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAkndXJsJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZVNvdXJjZUVudW1BY2Nlc3MoKS5nZXRVUkxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEltYWdlU291cmNlRW51bUFjY2VzcygpLmdldEVNQkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdlbWJlZCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VTb3VyY2VFbnVtQWNjZXNzKCkuZ2V0RU1CRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmVwb3J0UGFja2FnZUFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmVwb3J0UGFja2FnZUFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRQYWNrYWdlS2V5d29yZF8xKCkpOyB9CisKKwkncGFja2FnZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzRfX0ltcGwKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fNQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzQXNzaWdubWVudF80KCkpOyB9CisocnVsZV9fUmVwb3J0UGFja2FnZV9fSW1wb3J0c0Fzc2lnbm1lbnRfNCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNBc3NpZ25tZW50XzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fNV9fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX182Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX181X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKyhydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzYKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX182X19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzcKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzZfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmVwb3J0c0Fzc2lnbm1lbnRfNigpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX1JlcG9ydHNBc3NpZ25tZW50XzYpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSZXBvcnRzQXNzaWdubWVudF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF9fNworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzdfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfXzdfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18wX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldExheW91dERhdGFLZXl3b3JkXzVfMCgpKTsgfQorCisJJ2xheW91dC1kYXRhJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRMYXlvdXREYXRhS2V5d29yZF81XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzFfX0ltcGwKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNV8xKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18yX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzVfMigpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl9fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzVfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fM19fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRQYWdldGVtcGxhdGVzQXNzaWdubWVudF81XzMoKSk7IH0KKyhydWxlX19SZXBvcnRQYWNrYWdlX19QYWdldGVtcGxhdGVzQXNzaWdubWVudF81XzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzVfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNF9fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzUKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzQXNzaWdubWVudF81XzQoKSk7IH0KKyhydWxlX19SZXBvcnRQYWNrYWdlX19Gb3JtYXR0ZXJzQXNzaWdubWVudF81XzQpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEZvcm1hdHRlcnNBc3NpZ25tZW50XzVfNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNV9fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzYKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRDb2xvcnNBc3NpZ25tZW50XzVfNSgpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0NvbG9yc0Fzc2lnbm1lbnRfNV81KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRDb2xvcnNBc3NpZ25tZW50XzVfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNl9fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzcKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGb250c0Fzc2lnbm1lbnRfNV82KCkpOyB9CisocnVsZV9fUmVwb3J0UGFja2FnZV9fRm9udHNBc3NpZ25tZW50XzVfNikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Rm9udHNBc3NpZ25tZW50XzVfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fN19fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzgKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fN19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRNZWRpYXNBc3NpZ25tZW50XzVfNygpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX01lZGlhc0Fzc2lnbm1lbnRfNV83KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRNZWRpYXNBc3NpZ25tZW50XzVfNygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOF9fSW1wbAorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRTdHlsZXNBc3NpZ25tZW50XzVfOCgpKTsgfQorKHJ1bGVfX1JlcG9ydFBhY2thZ2VfX1N0eWxlc0Fzc2lnbm1lbnRfNV84KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRTdHlsZXNBc3NpZ25tZW50XzVfOCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X185X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzkoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNV85KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzBfX0ltcGwKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEV4dGVybmFsQ3NzVVJJS2V5d29yZF81XzJfMCgpKTsgfQorCisJJ2V4dGVybmFsQ3NzVVJJJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRFeHRlcm5hbENzc1VSSUtleXdvcmRfNV8yXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18xX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfNV8yXzEoKSk7IH0KKyhydWxlX19SZXBvcnRQYWNrYWdlX19FeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfNV8yXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEV4dGVybmFsQ3NzVVJJQXNzaWdubWVudF81XzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzVfMl8yKCkpOyB9CisocnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cF81XzJfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl8yX18wX19JbXBsCisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RnJvbUJ1bmRsZUtleXdvcmRfNV8yXzJfMCgpKTsgfQorCisJJ2Zyb20gYnVuZGxlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGcm9tQnVuZGxlS2V5d29yZF81XzJfMl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yXzJfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzVfMl8yXzEoKSk7IH0KKyhydWxlX19SZXBvcnRQYWNrYWdlX19FeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfNV8yXzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzVfMl8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fUGFnZVRlbXBsYXRlc19fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZXNfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlc19fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlc19fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzQWNjZXNzKCkuZ2V0UGFnZVRlbXBsYXRlc0FjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzQWNjZXNzKCkuZ2V0UGFnZVRlbXBsYXRlc0FjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVzX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlc19fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlc19fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzQWNjZXNzKCkuZ2V0UGFnZXRlbXBsYXRlc0Fzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZXNfX1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZXNBY2Nlc3MoKS5nZXRQYWdldGVtcGxhdGVzQXNzaWdubWVudF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0U29tZUZvcm1hdHNBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRTb21lRm9ybWF0c0FjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldEZvcm1hdHRlcnNLZXl3b3JkXzEoKSk7IH0KKworCSdmb3JtYXR0ZXJzJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0Rm9ybWF0dGVyc0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0Rm9ybWF0dGVyc0Fzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1NvbWVGb3JtYXRzX19Gb3JtYXR0ZXJzQXNzaWdubWVudF8zKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldEZvcm1hdHRlcnNBc3NpZ25tZW50XzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fQ29sb3JzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JzX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NvbG9yc19fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldENvbG9yc0FjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JzX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NvbG9yc19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JzX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldENvbG9yc0tleXdvcmRfMSgpKTsgfQorCisJJ2NvbG9ycycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yc19fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yc19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19Db2xvcnNfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yc19fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Db2xvcnNfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Db2xvcnNfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fQ29sb3JzX19Hcm91cF9fNAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db2xvcnNfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0Q29sb3JzQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fQ29sb3JzX19Db2xvcnNBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldENvbG9yc0Fzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JzX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JzX19Hcm91cF9fNF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db2xvcnNfX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fRm9udHNfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fRm9udHNfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0FjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Gb250c19fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0ZvbnRzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0ZvbnRzX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Gb250c19fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldEZvbnRzS2V5d29yZF8xKCkpOyB9CisKKwknZm9udHMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fRm9udHNfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Gb250c19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19Gb250c19fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fRm9udHNfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fRm9udHNfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fRm9udHNfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNBc3NpZ25tZW50XzMoKSk7IH0KKyhydWxlX19Gb250c19fRm9udHNBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNBc3NpZ25tZW50XzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fRm9udHNfX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ZvbnRzX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fTWVkaWFzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fTWVkaWFzX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX01lZGlhc19fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTWVkaWFzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE1lZGlhc0FjY2VzcygpLmdldE1lZGlhc0FjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fTWVkaWFzX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fTWVkaWFzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX01lZGlhc19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTWVkaWFzX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE1lZGlhc0FjY2VzcygpLmdldE1lZGlhc0tleXdvcmRfMSgpKTsgfQorCisJJ21lZGlhcycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX01lZGlhc19fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX01lZGlhc19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19NZWRpYXNfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX01lZGlhc19fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19NZWRpYXNfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19NZWRpYXNfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fTWVkaWFzX19Hcm91cF9fNAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19NZWRpYXNfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0TWVkaWFzQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fTWVkaWFzX19NZWRpYXNBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE1lZGlhc0FjY2VzcygpLmdldE1lZGlhc0Fzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fTWVkaWFzX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fTWVkaWFzX19Hcm91cF9fNF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19NZWRpYXNfX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE1lZGlhc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKK3J1bGVfX01lZGlhX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fTWVkaWFfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fTWVkaWFfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX01lZGlhX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE1lZGlhQWNjZXNzKCkuZ2V0TWVkaWFLZXl3b3JkXzAoKSk7IH0KKworCSdtZWRpYScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYUFjY2VzcygpLmdldE1lZGlhS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19NZWRpYV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX01lZGlhX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19NZWRpYV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19NZWRpYV9fTmFtZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fU3R5bGVzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU3R5bGVzX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1N0eWxlc19fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fU3R5bGVzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFN0eWxlc0FjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRTdHlsZXNBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fU3R5bGVzX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU3R5bGVzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1N0eWxlc19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fU3R5bGVzX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFN0eWxlc0tleXdvcmRfMSgpKTsgfQorCisJJ3N0eWxlcycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRTdHlsZXNLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1N0eWxlc19fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1N0eWxlc19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19TdHlsZXNfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1N0eWxlc19fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19TdHlsZXNfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19TdHlsZXNfX0dyb3VwX18zX19JbXBsCisJcnVsZV9fU3R5bGVzX19Hcm91cF9fNAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19TdHlsZXNfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fU3R5bGVzX19TdHlsZXNBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFN0eWxlc0Fzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fU3R5bGVzX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fU3R5bGVzX19Hcm91cF9fNF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19TdHlsZXNfX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRQYWdldGVtcGxhdGVLZXl3b3JkXzAoKSk7IH0KKworCSdwYWdldGVtcGxhdGUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UGFnZXRlbXBsYXRlS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fTmFtZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsgfQorCisJJ3snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFR5cGVLZXl3b3JkXzMoKSk7IH0KKworCSd0eXBlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFR5cGVLZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzRfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRTaXplQXNzaWdubWVudF80KCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19TaXplQXNzaWdubWVudF80KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFNpemVBc3NpZ25tZW50XzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzVfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX182Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzVfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRPcmllbnRhdGlvbktleXdvcmRfNSgpKTsgfQorCisJJ29yaWVudGF0aW9uJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE9yaWVudGF0aW9uS2V5d29yZF81KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX182CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX182X19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fNworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX182X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0T3JpZW50YXRpb25Bc3NpZ25tZW50XzYoKSk7IH0KKyhydWxlX19QYWdlVGVtcGxhdGVfX09yaWVudGF0aW9uQXNzaWdubWVudF82KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE9yaWVudGF0aW9uQXNzaWdubWVudF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX183CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX183X19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX183X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0VG9wbWFyZ2luS2V5d29yZF83KCkpOyB9CisKKwkndG9wbWFyZ2luJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcG1hcmdpbktleXdvcmRfNygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOF9fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblZhbHVlQXNzaWdubWVudF84KCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19Ub3BNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfOCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUb3BNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfOCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOV9fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEwCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzlfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUb3BNYXJnaW5Vbml0QXNzaWdubWVudF85KCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19Ub3BNYXJnaW5Vbml0QXNzaWdubWVudF85KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblVuaXRBc3NpZ25tZW50XzkoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEwCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xMF9fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzExCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEwX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdG1hcmdpbktleXdvcmRfMTAoKSk7IH0KKworCSdsZWZ0bWFyZ2luJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRtYXJnaW5LZXl3b3JkXzEwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTFfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTEoKSk7IH0KKyhydWxlX19QYWdlVGVtcGxhdGVfX0xlZnRNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdE1hcmdpblZhbHVlQXNzaWdubWVudF8xMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEyX19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRMZWZ0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTIoKSk7IH0KKyhydWxlX19QYWdlVGVtcGxhdGVfX0xlZnRNYXJnaW5Vbml0QXNzaWdubWVudF8xMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRMZWZ0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xM19fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE0Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzEzX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0Qm90dG9tbWFyZ2luS2V5d29yZF8xMygpKTsgfQorCisJJ2JvdHRvbW1hcmdpbicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21tYXJnaW5LZXl3b3JkXzEzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTRfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xNQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEJvdHRvbU1hcmdpblZhbHVlQXNzaWdubWVudF8xNCgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fQm90dG9tTWFyZ2luVmFsdWVBc3NpZ25tZW50XzE0KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEJvdHRvbU1hcmdpblZhbHVlQXNzaWdubWVudF8xNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE1X19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTYKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTVfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21NYXJnaW5Vbml0QXNzaWdubWVudF8xNSgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fQm90dG9tTWFyZ2luVW5pdEFzc2lnbm1lbnRfMTUpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0Qm90dG9tTWFyZ2luVW5pdEFzc2lnbm1lbnRfMTUoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE2CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xNl9fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE3Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE2X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UmlnaHRtYXJnaW5LZXl3b3JkXzE2KCkpOyB9CisKKwkncmlnaHRtYXJnaW4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UmlnaHRtYXJnaW5LZXl3b3JkXzE2KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xNworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTdfX0ltcGwKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xOAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xN19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzE3KCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19SaWdodE1hcmdpblZhbHVlQXNzaWdubWVudF8xNykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodE1hcmdpblZhbHVlQXNzaWdubWVudF8xNygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTgKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE4X19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTkKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMThfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodE1hcmdpblVuaXRBc3NpZ25tZW50XzE4KCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19SaWdodE1hcmdpblVuaXRBc3NpZ25tZW50XzE4KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTgoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE5CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xOV9fSW1wbAorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzIwCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzE5X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0SGVhZGVyQXNzaWdubWVudF8xOSgpKTsgfQorKHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fSGVhZGVyQXNzaWdubWVudF8xOSk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0SGVhZGVyQXNzaWdubWVudF8xOSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzIwX19JbXBsCisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRGb290ZXJBc3NpZ25tZW50XzIwKCkpOyB9CisocnVsZV9fUGFnZVRlbXBsYXRlX19Gb290ZXJBc3NpZ25tZW50XzIwKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRGb290ZXJBc3NpZ25tZW50XzIwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18yMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMjEoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3J1bGVfX0NvbG9yX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ29sb3JfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0Q29sb3JLZXl3b3JkXzAoKSk7IH0KKworCSdjb2xvcicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldENvbG9yS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Db2xvcl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db2xvcl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19Db2xvcl9fTmFtZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSk7IH0KKyhydWxlX19Db2xvcl9fQWx0ZXJuYXRpdmVzXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMF9fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0RGFya2Vuc0tleXdvcmRfMl8xXzAoKSk7IH0KKworCSdkYXJrZW5zJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0RGFya2Vuc0tleXdvcmRfMl8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzFfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8xX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8xXzEoKSk7IH0KKyhydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzJfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8xX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJ5UGVyY2VudEtleXdvcmRfMl8xXzIoKSk7IH0KKworCSdieS1wZXJjZW50JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db2xvcl9fR3JvdXBfMl8xX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXREYXJrZW5zYnlBc3NpZ25tZW50XzJfMV8zKCkpOyB9CisocnVsZV9fQ29sb3JfX0RhcmtlbnNieUFzc2lnbm1lbnRfMl8xXzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXREYXJrZW5zYnlBc3NpZ25tZW50XzJfMV8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMF9fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0TGlnaHRlbnNLZXl3b3JkXzJfMl8wKCkpOyB9CisKKwknbGlnaHRlbnMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRMaWdodGVuc0tleXdvcmRfMl8yXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzFfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8yX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8yXzEoKSk7IH0KKyhydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzJfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8yX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJ5UGVyY2VudEtleXdvcmRfMl8yXzIoKSk7IH0KKworCSdieS1wZXJjZW50JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzJfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Db2xvcl9fR3JvdXBfMl8yX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRMaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMygpKTsgfQorKHJ1bGVfX0NvbG9yX19MaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldExpZ2h0ZW5zYnlBc3NpZ25tZW50XzJfMl8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMF9fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc0tleXdvcmRfMl8zXzAoKSk7IH0KKworCSd0cmFuc2Zvcm1zJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc0tleXdvcmRfMl8zXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzFfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8zX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8zXzEoKSk7IH0KKyhydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzNfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckFzc2lnbm1lbnRfMl8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzJfX0ltcGwKKwlydWxlX19Db2xvcl9fR3JvdXBfMl8zX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJ5UGVyY2VudEtleXdvcmRfMl8zXzIoKSk7IH0KKworCSdieS1wZXJjZW50JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzNfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fM19fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc2J5QXNzaWdubWVudF8yXzNfMygpKTsgfQorKHJ1bGVfX0NvbG9yX19UcmFuc2Zvcm1zYnlBc3NpZ25tZW50XzJfM18zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc2J5QXNzaWdubWVudF8yXzNfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fNF9fSW1wbAorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzUKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VG93YXJkc0tleXdvcmRfMl8zXzQoKSk7IH0KKworCSd0b3dhcmRzJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VG93YXJkc0tleXdvcmRfMl8zXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzVfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkYjUxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC50b2tlbnMKQEAgLTAsMCArMSw0OTMgQEAKKychJz00NAorJyE9Jz0yNgorJyE9PSc9MjgKKycjJz0yMTgKKyclJz00MworJyU9Jz0yNAorJyYmJz0xNQorJyYnPTI0MQorJygnPTIwMAorJyknPTIwMQorJyonPTQwCisnKionPTQxCisnKj0nPTIyCisnKyc9MzgKKycrKyc9NDUKKycrPSc9MjAKKycsJz0yMTYKKyctJz0zOQorJy0tJz00NgorJy09Jz0yMQorJy0+Jz0zMgorJy4nPTQ3CisnLi4nPTM0CisnLi48Jz0zMworJy8nPTQyCisnLz0nPTIzCisnOic9MjI1CisnOjonPTI1MAorJzsnPTIyMQorJzwnPTMxCisnPD4nPTM2CisnPSc9MTMKKyc9PSc9MjUKKyc9PT0nPTI3CisnPT4nPTM1CisnPic9MzAKKyc+PSc9MjkKKyc/Jz0yNDAKKyc/Lic9MjUxCisnPzonPTM3CisnQCc9MjE1CisnWyc9MjE5CisnXSc9MjE3CisnYTMnPTY0CisnYTQnPTYzCisnYTUnPTY1CisnYWdncmVnYXRlJz0xOTYKKydhbGwnPTE5CisnYWx0ZXJuYXRlJz0xNTIKKydhcyc9MTg0CisnYXV0b3RleHQnPTIxMgorJ2F2ZXJhZ2UnPTkyCisnYmFja2dyb3VuZGNvbG9yJz0xNTEKKydiYWQtcmlzaW5nJz05NworJ2JvbGQnPTI0MgorJ2JvcmRlci1ib3R0b20nPTE1NgorJ2JvcmRlci1sZWZ0Jz0xNTcKKydib3JkZXItcmlnaHQnPTE1OAorJ2JvcmRlci10b3AnPTE1NQorJ2JvdHRvbW1hcmdpbic9MTM4CisnYnknPTE5MAorJ2J5LXBlcmNlbnQnPTE0MgorJ2Nhc2UnPTIyNworJ2NhdGNoJz0yMzkKKydjZWxsJz0xODYKKydjZWxsY29sb3InPTIwNQorJ2NlbnRlcic9NzkKKydjbGlwJz0xMTcKKydjbSc9NTYKKydjb2xvcic9MTQwCisnY29sb3JzJz0xMjgKKydjb2x1bW5zcGFuJz0xODcKKydjb25jYXQnPTE4CisnY291bnQnPTg5CisnY3VycmVuY3knPTg2CisnY3VzdG9tJz0xNgorJ2RhcmtlbnMnPTE0MQorJ2Rhc2hlZCc9MTA0CisnZGF0YW1hcnQnPTE3NAorJ2RhdGUnPTE3MQorJ2RhdGUrdGltZSc9MTcyCisnZGF5cyBpbiBwYXN0Jz0yMDMKKydkZWZhdWx0Jz0yMjYKKydkZXNjcmliZWQgYnknPTE3OAorJ2RldGFpbCc9MTgxCisnZGV0YWlsZm9vdGVyJz0yNDYKKydkZXRhaWxoZWFkZXInPTI0NQorJ2RldGFpbHMnPTE5MQorJ2RpdmlkZSc9MTcKKydkbyc9MjMwCisnZG90dGVkJz0xMDMKKydkb3VibGUnPTEwNQorJ2R5bmFtaWMnPTI0OAorJ2Vsc2UnPTIyMworJ2VtJz02MAorJ2VtYmVkJz0xMjAKKydleCc9NjEKKydleHRlbmRzJz00OQorJ2V4dGVuc2lvbic9NTIKKydleHRlcm5hbENzc1VSSSc9MTI1CisnZmFsc2UnPTU0CisnZmFtaWx5Jz0xNDcKKydmaWxlJz0xMTgKKydmaW5hbGx5Jz0yMzcKKydmaXhlZCc9ODMKKydmb250Jz0xNDYKKydmb250cyc9MTI5CisnZm9vdGVyJz0xODIKKydmb3InPTIyOAorJ2Zvcm1hdHRlcic9MTUwCisnZm9ybWF0dGVycyc9MTI3CisnZnJvbSBidW5kbGUnPTEyNgorJ2dlbmVyYWwtbnVtYmVyJz04MgorJ2dvb2Qtc2xvcGluZyc9OTkKKydncmlkJz0xODMKKydncm9vdmUnPTEwNgorJ2dyb3VwJz0xODkKKydoZWFkZXInPTE3OQorJ2hlaWdodCc9MTgwCisnaGlkZWxhYmVsJz0yNDcKKydodG1sJz04NworJ2ljb24nPTIwNgorJ2lmJz0yMjIKKydpbWFnZSc9MjEzCisnaW1wb3J0Jz01MQorJ2luY2gnPTU4CisnaW5zZXQnPTEwOAorJ2luc3RhbmNlb2YnPTIyMAorJ2ludGVydmFscyc9MTkyCisnaXRhbGljJz03MworJ2xhYmVsJz0yMTAKKydsYW5kc2NhcGUnPTcxCisnbGF5b3V0LWRhdGEnPTEyNAorJ2xlZnQnPTc4CisnbGVmdG1hcmdpbic9MTM3CisnbGlnaHRlbnMnPTE0MworJ2xvb2t1cHMnPTE5MworJ21hcmdpbi1ib3R0b20nPTE2NAorJ21hcmdpbi1sZWZ0Jz0xNjUKKydtYXJnaW4tcmlnaHQnPTE2NgorJ21hcmdpbi10b3AnPTE2MworJ21heGltdW0nPTk0CisnbWVkaWEnPTEzMQorJ21lZGlhcyc9MTMwCisnbWluaW11bSc9OTMKKydtbSc9NTUKKydtb25vc3BhY2UnPTc1CisnbmV3Jz0yMzEKKydub25lJz0xMDEKKydub3JtYWwnPTcyCisnbnVsbCc9MjMyCisnbnVtYmVyJz0xNzAKKydvYmxpcXVlJz03NAorJ29mJz0xOTkKKydvbi1ncm91cCc9MTk3Cisnb3JpZW50YXRpb24nPTEzNQorJ291dHNldCc9MTA5CisncGFja2FnZSc9MTIxCisncGFkZGluZy1ib3R0b20nPTE2MAorJ3BhZGRpbmctbGVmdCc9MTYxCisncGFkZGluZy1yaWdodCc9MTYyCisncGFkZGluZy10b3AnPTE1OQorJ3BhZ2UtbnVtYmVyJz0xMTAKKydwYWdlLW51bWJlci11bmZpbHRlcmVkJz0xMTIKKydwYWdlLXZhcmlhYmxlJz0xMTQKKydwYWdldGVtcGxhdGUnPTEzMworJ3BhdGgnPTE5NAorJ3BjJz01OQorJ3BkZic9ODgKKydwZXJjZW50Jz04NAorJ3BvcnRyYWl0Jz03MAorJ3Byb3BlcnR5Jz0xOTUKKydwdCc9NTcKKydweCc9NjIKKydyZW5kZXJpbmcnPTE3NQorJ3JlcG9ydCc9MTY5CisncmVzaXplJz0yNDkKKydyZXR1cm4nPTIzNQorJ3JpZGdlJz0xMDcKKydyaWdodCc9ODAKKydyaWdodG1hcmdpbic9MTM5CisncmlzaW5nJz05NgorJ3Jvdyc9MTg1CisncnVubmluZy1jb3VudCc9OTAKKydydW5uaW5nLXN1bSc9OTUKKydzYW5zLXNlcmlmJz03NgorJ3NjYWxlJz0yMTQKKydzY2FsZS10by1pdGVtJz0xMTYKKydzY2llbnRpZmljJz04NQorJ3NlcmlmJz03NworJ3Nob3dPbkZpcnN0Jz0yNDMKKydzaG93T25MYXN0Jz0yNDQKKydzaXplJz0xNDgKKydzaXplLXRvLWltYWdlJz0xMTUKKydzbG9waW5nJz05OAorJ3NvbGlkJz0xMDIKKydzdGFnbmF0aW5nJz0xMDAKKydzdGF0aWMnPTUwCisnc3RyaW5nJz0yMDQKKydzdHlsZSc9MTQ5Cisnc3R5bGVzJz0xMzIKKydzdWJzdWJ0aXRsZSc9MjA5Cisnc3VidGl0bGUnPTIwOAorJ3N1bSc9OTEKKydzdXBlcic9NTMKKydzd2l0Y2gnPTIyNAorJ3N5bmNocm9uaXplZCc9MjM4CisndGFibGUnPTE4OAorJ3RlbXBsYXRlJz0xNzcKKyd0ZXh0Jz0yMTEKKyd0ZXh0YWxpZ24nPTE1NAorJ3RleHRjb2xvcic9MTUzCisndGhyb3cnPTIzNAorJ3RpbWUnPTE3MworJ3RpdGxlJz0xOTgKKyd0b29sYmFyJz0xNzYKKyd0b3BtYXJnaW4nPTEzNgorJ3RvdGFsLXBhZ2UnPTExMQorJ3RvdGFsLXBhZ2UtdW5maWx0ZXJlZCc9MTEzCisndG93YXJkcyc9MTQ1CisndHJhbnNmb3Jtcyc9MTQ0CisndHJlbmQnPTIwNworJ3RydWUnPTI1NAorJ3RyeSc9MjM2CisndHlwZSc9MTM0CisndHlwZW9mJz0yMzMKKyd1aSc9MTY4CisndW5mb3JtYXR0ZWQnPTgxCisndW9tbyc9MTY3CisndXAgdG8nPTIwMgorJ3VybCc9MTE5CisndXMtbGVkZ2VyJz02OAorJ3VzLWxlZ2FsJz02NworJ3VzLWxldHRlcic9NjYKKyd1cy1zdXBlci1iJz02OQorJ3ZhbCc9NDgKKyd2YXInPTI1MworJ3doaWxlJz0yMjkKKyd7Jz0xMjIKKyd8Jz0yNTIKKyd8fCc9MTQKKyd9Jz0xMjMKK1JVTEVfQU5ZX09USEVSPTEyCitSVUxFX0RFQ0lNQUw9OAorUlVMRV9IRVg9NgorUlVMRV9JRD01CitSVUxFX0lOVD03CitSVUxFX01MX0NPTU1FTlQ9OQorUlVMRV9TTF9DT01NRU5UPTEwCitSVUxFX1NUUklORz00CitSVUxFX1dTPTExCitUX18xMDA9MTAwCitUX18xMDE9MTAxCitUX18xMDI9MTAyCitUX18xMDM9MTAzCitUX18xMDQ9MTA0CitUX18xMDU9MTA1CitUX18xMDY9MTA2CitUX18xMDc9MTA3CitUX18xMDg9MTA4CitUX18xMDk9MTA5CitUX18xMTA9MTEwCitUX18xMTE9MTExCitUX18xMTI9MTEyCitUX18xMTM9MTEzCitUX18xMTQ9MTE0CitUX18xMTU9MTE1CitUX18xMTY9MTE2CitUX18xMTc9MTE3CitUX18xMTg9MTE4CitUX18xMTk9MTE5CitUX18xMjA9MTIwCitUX18xMjE9MTIxCitUX18xMjI9MTIyCitUX18xMjM9MTIzCitUX18xMjQ9MTI0CitUX18xMjU9MTI1CitUX18xMjY9MTI2CitUX18xMjc9MTI3CitUX18xMjg9MTI4CitUX18xMjk9MTI5CitUX18xMzA9MTMwCitUX18xMzE9MTMxCitUX18xMzI9MTMyCitUX18xMzM9MTMzCitUX18xMzQ9MTM0CitUX18xMzU9MTM1CitUX18xMzY9MTM2CitUX18xMzc9MTM3CitUX18xMzg9MTM4CitUX18xMzk9MTM5CitUX18xMz0xMworVF9fMTQwPTE0MAorVF9fMTQxPTE0MQorVF9fMTQyPTE0MgorVF9fMTQzPTE0MworVF9fMTQ0PTE0NAorVF9fMTQ1PTE0NQorVF9fMTQ2PTE0NgorVF9fMTQ3PTE0NworVF9fMTQ4PTE0OAorVF9fMTQ5PTE0OQorVF9fMTQ9MTQKK1RfXzE1MD0xNTAKK1RfXzE1MT0xNTEKK1RfXzE1Mj0xNTIKK1RfXzE1Mz0xNTMKK1RfXzE1ND0xNTQKK1RfXzE1NT0xNTUKK1RfXzE1Nj0xNTYKK1RfXzE1Nz0xNTcKK1RfXzE1OD0xNTgKK1RfXzE1OT0xNTkKK1RfXzE1PTE1CitUX18xNjA9MTYwCitUX18xNjE9MTYxCitUX18xNjI9MTYyCitUX18xNjM9MTYzCitUX18xNjQ9MTY0CitUX18xNjU9MTY1CitUX18xNjY9MTY2CitUX18xNjc9MTY3CitUX18xNjg9MTY4CitUX18xNjk9MTY5CitUX18xNj0xNgorVF9fMTcwPTE3MAorVF9fMTcxPTE3MQorVF9fMTcyPTE3MgorVF9fMTczPTE3MworVF9fMTc0PTE3NAorVF9fMTc1PTE3NQorVF9fMTc2PTE3NgorVF9fMTc3PTE3NworVF9fMTc4PTE3OAorVF9fMTc5PTE3OQorVF9fMTc9MTcKK1RfXzE4MD0xODAKK1RfXzE4MT0xODEKK1RfXzE4Mj0xODIKK1RfXzE4Mz0xODMKK1RfXzE4ND0xODQKK1RfXzE4NT0xODUKK1RfXzE4Nj0xODYKK1RfXzE4Nz0xODcKK1RfXzE4OD0xODgKK1RfXzE4OT0xODkKK1RfXzE4PTE4CitUX18xOTA9MTkwCitUX18xOTE9MTkxCitUX18xOTI9MTkyCitUX18xOTM9MTkzCitUX18xOTQ9MTk0CitUX18xOTU9MTk1CitUX18xOTY9MTk2CitUX18xOTc9MTk3CitUX18xOTg9MTk4CitUX18xOTk9MTk5CitUX18xOT0xOQorVF9fMjAwPTIwMAorVF9fMjAxPTIwMQorVF9fMjAyPTIwMgorVF9fMjAzPTIwMworVF9fMjA0PTIwNAorVF9fMjA1PTIwNQorVF9fMjA2PTIwNgorVF9fMjA3PTIwNworVF9fMjA4PTIwOAorVF9fMjA5PTIwOQorVF9fMjA9MjAKK1RfXzIxMD0yMTAKK1RfXzIxMT0yMTEKK1RfXzIxMj0yMTIKK1RfXzIxMz0yMTMKK1RfXzIxND0yMTQKK1RfXzIxNT0yMTUKK1RfXzIxNj0yMTYKK1RfXzIxNz0yMTcKK1RfXzIxOD0yMTgKK1RfXzIxOT0yMTkKK1RfXzIxPTIxCitUX18yMjA9MjIwCitUX18yMjE9MjIxCitUX18yMjI9MjIyCitUX18yMjM9MjIzCitUX18yMjQ9MjI0CitUX18yMjU9MjI1CitUX18yMjY9MjI2CitUX18yMjc9MjI3CitUX18yMjg9MjI4CitUX18yMjk9MjI5CitUX18yMj0yMgorVF9fMjMwPTIzMAorVF9fMjMxPTIzMQorVF9fMjMyPTIzMgorVF9fMjMzPTIzMworVF9fMjM0PTIzNAorVF9fMjM1PTIzNQorVF9fMjM2PTIzNgorVF9fMjM3PTIzNworVF9fMjM4PTIzOAorVF9fMjM5PTIzOQorVF9fMjM9MjMKK1RfXzI0MD0yNDAKK1RfXzI0MT0yNDEKK1RfXzI0Mj0yNDIKK1RfXzI0Mz0yNDMKK1RfXzI0ND0yNDQKK1RfXzI0NT0yNDUKK1RfXzI0Nj0yNDYKK1RfXzI0Nz0yNDcKK1RfXzI0OD0yNDgKK1RfXzI0OT0yNDkKK1RfXzI0PTI0CitUX18yNTA9MjUwCitUX18yNTE9MjUxCitUX18yNTI9MjUyCitUX18yNTM9MjUzCitUX18yNTQ9MjU0CitUX18yNT0yNQorVF9fMjY9MjYKK1RfXzI3PTI3CitUX18yOD0yOAorVF9fMjk9MjkKK1RfXzMwPTMwCitUX18zMT0zMQorVF9fMzI9MzIKK1RfXzMzPTMzCitUX18zND0zNAorVF9fMzU9MzUKK1RfXzM2PTM2CitUX18zNz0zNworVF9fMzg9MzgKK1RfXzM5PTM5CitUX180MD00MAorVF9fNDE9NDEKK1RfXzQyPTQyCitUX180Mz00MworVF9fNDQ9NDQKK1RfXzQ1PTQ1CitUX180Nj00NgorVF9fNDc9NDcKK1RfXzQ4PTQ4CitUX180OT00OQorVF9fNTA9NTAKK1RfXzUxPTUxCitUX181Mj01MgorVF9fNTM9NTMKK1RfXzU0PTU0CitUX181NT01NQorVF9fNTY9NTYKK1RfXzU3PTU3CitUX181OD01OAorVF9fNTk9NTkKK1RfXzYwPTYwCitUX182MT02MQorVF9fNjI9NjIKK1RfXzYzPTYzCitUX182ND02NAorVF9fNjU9NjUKK1RfXzY2PTY2CitUX182Nz02NworVF9fNjg9NjgKK1RfXzY5PTY5CitUX183MD03MAorVF9fNzE9NzEKK1RfXzcyPTcyCitUX183Mz03MworVF9fNzQ9NzQKK1RfXzc1PTc1CitUX183Nj03NgorVF9fNzc9NzcKK1RfXzc4PTc4CitUX183OT03OQorVF9fODA9ODAKK1RfXzgxPTgxCitUX184Mj04MgorVF9fODM9ODMKK1RfXzg0PTg0CitUX184NT04NQorVF9fODY9ODYKK1RfXzg3PTg3CitUX184OD04OAorVF9fODk9ODkKK1RfXzkwPTkwCitUX185MT05MQorVF9fOTI9OTIKK1RfXzkzPTkzCitUX185ND05NAorVF9fOTU9OTUKK1RfXzk2PTk2CitUX185Nz05NworVF9fOTg9OTgKK1RfXzk5PTk5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xMZXhlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMTGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQyNTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMTGV4ZXIuamF2YQpAQCAtMCwwICsxLDk2MzMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxSZXBvcnREU0xMZXhlciBleHRlbmRzIExleGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDQ9MTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Mz0xNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ2PTE0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDU9MTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0MD0xNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQyPTE0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDE9MTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU5PTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU1PTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU2PTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU3PTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU4PTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUxPTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNz0xMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM2PTEzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzk9MTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU0PTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzOD0xMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMzPTEzMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTQ9MjU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMj0xMzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUzPTI1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzU9MTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYxPTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzND0xMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUwPTI1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMxPTEzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTI9MjUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMD0xMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUxPTI1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lOVD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY2PTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY3PTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOT0xMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI2PTEyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDc9MjQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYzPTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNT0xMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ2PTI0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjg9MTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0OT0yNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI3PTEyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDg9MjQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nj0xNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY1PTE2NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjg9MTY4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nz0xNjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYyPTE2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjE9MTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2ND0xNjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYzPTE2MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjA9MTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMzPTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM0PTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM1PTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM2PTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1OT0xNTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzA9MzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU4PTE1ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTU9MTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1ND0xNTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU3PTE1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTY9MTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MT0xNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUwPTE1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTM9MTUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mj0xNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDg9NDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDk9NDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDQ9NDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDU9NDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDY9NDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDc9NDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDA9NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ4PTE0ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDc9MTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQyPTQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQzPTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0OT0xNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAwPTEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjE9MjIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyMD0yMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAyPTEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjM9MjIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMT0xMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjIyPTIyMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTg9MjE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxNz0yMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE5PTIxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTQ9MjE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMz0yMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE2PTIxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTU9MjE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMD0yMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjEyPTIxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTE9MjExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfREVDSU1BTD04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI3PTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI4PTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI5PTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwNz0yMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA2PTIwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDk9MjA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwOD0yMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAzPTIwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDI9MjAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwNT0yMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA0PTIwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjI9MTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0Mz0yNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIxPTEyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDI9MjQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyND0xMjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ1PTI0NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjM9MTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0ND0yNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIwPTEyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDE9MjQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0MD0yNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TTF9DT01NRU5UPTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExOT0xMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE4PTExODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzk9MjM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNT0xMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM2PTIzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzU9MjM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNz0xMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM4PTIzODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTY9MTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzNz0yMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTExPTExMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzI9MjMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjMxPTIzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTM9MTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzND0yMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEyPTExMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzM9MjMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzMD0yMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjk9MjI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI4PTIyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDk9MTA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwND0xMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI1PTIyNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyND0yMjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjc9MjI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNT0xMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI2PTIyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0hFWD02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwMT0yMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAwPTIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODg9MTg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Nz0xODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTM9OTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg5PTE4OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODQ9MTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Mz0xODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg2PTE4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODU9MTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4MD0xODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTgyPTE4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODE9MTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk5PTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk1PTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk2PTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk3PTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk4PTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3Nz0xNzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc2PTE3NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzk9MTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3OD0xNzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTczPTE3MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzI9MTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3NT0xNzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc0PTE3NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzE9MTcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3MD0xNzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY5PTE2OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc3PTc3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc4PTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc5PTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzczPTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5OT0xOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk4PTE5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mz04MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTU9MTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5ND0xOTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTc9MTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Nj0xOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkxPTE5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTA9MTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Mz0xOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkyPTE5MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nj04NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworICAgIHB1YmxpYyBJbnRlcm5hbFJlcG9ydERTTExleGVyKCkgezt9IAorICAgIHB1YmxpYyBJbnRlcm5hbFJlcG9ydERTTExleGVyKENoYXJTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIEludGVybmFsUmVwb3J0RFNMTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZyI7IH0KKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE6NzogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE6OTogJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyOjc6ICggJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjo5OiAnfHwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgifHwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOjc6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzo5OiAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJiYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0Ojc6ICggJ2N1c3RvbScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ6OTogJ2N1c3RvbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjdXN0b20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Ojc6ICggJ2RpdmlkZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU6OTogJ2RpdmlkZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkaXZpZGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2Ojc6ICggJ2NvbmNhdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY6OTogJ2NvbmNhdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjb25jYXQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Ojc6ICggJ2FsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc6OTogJ2FsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4Ojc6ICggJys9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODo5OiAnKz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Ojc6ICggJy09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTo5OiAnLT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwOjc6ICggJyo9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDo5OiAnKj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxOjc6ICggJy89JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTo5OiAnLz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyOjc6ICggJyU9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjo5OiAnJT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzOjc6ICggJz09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzo5OiAnPT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0Ojc6ICggJyE9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDo5OiAnIT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiIT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1Ojc6ICggJz09PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU6OTogJz09PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2Ojc6ICggJyE9PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY6OTogJyE9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3Ojc6ICggJz49JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzo5OiAnPj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Ojc6ICggJz4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Ojk6ICc+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz4nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTo3OiAoICc8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTo5OiAnPCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA6NzogKCAnLT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwOjk6ICctPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE6NzogKCAnLi48JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTo5OiAnLi48JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uPCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzI6NzogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyOjk6ICcuLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIuLiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM6NzogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzOjk6ICc9PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ6NzogKCAnPD4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM0Ojk6ICc8PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI8PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzU6NzogKCAnPzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1Ojk6ICc/OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY6NzogKCAnKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY6OTogJysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3Ojc6ICggJy0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3Ojk6ICctJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJy0nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODo3OiAoICcqJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODo5OiAnKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcqJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzk6NzogKCAnKionICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM5Ojk6ICcqKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqKiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDA6NzogKCAnLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDA6OTogJy8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQxOjc6ICggJyUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQxOjk6ICclJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyUnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Mjo3OiAoICchJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Mjo5OiAnIScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCchJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDM6NzogKCAnKysnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQzOjk6ICcrKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrKyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDQ6NzogKCAnLS0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ0Ojk6ICctLScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItLSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDU6NzogKCAnLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDU6OTogJy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ2Ojc6ICggJ3ZhbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDY6OTogJ3ZhbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3Ojc6ICggJ2V4dGVuZHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3Ojk6ICdleHRlbmRzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVuZHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ4Ojc6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDg6OTogJ3N0YXRpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdGF0aWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ5Ojc6ICggJ2ltcG9ydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDk6OTogJ2ltcG9ydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbXBvcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUwOjc6ICggJ2V4dGVuc2lvbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTA6OTogJ2V4dGVuc2lvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbnNpb24iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUxOjc6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MTo5OiAnc3VwZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3VwZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUyOjc6ICggJ2ZhbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Mjo5OiAnZmFsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUzOjc6ICggJ21tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Mzo5OiAnbW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU0Ojc6ICggJ2NtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NDo5OiAnY20nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU1Ojc6ICggJ3B0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NTo5OiAncHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU2Ojc6ICggJ2luY2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU2Ojk6ICdpbmNoJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImluY2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU3Ojc6ICggJ3BjJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Nzo5OiAncGMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU4Ojc6ICggJ2VtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1ODo5OiAnZW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU5Ojc6ICggJ2V4JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1OTo5OiAnZXgnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXgiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYwOjc6ICggJ3B4JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2MDo5OiAncHgnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHgiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYxOjc6ICggJ2E0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2MTo5OiAnYTQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYTQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYyOjc6ICggJ2EzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mjo5OiAnYTMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYTMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYzOjc6ICggJ2E1JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mzo5OiAnYTUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYTUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY0Ojc6ICggJ3VzLWxldHRlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjQ6OTogJ3VzLWxldHRlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1cy1sZXR0ZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY1Ojc6ICggJ3VzLWxlZ2FsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2NTo5OiAndXMtbGVnYWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXMtbGVnYWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY2Ojc6ICggJ3VzLWxlZGdlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjY6OTogJ3VzLWxlZGdlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1cy1sZWRnZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY3Ojc6ICggJ3VzLXN1cGVyLWInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY3Ojk6ICd1cy1zdXBlci1iJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzLXN1cGVyLWIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY4Ojc6ICggJ3BvcnRyYWl0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2ODo5OiAncG9ydHJhaXQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicG9ydHJhaXQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY5Ojc6ICggJ2xhbmRzY2FwZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Njk6OTogJ2xhbmRzY2FwZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsYW5kc2NhcGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcwOjc6ICggJ25vcm1hbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzA6OTogJ25vcm1hbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub3JtYWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzczIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcxOjc6ICggJ2l0YWxpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzE6OTogJ2l0YWxpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpdGFsaWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcyOjc6ICggJ29ibGlxdWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcyOjk6ICdvYmxpcXVlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm9ibGlxdWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjczOjc6ICggJ21vbm9zcGFjZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzM6OTogJ21vbm9zcGFjZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtb25vc3BhY2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc0Ojc6ICggJ3NhbnMtc2VyaWYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc0Ojk6ICdzYW5zLXNlcmlmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNhbnMtc2VyaWYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc1Ojc6ICggJ3NlcmlmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3NTo5OiAnc2VyaWYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2VyaWYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc2Ojc6ICggJ2xlZnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc2Ojk6ICdsZWZ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxlZnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc3Ojc6ICggJ2NlbnRlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Nzc6OTogJ2NlbnRlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjZW50ZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc4Ojc6ICggJ3JpZ2h0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3ODo5OiAncmlnaHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc5Ojc6ICggJ3VuZm9ybWF0dGVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3OTo5OiAndW5mb3JtYXR0ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidW5mb3JtYXR0ZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgwOjc6ICggJ2dlbmVyYWwtbnVtYmVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MDo5OiAnZ2VuZXJhbC1udW1iZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZ2VuZXJhbC1udW1iZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgxOjc6ICggJ2ZpeGVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MTo5OiAnZml4ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZml4ZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgyOjc6ICggJ3BlcmNlbnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgyOjk6ICdwZXJjZW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBlcmNlbnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgzOjc6ICggJ3NjaWVudGlmaWMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgzOjk6ICdzY2llbnRpZmljJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNjaWVudGlmaWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg0Ojc6ICggJ2N1cnJlbmN5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDo5OiAnY3VycmVuY3knCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY3VycmVuY3kiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg1Ojc6ICggJ2h0bWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg1Ojk6ICdodG1sJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImh0bWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg2Ojc6ICggJ3BkZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODY6OTogJ3BkZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwZGYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg3Ojc6ICggJ2NvdW50JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4Nzo5OiAnY291bnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY291bnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg4Ojc6ICggJ3J1bm5pbmctY291bnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg4Ojk6ICdydW5uaW5nLWNvdW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJ1bm5pbmctY291bnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg5Ojc6ICggJ3N1bScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODk6OTogJ3N1bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkwOjc6ICggJ2F2ZXJhZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkwOjk6ICdhdmVyYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImF2ZXJhZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkxOjc6ICggJ21pbmltdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkxOjk6ICdtaW5pbXVtJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1pbmltdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkyOjc6ICggJ21heGltdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkyOjk6ICdtYXhpbXVtJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1heGltdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkzOjc6ICggJ3J1bm5pbmctc3VtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5Mzo5OiAncnVubmluZy1zdW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicnVubmluZy1zdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk0Ojc6ICggJ3Jpc2luZycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTQ6OTogJ3Jpc2luZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyaXNpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk1Ojc6ICggJ2JhZC1yaXNpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk1Ojk6ICdiYWQtcmlzaW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJhZC1yaXNpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk2Ojc6ICggJ3Nsb3BpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk2Ojk6ICdzbG9waW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNsb3BpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk3Ojc6ICggJ2dvb2Qtc2xvcGluZycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTc6OTogJ2dvb2Qtc2xvcGluZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJnb29kLXNsb3BpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk4Ojg6ICggJ3N0YWduYXRpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk4OjEwOiAnc3RhZ25hdGluZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdGFnbmF0aW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTk6ODogKCAnbm9uZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTk6MTA6ICdub25lJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5vbmUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDA6ODogKCAnc29saWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMDoxMDogJ3NvbGlkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNvbGlkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAxOjg6ICggJ2RvdHRlZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAxOjEwOiAnZG90dGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRvdHRlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMjo4OiAoICdkYXNoZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMjoxMDogJ2Rhc2hlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkYXNoZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDM6ODogKCAnZG91YmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDM6MTA6ICdkb3VibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZG91YmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA0Ojg6ICggJ2dyb292ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA0OjEwOiAnZ3Jvb3ZlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdyb292ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNTo4OiAoICdyaWRnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA1OjEwOiAncmlkZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmlkZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDY6ODogKCAnaW5zZXQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNjoxMDogJ2luc2V0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImluc2V0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA3Ojg6ICggJ291dHNldCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA3OjEwOiAnb3V0c2V0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm91dHNldCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwODo4OiAoICdwYWdlLW51bWJlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA4OjEwOiAncGFnZS1udW1iZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFnZS1udW1iZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDk6ODogKCAndG90YWwtcGFnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA5OjEwOiAndG90YWwtcGFnZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b3RhbC1wYWdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEwOjg6ICggJ3BhZ2UtbnVtYmVyLXVuZmlsdGVyZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMDoxMDogJ3BhZ2UtbnVtYmVyLXVuZmlsdGVyZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFnZS1udW1iZXItdW5maWx0ZXJlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMTo4OiAoICd0b3RhbC1wYWdlLXVuZmlsdGVyZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMToxMDogJ3RvdGFsLXBhZ2UtdW5maWx0ZXJlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b3RhbC1wYWdlLXVuZmlsdGVyZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTI6ODogKCAncGFnZS12YXJpYWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEyOjEwOiAncGFnZS12YXJpYWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwYWdlLXZhcmlhYmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEzOjg6ICggJ3NpemUtdG8taW1hZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMzoxMDogJ3NpemUtdG8taW1hZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2l6ZS10by1pbWFnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNDo4OiAoICdzY2FsZS10by1pdGVtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTQ6MTA6ICdzY2FsZS10by1pdGVtJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNjYWxlLXRvLWl0ZW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTU6ODogKCAnY2xpcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE1OjEwOiAnY2xpcCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjbGlwIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE2Ojg6ICggJ2ZpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNjoxMDogJ2ZpbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmlsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNzo4OiAoICd1cmwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNzoxMDogJ3VybCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1cmwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTg6ODogKCAnZW1iZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExODoxMDogJ2VtYmVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVtYmVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTIxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5Ojg6ICggJ3BhY2thZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExOToxMDogJ3BhY2thZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFja2FnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyMDo4OiAoICd7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjA6MTA6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIxOjg6ICggJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyMToxMDogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnfScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTIzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjI6ODogKCAnbGF5b3V0LWRhdGEnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyMjoxMDogJ2xheW91dC1kYXRhJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxheW91dC1kYXRhIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzOjg6ICggJ2V4dGVybmFsQ3NzVVJJJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjM6MTA6ICdleHRlcm5hbENzc1VSSScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlcm5hbENzc1VSSSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNDo4OiAoICdmcm9tIGJ1bmRsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI0OjEwOiAnZnJvbSBidW5kbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZnJvbSBidW5kbGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjU6ODogKCAnZm9ybWF0dGVycycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI1OjEwOiAnZm9ybWF0dGVycycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3JtYXR0ZXJzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI2Ojg6ICggJ2NvbG9ycycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI2OjEwOiAnY29sb3JzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNvbG9ycyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNzo4OiAoICdmb250cycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI3OjEwOiAnZm9udHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZm9udHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg6ODogKCAnbWVkaWFzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg6MTA6ICdtZWRpYXMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWVkaWFzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI5Ojg6ICggJ21lZGlhJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjk6MTA6ICdtZWRpYScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtZWRpYSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMDo4OiAoICdzdHlsZXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMDoxMDogJ3N0eWxlcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdHlsZXMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzE6ODogKCAncGFnZXRlbXBsYXRlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzE6MTA6ICdwYWdldGVtcGxhdGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFnZXRlbXBsYXRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMyOjg6ICggJ3R5cGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMjoxMDogJ3R5cGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHlwZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMzo4OiAoICdvcmllbnRhdGlvbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMzOjEwOiAnb3JpZW50YXRpb24nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgib3JpZW50YXRpb24iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzQ6ODogKCAndG9wbWFyZ2luJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzQ6MTA6ICd0b3BtYXJnaW4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9wbWFyZ2luIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM1Ojg6ICggJ2xlZnRtYXJnaW4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNToxMDogJ2xlZnRtYXJnaW4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGVmdG1hcmdpbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNjo4OiAoICdib3R0b21tYXJnaW4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNjoxMDogJ2JvdHRvbW1hcmdpbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJib3R0b21tYXJnaW4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzc6ODogKCAncmlnaHRtYXJnaW4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNzoxMDogJ3JpZ2h0bWFyZ2luJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJpZ2h0bWFyZ2luIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM4Ojg6ICggJ2NvbG9yJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzg6MTA6ICdjb2xvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjb2xvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOTo4OiAoICdkYXJrZW5zJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzk6MTA6ICdkYXJrZW5zJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRhcmtlbnMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDA6ODogKCAnYnktcGVyY2VudCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQwOjEwOiAnYnktcGVyY2VudCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJieS1wZXJjZW50Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOjg6ICggJ2xpZ2h0ZW5zJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE6MTA6ICdsaWdodGVucycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsaWdodGVucyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0Mjo4OiAoICd0cmFuc2Zvcm1zJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDI6MTA6ICd0cmFuc2Zvcm1zJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyYW5zZm9ybXMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDM6ODogKCAndG93YXJkcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQzOjEwOiAndG93YXJkcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b3dhcmRzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ0Ojg6ICggJ2ZvbnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NDoxMDogJ2ZvbnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZm9udCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NTo4OiAoICdmYW1pbHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NToxMDogJ2ZhbWlseScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmYW1pbHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDY6ODogKCAnc2l6ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ2OjEwOiAnc2l6ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaXplIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ3Ojg6ICggJ3N0eWxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDc6MTA6ICdzdHlsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdHlsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0ODo4OiAoICdmb3JtYXR0ZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0ODoxMDogJ2Zvcm1hdHRlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3JtYXR0ZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk6ODogKCAnYmFja2dyb3VuZGNvbG9yJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk6MTA6ICdiYWNrZ3JvdW5kY29sb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYmFja2dyb3VuZGNvbG9yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwOjg6ICggJ2FsdGVybmF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwOjEwOiAnYWx0ZXJuYXRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFsdGVybmF0ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MTo4OiAoICd0ZXh0Y29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MToxMDogJ3RleHRjb2xvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0ZXh0Y29sb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTI6ODogKCAndGV4dGFsaWduJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTI6MTA6ICd0ZXh0YWxpZ24nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGV4dGFsaWduIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUzOjg6ICggJ2JvcmRlci10b3AnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MzoxMDogJ2JvcmRlci10b3AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYm9yZGVyLXRvcCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1NDo4OiAoICdib3JkZXItYm90dG9tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTQ6MTA6ICdib3JkZXItYm90dG9tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1ib3R0b20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTU6ODogKCAnYm9yZGVyLWxlZnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1NToxMDogJ2JvcmRlci1sZWZ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1sZWZ0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU2Ojg6ICggJ2JvcmRlci1yaWdodCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU2OjEwOiAnYm9yZGVyLXJpZ2h0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1yaWdodCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Nzo4OiAoICdwYWRkaW5nLXRvcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3OjEwOiAncGFkZGluZy10b3AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFkZGluZy10b3AiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTg6ODogKCAncGFkZGluZy1ib3R0b20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1ODoxMDogJ3BhZGRpbmctYm90dG9tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctYm90dG9tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU5Ojg6ICggJ3BhZGRpbmctbGVmdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU5OjEwOiAncGFkZGluZy1sZWZ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctbGVmdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MDo4OiAoICdwYWRkaW5nLXJpZ2h0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjA6MTA6ICdwYWRkaW5nLXJpZ2h0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctcmlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjE6ODogKCAnbWFyZ2luLXRvcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxOjEwOiAnbWFyZ2luLXRvcCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtYXJnaW4tdG9wIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTY0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTY0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYyOjg6ICggJ21hcmdpbi1ib3R0b20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MjoxMDogJ21hcmdpbi1ib3R0b20nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLWJvdHRvbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2Mzo4OiAoICdtYXJnaW4tbGVmdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYzOjEwOiAnbWFyZ2luLWxlZnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLWxlZnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjQ6ODogKCAnbWFyZ2luLXJpZ2h0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjQ6MTA6ICdtYXJnaW4tcmlnaHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLXJpZ2h0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTY3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTY3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY1Ojg6ICggJ3VvbW8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2NToxMDogJ3VvbW8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidW9tbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2Njo4OiAoICd1aScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY2OjEwOiAndWknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidWkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjc6ODogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjc6MTA6ICdyZXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVwb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTcwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTcwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY4Ojg6ICggJ251bWJlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY4OjEwOiAnbnVtYmVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm51bWJlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2OTo4OiAoICdkYXRlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjk6MTA6ICdkYXRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRhdGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTcxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzA6ODogKCAnZGF0ZSt0aW1lJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzA6MTA6ICdkYXRlK3RpbWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF0ZSt0aW1lIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTczIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTczOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcxOjg6ICggJ3RpbWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MToxMDogJ3RpbWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGltZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Mjo4OiAoICdkYXRhbWFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcyOjEwOiAnZGF0YW1hcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF0YW1hcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTc0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzM6ODogKCAncmVuZGVyaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzM6MTA6ICdyZW5kZXJpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVuZGVyaW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTc2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc0Ojg6ICggJ3Rvb2xiYXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NDoxMDogJ3Rvb2xiYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9vbGJhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NTo4OiAoICd0ZW1wbGF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc1OjEwOiAndGVtcGxhdGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGVtcGxhdGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTc3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzY6ODogKCAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzY6MTA6ICdkZXNjcmliZWQgYnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGVzY3JpYmVkIGJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTc5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc3Ojg6ICggJ2hlYWRlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc3OjEwOiAnaGVhZGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImhlYWRlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTgwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODo4OiAoICdoZWlnaHQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODoxMDogJ2hlaWdodCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJoZWlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xODEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzk6ODogKCAnZGV0YWlsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzk6MTA6ICdkZXRhaWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTgyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgwOjg6ICggJ2Zvb3RlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgwOjEwOiAnZm9vdGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvb3RlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTgzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MTo4OiAoICdncmlkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODE6MTA6ICdncmlkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdyaWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xODQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODI6ODogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjoxMDogJ2FzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTg1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTg1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgzOjg6ICggJ3JvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgzOjEwOiAncm93JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJvdyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTg2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NDo4OiAoICdjZWxsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODQ6MTA6ICdjZWxsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNlbGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTg2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xODciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODU6ODogKCAnY29sdW1uc3BhbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg1OjEwOiAnY29sdW1uc3BhbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjb2x1bW5zcGFuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTg4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTg4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg2Ojg6ICggJ3RhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODY6MTA6ICd0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTg5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4Nzo4OiAoICdncm91cCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg3OjEwOiAnZ3JvdXAnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZ3JvdXAiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODg6ODogKCAnYnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4ODoxMDogJ2J5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTkxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTkxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5Ojg6ICggJ2RldGFpbHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OToxMDogJ2RldGFpbHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlscyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTkyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MDo4OiAoICdpbnRlcnZhbHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MDoxMDogJ2ludGVydmFscycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnRlcnZhbHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTE6ODogKCAnbG9va3VwcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkxOjEwOiAnbG9va3VwcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsb29rdXBzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTk0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTk0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkyOjg6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MjoxMDogJ3BhdGgnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGF0aCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTk1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Mzo4OiAoICdwcm9wZXJ0eScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkzOjEwOiAncHJvcGVydHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHJvcGVydHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTk1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTQ6ODogKCAnYWdncmVnYXRlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTQ6MTA6ICdhZ2dyZWdhdGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYWdncmVnYXRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTk3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTk3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk1Ojg6ICggJ29uLWdyb3VwJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTU6MTA6ICdvbi1ncm91cCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvbi1ncm91cCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTk4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Njo4OiAoICd0aXRsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk2OjEwOiAndGl0bGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGl0bGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTk4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTc6ODogKCAnb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NzoxMDogJ29mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjAwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjAwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk4Ojg6ICggJygnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5ODoxMDogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTk6ODogKCAnKScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5OjEwOiAnKScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjAyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMDo4OiAoICd1cCB0bycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAwOjEwOiAndXAgdG8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXAgdG8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDE6ODogKCAnZGF5cyBpbiBwYXN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDE6MTA6ICdkYXlzIGluIHBhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF5cyBpbiBwYXN0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAyOjg6ICggJ3N0cmluZycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAyOjEwOiAnc3RyaW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0cmluZyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjA1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzo4OiAoICdjZWxsY29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzoxMDogJ2NlbGxjb2xvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjZWxsY29sb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjA1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDQ6ODogKCAnaWNvbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA0OjEwOiAnaWNvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpY29uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjA3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA1Ojg6ICggJ3RyZW5kJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDU6MTA6ICd0cmVuZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cmVuZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjA4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNjo4OiAoICdzdWJ0aXRsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA2OjEwOiAnc3VidGl0bGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3VidGl0bGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjA4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDc6ODogKCAnc3Vic3VidGl0bGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNzoxMDogJ3N1YnN1YnRpdGxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN1YnN1YnRpdGxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjEwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA4Ojg6ICggJ2xhYmVsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDg6MTA6ICdsYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsYWJlbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjExKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwOTo4OiAoICd0ZXh0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDk6MTA6ICd0ZXh0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRleHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjExIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTA6ODogKCAnYXV0b3RleHQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMDoxMDogJ2F1dG90ZXh0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImF1dG90ZXh0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExOjg6ICggJ2ltYWdlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTE6MTA6ICdpbWFnZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbWFnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMjo4OiAoICdzY2FsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEyOjEwOiAnc2NhbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2NhbGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjE0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTM6ODogKCAnQCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEzOjEwOiAnQCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjE2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNDo4OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTQ6MTA6ICcsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJywnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjE3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjE3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE1Ojg6ICggJ10nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNToxMDogJ10nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnXScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjE3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTY6ODogKCAnIycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2OjEwOiAnIycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNzo4OiAoICdbJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTc6MTA6ICdbJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ1snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjIwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE4Ojg6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxODoxMDogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxOTo4OiAoICc7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTk6MTA6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIwOjg6ICggJ2lmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjA6MTA6ICdpZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjIzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMTo4OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjE6MTA6ICdlbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI6ODogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI6MTA6ICdzd2l0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIzOjg6ICggJzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMzoxMDogJzonCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnOicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjQ6ODogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI0OjEwOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjI3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI1Ojg6ICggJ2Nhc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNToxMDogJ2Nhc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNjo4OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNjoxMDogJ2ZvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjc6ODogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNzoxMDogJ3doaWxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjMwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI4Ojg6ICggJ2RvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjg6MTA6ICdkbycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjMxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyOTo4OiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyOToxMDogJ25ldycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJuZXciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzA6ODogKCAnbnVsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMwOjEwOiAnbnVsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMxOjg6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMxOjEwOiAndHlwZW9mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjM0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjo4OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMyOjEwOiAndGhyb3cnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzM6ODogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzM6MTA6ICdyZXR1cm4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjM2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0Ojg6ICggJ3RyeScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0OjEwOiAndHJ5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyeSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNTo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzU6MTA6ICdmaW5hbGx5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjM3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzY6ODogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzY6MTA6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3Ojg6ICggJ2NhdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzc6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXRjaCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzODo4OiAoICc/JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzg6MTA6ICc/JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz8nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM5Ojg6ICggJyYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzOToxMDogJyYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDA6ODogKCAnYm9sZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQwOjEwOiAnYm9sZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJib2xkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQxOjg6ICggJ3Nob3dPbkZpcnN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDE6MTA6ICdzaG93T25GaXJzdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaG93T25GaXJzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0Mjo4OiAoICdzaG93T25MYXN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI6MTA6ICdzaG93T25MYXN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNob3dPbkxhc3QiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQ0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDM6ODogKCAnZGV0YWlsaGVhZGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDM6MTA6ICdkZXRhaWxoZWFkZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlsaGVhZGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQ2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ0Ojg6ICggJ2RldGFpbGZvb3RlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ0OjEwOiAnZGV0YWlsZm9vdGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRldGFpbGZvb3RlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0NTo4OiAoICdoaWRlbGFiZWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0NToxMDogJ2hpZGVsYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJoaWRlbGFiZWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQ3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDY6ODogKCAnZHluYW1pYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ2OjEwOiAnZHluYW1pYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkeW5hbWljIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ3Ojg6ICggJ3Jlc2l6ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ3OjEwOiAncmVzaXplJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJlc2l6ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0ODo4OiAoICc6OicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ4OjEwOiAnOjonCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiOjoiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDk6ODogKCAnPy4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0OToxMDogJz8uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj8uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUwOjg6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MDoxMDogJ3wnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnfCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTE6ODogKCAndmFyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTE6MTA6ICd2YXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmFyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjU0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjU0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUyOjg6ICggJ3RydWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MjoxMDogJ3RydWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJ1ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzIwOjEwOiAoICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMDoxMjogKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMDoxMjogKCAnMHgnIHwgJzBYJyApCisgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMV8wPT0nMCcpICkgeworICAgICAgICAgICAgICAgIGludCBMQTFfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExXzE9PSd4JykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTFfMT09J1gnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMDoxMzogJzB4JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIweCIpOyAKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjA6MTg6ICcwWCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMFgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzIwOjI0OiAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKworICAgICAgICAgICAgaW50IGNudDI9MDsKKyAgICAgICAgICAgIGxvb3AyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICAgICAgaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKXx8KExBMl8wPj0nQScgJiYgTEEyXzA8PSdGJyl8fExBMl8wPT0nXyd8fChMQTJfMD49J2EnICYmIExBMl8wPD0nZicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdGJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0nZicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyID49IDEgKSBicmVhayBsb29wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMiwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQyKys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjA6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT0nIycpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzIwOjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnIycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjA6NjM6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBM18wPT0nQid8fExBM18wPT0nYicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzXzA9PSdMJ3x8TEEzXzA9PSdsJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjA6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMDo4NDogKCAnbCcgfCAnTCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSEVYIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0lOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMjoxMDogKCAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyMjoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoUmFuZ2UoJzAnLCc5Jyk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjI6MjE6ICggJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgbG9vcDU6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTVfMD49JzAnICYmIExBNV8wPD0nOScpfHxMQTVfMD09J18nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8aW5wdXQuTEEoMSk9PSdfJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0RFQ0lNQUwiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfREVDSU1BTCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNDoxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI0OjE2OiBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNDoyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CisgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBN18wPT0nRSd8fExBN18wPT0nZScpICkgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI0OjI2OiAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0UnfHxpbnB1dC5MQSgxKT09J2UnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNDozNjogKCAnKycgfCAnLScgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE2XzA9PScrJ3x8TEE2XzA9PSctJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nKyd8fGlucHV0LkxBKDEpPT0nLScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI0OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ4PTM7CisgICAgICAgICAgICBpbnQgTEE4XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE4XzA9PSdCJ3x8TEE4XzA9PSdiJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQThfMD09J0QnfHxMQThfMD09J0YnfHxMQThfMD09J0wnfHxMQThfMD09J2QnfHxMQThfMD09J2YnfHxMQThfMD09J2wnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNDo1OTogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nSSd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0naScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNDo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdGJ3x8aW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdmJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9ERUNJTUFMIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0lEIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0lEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSUQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNjo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNjoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNjoxMTogKCAnXicgKT8KKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE5XzA9PSdeJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MjY6MTE6ICdeJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdeJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JyQnfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyNjo0NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PSckJ3x8KExBMTBfMD49JzAnICYmIExBMTBfMDw9JzknKXx8KExBMTBfMD49J0EnICYmIExBMTBfMDw9J1onKXx8TEExMF8wPT0nXyd8fChMQTEwXzA+PSdhJyAmJiBMQTEwXzA8PSd6JykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggaW5wdXQuTEEoMSk9PSckJ3x8KGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nWicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J3onKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0lEIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1NUUklORyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9TVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TVFJJTkc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyODoxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI4OjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyODoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgaW50IGFsdDE1PTI7CisgICAgICAgICAgICBpbnQgTEExNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTVfMD09J1wiJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNV8wPT0nXCcnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6MTY6ICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6MjA6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTE6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMT0zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTExXzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTExXzA+PSdcdTAwMDAnICYmIExBMTFfMDw9JyEnKXx8KExBMTFfMD49JyMnICYmIExBMTFfMDw9J1snKXx8KExBMTFfMD49J10nICYmIExBMTFfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6MjE6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6Mjg6IH4gKCAoICdcXFxcJyB8ICdcIicgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyEnKXx8KGlucHV0LkxBKDEpPj0nIycgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6NDQ6ICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTI9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTJfMD09J1wiJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6NDQ6ICdcIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDEzOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExM18wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMz0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExM18wPj0nXHUwMDAwJyAmJiBMQTEzXzA8PScmJyl8fChMQTEzXzA+PScoJyAmJiBMQTEzXzA8PSdbJyl8fChMQTEzXzA+PSddJyAmJiBMQTEzXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI4OjU1OiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaCgnXFwnKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzI4OjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nJicpfHwoaW5wdXQuTEEoMSk+PScoJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzcyODo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTRfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3Mjg6Nzk6ICdcXCcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9TVFJJTkciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfTUxfQ09NTUVOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9NTF9DT01NRU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfTUxfQ09NTUVOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzMwOjE3OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MzA6MTk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvKiIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MzA6MjQ6ICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKgorICAgICAgICAgICAgbG9vcDE2OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxNj0yOworICAgICAgICAgICAgICAgIGludCBMQTE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMTZfMD09JyonKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTZfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTZfMT09Jy8nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNl8xPj0nXHUwMDAwJyAmJiBMQTE2XzE8PScuJyl8fChMQTE2XzE+PScwJyAmJiBMQTE2XzE8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTE2XzA+PSdcdTAwMDAnICYmIExBMTZfMDw9JyknKXx8KExBMTZfMD49JysnICYmIExBMTZfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczMDo1MjogLgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBtYXRjaCgiKi8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9NTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1NMX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU0xfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczMjoxNzogKCAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MzI6MTk6ICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi8vIik7IAorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczMjoyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICBsb29wMTc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTdfMD49J1x1MDAwMCcgJiYgTEExN18wPD0nXHQnKXx8KExBMTdfMD49J1x1MDAwQicgJiYgTEExN18wPD0nXGYnKXx8KExBMTdfMD49J1x1MDAwRScgJiYgTEExN18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzMyOjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9J1x0Jyl8fChpbnB1dC5MQSgxKT49J1x1MDAwQicgJiYgaW5wdXQuTEEoMSk8PSdcZicpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEUnICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzMyOjQwOiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIGludCBhbHQxOT0yOworICAgICAgICAgICAgaW50IExBMTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE5XzA9PSdcbid8fExBMTlfMD09J1xyJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczMjo0MTogKCAnXFxyJyApPyAnXFxuJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzMyOjQxOiAoICdcXHInICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExOF8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczMjo0MTogJ1xccicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xyJyk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXG4nKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfU0xfQ09NTUVOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9XUyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9XUygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1dTOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MzQ6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczNDoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NzM0OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgaW50IGNudDIwPTA7CisgICAgICAgICAgICBsb29wMjA6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIwPTI7CisgICAgICAgICAgICAgICAgaW50IExBMjBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMjBfMD49J1x0JyAmJiBMQTIwXzA8PSdcbicpfHxMQTIwXzA9PSdccid8fExBMjBfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjA9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjApIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x0JyAmJiBpbnB1dC5MQSgxKTw9J1xuJyl8fGlucHV0LkxBKDEpPT0nXHInfHxpbnB1dC5MQSgxKT09JyAnICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyMCA+PSAxICkgYnJlYWsgbG9vcDIwOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQyMCsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9XUyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9BTllfT1RIRVIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfQU5ZX09USEVSKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc3MzY6MTY6ICggLiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NzczNjoxODogLgorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfQU5ZX09USEVSIgorCisgICAgcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBUX18xNjcgfCBUX18xNjggfCBUX18xNjkgfCBUX18xNzAgfCBUX18xNzEgfCBUX18xNzIgfCBUX18xNzMgfCBUX18xNzQgfCBUX18xNzUgfCBUX18xNzYgfCBUX18xNzcgfCBUX18xNzggfCBUX18xNzkgfCBUX18xODAgfCBUX18xODEgfCBUX18xODIgfCBUX18xODMgfCBUX18xODQgfCBUX18xODUgfCBUX18xODYgfCBUX18xODcgfCBUX18xODggfCBUX18xODkgfCBUX18xOTAgfCBUX18xOTEgfCBUX18xOTIgfCBUX18xOTMgfCBUX18xOTQgfCBUX18xOTUgfCBUX18xOTYgfCBUX18xOTcgfCBUX18xOTggfCBUX18xOTkgfCBUX18yMDAgfCBUX18yMDEgfCBUX18yMDIgfCBUX18yMDMgfCBUX18yMDQgfCBUX18yMDUgfCBUX18yMDYgfCBUX18yMDcgfCBUX18yMDggfCBUX18yMDkgfCBUX18yMTAgfCBUX18yMTEgfCBUX18yMTIgfCBUX18yMTMgfCBUX18yMTQgfCBUX18yMTUgfCBUX18yMTYgfCBUX18yMTcgfCBUX18yMTggfCBUX18yMTkgfCBUX18yMjAgfCBUX18yMjEgfCBUX18yMjIgfCBUX18yMjMgfCBUX18yMjQgfCBUX18yMjUgfCBUX18yMjYgfCBUX18yMjcgfCBUX18yMjggfCBUX18yMjkgfCBUX18yMzAgfCBUX18yMzEgfCBUX18yMzIgfCBUX18yMzMgfCBUX18yMzQgfCBUX18yMzUgfCBUX18yMzYgfCBUX18yMzcgfCBUX18yMzggfCBUX18yMzkgfCBUX18yNDAgfCBUX18yNDEgfCBUX18yNDIgfCBUX18yNDMgfCBUX18yNDQgfCBUX18yNDUgfCBUX18yNDYgfCBUX18yNDcgfCBUX18yNDggfCBUX18yNDkgfCBUX18yNTAgfCBUX18yNTEgfCBUX18yNTIgfCBUX18yNTMgfCBUX18yNTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKKyAgICAgICAgaW50IGFsdDIxPTI1MTsKKyAgICAgICAgYWx0MjEgPSBkZmEyMS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwOiBUX18xMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTY6IFRfXzE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyMjogVF9fMTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI4OiBUX18xNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MzQ6IFRfXzE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0MDogVF9fMTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ2OiBUX18xOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTI6IFRfXzIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1ODogVF9fMjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NDogVF9fMjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MDogVF9fMjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NjogVF9fMjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MjogVF9fMjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4ODogVF9fMjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NDogVF9fMjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDA6IFRfXzI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA2OiBUX18yOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExMjogVF9fMzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTg6IFRfXzMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTI0OiBUX18zMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMDogVF9fMzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzY6IFRfXzM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQyOiBUX18zNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0ODogVF9fMzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTQ6IFRfXzM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTYwOiBUX18zOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2NjogVF9fMzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNzI6IFRfXzQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTc4OiBUX180MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE4NDogVF9fNDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxOTA6IFRfXzQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTk2OiBUX180NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIwMjogVF9fNDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyMDg6IFRfXzQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MjE0OiBUX180NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIyMDogVF9fNDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyMjY6IFRfXzQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MjMyOiBUX181MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIzODogVF9fNTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyNDQ6IFRfXzUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MjUwOiBUX181MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI1NjogVF9fNTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyNjI6IFRfXzU1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MjY4OiBUX181NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI3NDogVF9fNTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyODA6IFRfXzU4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Mjg2OiBUX181OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI5MjogVF9fNjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyOTg6IFRfXzYxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MzA0OiBUX182MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMxMDogVF9fNjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTozMTY6IFRfXzY0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MzIyOiBUX182NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMyODogVF9fNjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTozMzQ6IFRfXzY3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MzQwOiBUX182OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM0NjogVF9fNjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTozNTI6IFRfXzcwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MzU4OiBUX183MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM2NDogVF9fNzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTozNzA6IFRfXzczCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Mzc2OiBUX183NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM4MjogVF9fNzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTozODg6IFRfXzc2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Mzk0OiBUX183NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQwMDogVF9fNzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0MDY6IFRfXzc5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDEyOiBUX184MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQxODogVF9fODEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0MjQ6IFRfXzgyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDMwOiBUX184MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQzNjogVF9fODQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0NDI6IFRfXzg1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDQ4OiBUX184NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ1NDogVF9fODcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0NjA6IFRfXzg4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDY2OiBUX184OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ3MjogVF9fOTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0Nzg6IFRfXzkxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDg0OiBUX185MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ5MDogVF9fOTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0OTY6IFRfXzk0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTAyOiBUX185NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUwODogVF9fOTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1MTQ6IFRfXzk3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTIwOiBUX185OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUyNjogVF9fOTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1MzI6IFRfXzEwMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1Mzk6IFRfXzEwMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1NDY6IFRfXzEwMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1NTM6IFRfXzEwMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1NjA6IFRfXzEwNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1Njc6IFRfXzEwNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1NzQ6IFRfXzEwNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1ODE6IFRfXzEwNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1ODg6IFRfXzEwOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1OTU6IFRfXzEwOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MDI6IFRfXzExMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MDk6IFRfXzExMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTExKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NjE2OiBUX18xMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjYyMzogVF9fMTEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MzA6IFRfXzExNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NjM3OiBUX18xMTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjY0NDogVF9fMTE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NTE6IFRfXzExNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NjU4OiBUX18xMTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjY2NTogVF9fMTE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NzI6IFRfXzEyMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Njc5OiBUX18xMjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjY4NjogVF9fMTIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2OTM6IFRfXzEyMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NzAwOiBUX18xMjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjcwNzogVF9fMTI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MTQ6IFRfXzEyNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NzIxOiBUX18xMjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjcyODogVF9fMTI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MzU6IFRfXzEyOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NzQyOiBUX18xMzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjc0OTogVF9fMTMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NTY6IFRfXzEzMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NzYzOiBUX18xMzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjc3MDogVF9fMTM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3Nzc6IFRfXzEzNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Nzg0OiBUX18xMzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjc5MTogVF9fMTM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3OTg6IFRfXzEzOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODA1OiBUX18xMzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjgxMjogVF9fMTQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MTk6IFRfXzE0MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODI2OiBUX18xNDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjgzMzogVF9fMTQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NDA6IFRfXzE0NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODQ3OiBUX18xNDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTM0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjg1NDogVF9fMTQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NjE6IFRfXzE0NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODY4OiBUX18xNDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTM3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjg3NTogVF9fMTQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4ODI6IFRfXzE1MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODg5OiBUX18xNTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjg5NjogVF9fMTUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MDM6IFRfXzE1MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6OTEwOiBUX18xNTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjkxNzogVF9fMTU1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MjQ6IFRfXzE1NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6OTMxOiBUX18xNTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjkzODogVF9fMTU4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NDU6IFRfXzE1OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6OTUyOiBUX18xNjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjk1OTogVF9fMTYxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NjY6IFRfXzE2MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6OTczOiBUX18xNjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjk4MDogVF9fMTY0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5ODc6IFRfXzE2NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6OTk0OiBUX18xNjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwMDE6IFRfXzE2NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTAwODogVF9fMTY4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDE1OiBUX18xNjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwMjI6IFRfXzE3MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTcwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTAyOTogVF9fMTcxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDM2OiBUX18xNzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwNDM6IFRfXzE3MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTczKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA1MDogVF9fMTc0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDU3OiBUX18xNzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwNjQ6IFRfXzE3NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTc2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA3MTogVF9fMTc3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDc4OiBUX18xNzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwODU6IFRfXzE3OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTc5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA5MjogVF9fMTgwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDk5OiBUX18xODEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExMDY6IFRfXzE4MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTgyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTExMzogVF9fMTgzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTIwOiBUX18xODQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTczIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExMjc6IFRfXzE4NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTg1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTEzNDogVF9fMTg2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTQxOiBUX18xODcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExNDg6IFRfXzE4OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTg4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE1NTogVF9fMTg5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTYyOiBUX18xOTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExNjk6IFRfXzE5MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTkxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE3NjogVF9fMTkyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTgzOiBUX18xOTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExOTA6IFRfXzE5NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTk0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE5NzogVF9fMTk1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjA0OiBUX18xOTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyMTE6IFRfXzE5NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTk3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTIxODogVF9fMTk4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjI1OiBUX18xOTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyMzI6IFRfXzIwMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTIzOTogVF9fMjAxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjQ2OiBUX18yMDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyNTM6IFRfXzIwMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTI2MDogVF9fMjA0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjY3OiBUX18yMDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyNzQ6IFRfXzIwNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjA2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTI4MTogVF9fMjA3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjg4OiBUX18yMDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyOTU6IFRfXzIwOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjA5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTMwMjogVF9fMjEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzA5OiBUX18yMTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMTY6IFRfXzIxMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjEyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTMyMzogVF9fMjEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzMwOiBUX18yMTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMzc6IFRfXzIxNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM0NDogVF9fMjE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzUxOiBUX18yMTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzNTg6IFRfXzIxOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM2NTogVF9fMjE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzcyOiBUX18yMjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzNzk6IFRfXzIyMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM4NjogVF9fMjIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzkzOiBUX18yMjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0MDA6IFRfXzIyNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQwNzogVF9fMjI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDE0OiBUX18yMjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0MjE6IFRfXzIyNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjI3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQyODogVF9fMjI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDM1OiBUX18yMjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0NDI6IFRfXzIzMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ0OTogVF9fMjMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDU2OiBUX18yMzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0NjM6IFRfXzIzMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ3MDogVF9fMjM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDc3OiBUX18yMzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0ODQ6IFRfXzIzNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjM2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ5MTogVF9fMjM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDk4OiBUX18yMzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1MDU6IFRfXzIzOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjM5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTUxMjogVF9fMjQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTE5OiBUX18yNDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1MjY6IFRfXzI0MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTUzMzogVF9fMjQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTQwOiBUX18yNDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1NDc6IFRfXzI0NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQ1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU1NDogVF9fMjQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTYxOiBUX18yNDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1Njg6IFRfXzI0OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQ4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU3NTogVF9fMjQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTgyOiBUX18yNTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1ODk6IFRfXzI1MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU5NjogVF9fMjUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjAzOiBUX18yNTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2MTA6IFRfXzI1NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjU0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTYxNzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTYyNjogUlVMRV9JTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTYzNTogUlVMRV9ERUNJTUFMCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0RFQ0lNQUwoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjQ4OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTY1NjogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTY2ODogUlVMRV9NTF9DT01NRU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX01MX0NPTU1FTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjg0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE3MDA6IFJVTEVfV1MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfV1MoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNzA4OiBSVUxFX0FOWV9PVEhFUgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9BTllfT1RIRVIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgREZBMjEgZGZhMjEgPSBuZXcgREZBMjEodGhpcyk7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb3RTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcNjdcMVw3MVwxXDczXDNcMTAyXDFcMTIyXDFcMTI2XDFcMTMxXDFcMTM1XDFcMTM3XDFcMTQxIisKKyAgICAgICAgIlwxXDE0M1wxXDE0NVwxXDE0N1wxXDE1MlwyMFwxMDJcMTJcdWZmZmZcMVx1MDBjMVwxXDEwMlwyXHUwMGM1XDEiKworICAgICAgICAiXDY0XDVcdWZmZmZcMVx1MDBjYVw2XHVmZmZmXDJcMTAyXDFcdTAwZDBcM1wxMDJcMVx1ZmZmZlwxXDEwMlwxIisKKyAgICAgICAgIlx1MDBkOVw0XDEwMlwxXHUwMGU0XDFcdTAwZTVcMVx1MDBlNlwxXDEwMlwxXHUwMGU4XDJcMTAyXDIwXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMGVjXDVcdWZmZmZcMVx1MDBlZVw0XHVmZmZmXDFcMTAyXDFcdTAwZjJcMVx1MDBmNFwyMFwxMDJcMSIrCisgICAgICAgICJcdTAxMGRcNFwxMDJcMVx1MDExN1w0XDEwMlwxXHUwMTFkXDFcdTAxMWVcMVx1MDExZlwxMVwxMDJcMVx1MDEyYyIrCisgICAgICAgICJcMTRcMTAyXDFcdTAxM2RcMTRcMTAyXDFcdTAxNTVcN1wxMDJcMTRcdWZmZmZcMVwxMDJcMVx1ZmZmZlwxXHUwMGM1IisKKyAgICAgICAgIlw2XHVmZmZmXDVcMTAyXDFcdWZmZmZcMTBcMTAyXDFcdWZmZmZcMTBcMTAyXDFcdTAxN2RcMVwxMDJcM1x1ZmZmZiIrCisgICAgICAgICJcMVwxMDJcMVx1ZmZmZlwyXDEwMlw0XHVmZmZmXDFcdTAxODJcMVx1MDE4M1wxXDEwMlwxXHVmZmZmXDFcMTAyIisKKyAgICAgICAgIlwxXHVmZmZmXDVcMTAyXDFcdTAxOGNcMjJcMTAyXDFcdWZmZmZcNlwxMDJcMVx1MDFhOFwyXDEwMlwxXHVmZmZmIisKKyAgICAgICAgIlw1XDEwMlwzXHVmZmZmXDJcMTAyXDFcdTAxYjJcNVwxMDJcMVx1ZmZmZlwxXDEwMlwxXHUwMWJiXDFcMTAyXDIiKworICAgICAgICAiXHVmZmZmXDEyXDEwMlwxXHUwMWM3XDNcMTAyXDJcdWZmZmZcMTBcMTAyXDFcdTAxZDNcMTVcMTAyXDJcdWZmZmYiKworICAgICAgICAiXDdcMTAyXDFcdTAxZTlcMTdcMTAyXDFcdTAxZmFcMVx1MDFmYlwxXHUwMWZjXDZcMTAyXDFcdTAyMDRcNlwxMDIiKworICAgICAgICAiXDFcdWZmZmZcNFwxMDJcMlx1ZmZmZlwyXDEwMlwxXHUwMjEyXDVcMTAyXDFcdWZmZmZcMTBcMTAyXDFcdTAyMjEiKworICAgICAgICAiXDVcMTAyXDFcdTAyMjdcNFwxMDJcMVx1MDIyY1wzXDEwMlwxXHUwMjMwXDNcMTAyXDFcdWZmZmZcMVx1MDIzNSIrCisgICAgICAgICJcMTBcMTAyXDFcdWZmZmZcM1wxMDJcMVx1MDI0MlwxXDEwMlwyXHVmZmZmXDFcMTAyXDFcdWZmZmZcMVx1MDI0NiIrCisgICAgICAgICJcM1wxMDJcMVx1MDI0YlwzXDEwMlwxXHUwMjRmXDFcMTAyXDFcdTAyNTFcMVx1ZmZmZlwxM1wxMDJcMVx1ZmZmZiIrCisgICAgICAgICJcNFwxMDJcMVx1MDI2MVwxXHUwMjYyXDNcMTAyXDFcdWZmZmZcM1wxMDJcMVx1MDI2OVw0XDEwMlwxXHUwMjZmIisKKyAgICAgICAgIlwyXDEwMlwxXHVmZmZmXDFcdTAyNzJcMVx1MDI3NVwxXDEwMlwxXHUwMjc3XDdcMTAyXDFcdTAyN2ZcMVx1MDI4MSIrCisgICAgICAgICJcM1wxMDJcM1x1ZmZmZlwxXHUwMjg1XDVcMTAyXDJcdWZmZmZcMVwxMDJcMVx1ZmZmZlwxMlwxMDJcMVx1MDI5NyIrCisgICAgICAgICJcMVx1ZmZmZlwyXDEwMlwxXHUwMjliXDFcMTAyXDFcdTAyOWRcMlwxMDJcMVx1ZmZmZlwxXHUwMmEwXDFcMTAyIisKKyAgICAgICAgIlwxXHUwMmEzXDFcMTAyXDFcdTAyYTVcMlx1ZmZmZlw0XDEwMlwxXHUwMmFhXDFcdWZmZmZcMVx1MDJhYlwzXDEwMiIrCisgICAgICAgICJcMVx1ZmZmZlwxXHUwMmFmXDFcMTAyXDFcdTAyYjFcMVx1ZmZmZlwxXDEwMlwxXHVmZmZmXDFcMTAyXDFcdTAyYjQiKworICAgICAgICAiXDFcdWZmZmZcNVwxMDJcMVx1MDJiYlwyXDEwMlwxXHVmZmZmXDNcMTAyXDFcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxMDJcMVx1ZmZmZlwyXDEwMlwxXHUwMmNhXDFcMTAyXDFcdWZmZmZcM1wxMDJcMVx1ZmZmZlwxXDEwMlwxIisKKyAgICAgICAgIlx1ZmZmZlwzXDEwMlwxXHUwMmQ0XDFcMTAyXDFcdTAyZDZcNlwxMDJcMVx1ZmZmZlwxXDEwMlwxXHUwMmRlXDIiKworICAgICAgICAiXHVmZmZmXDZcMTAyXDFcdWZmZmZcNVwxMDJcMVx1ZmZmZlwxXDEwMlwxXHUwMmViXDFcdWZmZmZcMlwxMDJcMSIrCisgICAgICAgICJcdWZmZmZcMVwxMDJcMVx1ZmZmZlwxXHUwMmVmXDFcdTAyZjBcMVx1MDJmMVwxXHUwMmYyXDFcdTAyZjNcMVwxMDIiKworICAgICAgICAiXDFcdTAyZjVcMVx1ZmZmZlwxXHUwMmY2XDFcdWZmZmZcMVwxMDJcMVx1MDJmOFwxXDEwMlwxXHVmZmZmXDFcdTAyZmEiKworICAgICAgICAiXDFcdTAyZmJcMVx1MDJmY1wxXHUwMmZkXDNcMTAyXDFcdTAzMDRcMTFcMTAyXDFcdWZmZmZcMVx1MDMwZVwxIisKKyAgICAgICAgIlwxMDJcMVx1MDMxMFwxXHVmZmZmXDFcdTAzMTFcMVx1ZmZmZlwyXDEwMlwxXHVmZmZmXDFcMTAyXDJcdWZmZmYiKworICAgICAgICAiXDFcMTAyXDFcdWZmZmZcMVx1MDMxNlwyXDEwMlwxXHUwMzFhXDJcdWZmZmZcMlwxMDJcMVx1MDMxZFwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMzFlXDFcdWZmZmZcMlwxMDJcMVx1ZmZmZlwxXHUwMzIxXDRcMTAyXDFcdTAzMjZcMVx1ZmZmZlwyXDEwMiIrCisgICAgICAgICJcMlx1ZmZmZlw0XDEwMlwzXHVmZmZmXDNcMTAyXDFcdWZmZmZcM1wxMDJcMVx1MDMzNFwxXHUwMzM1XDFcMTAyIisKKyAgICAgICAgIlwxXHUwMzM3XDJcMTAyXDFcdWZmZmZcMVx1MDMzYVwxXHVmZmZmXDFcMTAyXDFcdTAzM2NcMVwxMDJcMVx1MDMzZSIrCisgICAgICAgICJcMVx1MDMzZlwxXDEwMlwxXHUwMzQxXDFcdWZmZmZcMVx1MDM0MlwxXHUwMzQzXDRcMTAyXDFcdWZmZmZcM1wxMDIiKworICAgICAgICAiXDFcdTAzNGNcMVwxMDJcMVx1ZmZmZlwzXDEwMlw1XHVmZmZmXDFcMTAyXDJcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxMDJcNFx1ZmZmZlwxXHUwMzU0XDJcMTAyXDFcdTAzNTdcMlwxMDJcMVx1ZmZmZlwxXHUwMzVhXDFcdTAzNWIiKworICAgICAgICAiXDFcMTAyXDFcdTAzNWRcMlwxMDJcMVx1MDM2MFwyXDEwMlwxXHVmZmZmXDFcMTAyXDJcdWZmZmZcM1wxMDJcMSIrCisgICAgICAgICJcdTAzNjdcMVx1ZmZmZlwzXDEwMlwxXHVmZmZmXDJcMTAyXDJcdWZmZmZcMVx1MDM2ZFwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDEwMlwxXHUwMzcwXDFcdTAzNzFcMlx1ZmZmZlwxXDEwMlwxXHUwMzc3XDFcdWZmZmZcMVwxMDJcMVx1MDM3YSIrCisgICAgICAgICJcNFwxMDJcMVx1ZmZmZlwyXDEwMlwxXHUwMzgxXDJcdWZmZmZcMVx1MDM4MlwxXHVmZmZmXDJcMTAyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTAyXDFcdWZmZmZcMVwxMDJcMlx1ZmZmZlwxXDEwMlwzXHVmZmZmXDNcMTAyXDJcdWZmZmZcMVwxMDJcMSIrCisgICAgICAgICJcdTAzOTFcMVx1MDM5MlwxXHVmZmZmXDRcMTAyXDFcdTAzOTdcMlwxMDJcMVx1ZmZmZlwxXHUwMzlhXDFcMTAyIisKKyAgICAgICAgIlwxXHVmZmZmXDJcMTAyXDJcdWZmZmZcMVwxMDJcMVx1ZmZmZlwxXDEwMlwxXHUwM2EwXDFcdWZmZmZcM1wxMDIiKworICAgICAgICAiXDFcdTAzYTRcMlwxMDJcMVx1ZmZmZlw1XDEwMlwxXHVmZmZmXDJcMTAyXDZcdWZmZmZcMVx1MDNhZVwyXHVmZmZmIisKKyAgICAgICAgIlwxXDEwMlwyXHVmZmZmXDFcdTAzYjVcM1wxMDJcMVx1MDNiOVwyXHVmZmZmXDJcMTAyXDFcdWZmZmZcMVwxMDIiKworICAgICAgICAiXDFcdWZmZmZcM1wxMDJcNVx1ZmZmZlwxXDEwMlwyXHVmZmZmXDNcMTAyXDFcdTAzYzdcMVx1ZmZmZlwxXDEwMiIrCisgICAgICAgICJcMVx1MDNjOVwxXHVmZmZmXDNcMTAyXDFcdTAzY2RcMVx1MDNjZVwxXHVmZmZmXDFcdTAzY2ZcMlwxMDJcMVx1ZmZmZiIrCisgICAgICAgICJcNlwxMDJcMVx1MDNkOFwxXHUwM2RhXDFcdTAzZGJcMlx1ZmZmZlwxXDEwMlw1XHVmZmZmXDFcMTAyXDFcdTAzZGYiKworICAgICAgICAiXDFcMTAyXDFcdWZmZmZcMlwxMDJcMlx1ZmZmZlwxXHUwM2UzXDFcdTAzZTRcMlwxMDJcMVx1ZmZmZlwxXHUwM2U4IisKKyAgICAgICAgIlwxXDEwMlwxXHUwM2VhXDFcdTAzZWJcMVx1ZmZmZlwxXHUwM2VjXDJcdWZmZmZcMlwxMDJcM1x1ZmZmZlwxXDEwMiIrCisgICAgICAgICJcMVx1MDNmMFwxXDEwMlwxXHUwM2YyXDJcMTAyXDFcdTAzZjVcMVx1MDNmNlwxXHVmZmZmXDFcdTAzZjdcM1x1ZmZmZiIrCisgICAgICAgICJcMlwxMDJcMVx1ZmZmZlwxXHUwM2ZiXDJcMTAyXDJcdWZmZmZcMlwxMDJcMVx1MDQwMVwxXHVmZmZmXDFcdTA0MDIiKworICAgICAgICAiXDNcdWZmZmZcM1wxMDJcMVx1ZmZmZlwxXHUwNDA2XDFcdWZmZmZcMVwxMDJcMVx1MDQwOFwzXHVmZmZmXDFcdTA0MGEiKworICAgICAgICAiXDFcMTAyXDFcdTA0MGNcMVx1ZmZmZlwxXHUwNDBkXDFcdTA0MGVcMlwxMDJcM1x1ZmZmZlwxXHUwNDExXDFcdTA0MTIiKworICAgICAgICAiXDFcMTAyXDFcdWZmZmZcMVx1MDQxNFwzXHVmZmZmXDFcdTA0MTVcM1x1ZmZmZlwxXDEwMlwxXHUwNDE3XDJcdWZmZmYiKworICAgICAgICAiXDFcMTAyXDJcdWZmZmZcMVwxMDJcMVx1ZmZmZlwxXHUwNDFhXDFcMTAyXDFcdWZmZmZcMVx1MDQxY1wxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvZlMgPQorICAgICAgICAiXHUwNDFkXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21pblMgPQorICAgICAgICAiXDFcMFwxXDc1XDFcMTc0XDFcNDZcMlwxNDFcMVw2M1wxXDUzXDFcNTVcMlw1MlwzXDc1XDFcNzZcMlw1NlwxIisKKyAgICAgICAgIlwxNDFcMVwxNTRcMVwxNDFcMVwxNDNcM1wxNDFcMVwxNTFcMVwxNDFcMVwxNDVcMVwxNDJcM1wxNDVcMlwxNDEiKworICAgICAgICAiXDEyXHVmZmZmXDFcNzJcMVwxNTBcMlw2MFwxXDQ0XDVcdWZmZmZcMVw3NVw2XHVmZmZmXDFcMTYyXDFcMTU0IisKKyAgICAgICAgIlwxXDQ0XDFcMTU0XDFcMTUxXDFcMTYzXDFcdWZmZmZcMVwxNjZcMVw0NFwxXDE2MlwxXDE0NlwxXDE1NlwxXDE1NCIrCisgICAgICAgICJcM1w0NFwxXDE0NVwxXDQ0XDFcMTQ3XDFcMTY0XDIwXHVmZmZmXDFcNzVcNVx1ZmZmZlwxXDc0XDRcdWZmZmYiKworICAgICAgICAiXDFcMTU0XDJcNDRcMVwxNjNcMVwxNDFcMVwxNDJcMVwxNTZcMVwxNjJcMVwxNDFcMVwxNTdcMVwxNTRcMVwxNzIiKworICAgICAgICAiXDFcMTUxXDFcMTU2XDFcMTU3XDFcMTQxXDFcMTQzXDFcMTQxXDFcMTU3XDFcNDRcMlwxNTRcMVwxNTdcMVwxNTYiKworICAgICAgICAiXDFcNDRcMlwxNTZcMVwxNjJcMVwxNDRcM1w0NFwyXDE2MlwxXDE0NlwxXDE0M1wxXDE1N1wxXDU1XDFcMTQ2IisKKyAgICAgICAgIlwxXDE1NFwxXDE1NVwxXDQ0XDFcNDBcMVwxNDJcMVwxNDZcMVwxNDdcMVwxNTdcMVwxNTZcMVwxNTRcMVwxNjciKworICAgICAgICAiXDFcMTU0XDFcMTY0XDFcMTUxXDFcNTVcMVw0NFwxXDE0NFwyXDE1NlwxXDE2N1wxXDE1NlwxXDE1N1wxXDE1MSIrCisgICAgICAgICJcMVwxNTVcMVwxNDFcMVwxNDRcMVwxNDNcMVwxNTRcMVw0NFwxXDE1N1wxXDE2MFwxXDE0MVwyXDE1NVwxXDE0MiIrCisgICAgICAgICJcMVwxNjJcMTRcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDYwXDZcdWZmZmZcMVwxNjRcMVwxNjJcMVwxNDNcMVwxNTYiKworICAgICAgICAiXDFcMTU3XDFcdWZmZmZcMVwxNjRcMVwxNTRcMVwxNjBcMVwxNDVcMVwxNDNcMVwxNTFcMVwxNjRcMVwxNDJcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNTBcMVwxNTNcMVwxNDFcMVwxNjNcMVwxNDNcM1wxNDFcMVw0NFwxXDE0NVwzXHVmZmZmXDEiKworICAgICAgICAiXDE2MlwxXHVmZmZmXDFcMTYyXDFcMTU3XDRcdWZmZmZcMlw0NFwxXDE0NVwxXHVmZmZmXDFcMTQ1XDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDFcMTQ3XDFcMTU0XDFcMTUxXDFcMTQ1XDFcNDRcMlwxNjNcMVwxNTFcMVwxNDVcMVwxNTRcMVwxNjAiKworICAgICAgICAiXDFcMTUxXDFcMTQ1XDFcMTY0XDFcMTQzXDFcMTY3XDFcMTU3XDFcMTQ3XDFcMTUwXDJcMTQ1XDFcMTU0XDFcMTU2IisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTYzXDFcMTUxXDJcMTQ1XDFcMTQxXDFcMTU1XDFcNDRcMlwxNjRcMVx1ZmZmZlwxXDE1NyIrCisgICAgICAgICJcMlwxNTFcMVwxNDdcMVwxNTFcM1x1ZmZmZlwxXDE2NFwxXDE0M1wxXDQ0XDFcMTQ1XDFcMTUzXDFcMTQ0XDEiKworICAgICAgICAiXDE1MFwxXDE2MFwxXDE1NFwxXDE1N1wxXDQ0XDFcMTU3XDJcdWZmZmZcMVwxNDRcMVwxNTdcMVwxNDVcMVwxNjQiKworICAgICAgICAiXDFcMTUwXDFcMTUzXDFcMTU1XDFcMTQ1XDFcMTQyXDFcMTU0XDFcNDRcMVwxNTFcMVwxNjNcMVwxNDVcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxNTBcMVwxNTFcMVwxNDdcMVwxNTZcMVwxNTdcMVwxNDRcMVwxNjVcMVwxNTFcMVw0NFwxXDE0NVwxXDE0NCIrCisgICAgICAgICJcMVwxNTdcMVwxNDRcMVwxNTRcMVwxNDRcMVwxNDdcMVwxNDVcMVw1NVwxXDE1M1wxXDE2NFwyXDE0NFwyXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MVwxXDE1NVwxXDE0MVwxXDE1NFwxXDE0NVwyXDE1NlwxXDQ0XDFcMTQ1XDFcMTY0XDFcMTYwXDFcMTQ1IisKKyAgICAgICAgIlwyXDE1NFwxXDE1N1wxXDE1NFwxXDE1N1wxXDE0NVwxXDE0MVwxXDE2NFwxXDE2MlwxXDE1NVwxXDE0NVwzXDQ0IisKKyAgICAgICAgIlwxXDE1MFwxXDE0NFwxXDE0NVwxXDE1NFwyXDE0NVwxXDQ0XDFcMTU1XDFcNDBcMVwxNjJcMVwxNTFcMVwxNjUiKworICAgICAgICAiXDFcMTU1XDFcdWZmZmZcMVwxNjJcMVwxNDFcMVwxNDVcMVwxNjRcMlx1ZmZmZlwxXDE1NlwxXDE0NFwxXDQ0IisKKyAgICAgICAgIlwxXDE1MVwxXDE1NlwxXDE0NVwxXDE1NlwxXDE2MlwxXHVmZmZmXDFcMTUxXDFcMTY1XDFcNTVcMVwxNDZcMSIrCisgICAgICAgICJcMTU2XDFcMTQ1XDFcMTUxXDFcMTQ0XDFcNDRcMVwxNDNcMVwxNTBcMVwxMTdcMVwxNjJcMVwxNDVcMVw0NFwxIisKKyAgICAgICAgIlwxNjRcMVwxNDFcMVwxNjJcMVwxNTFcMVw0NFwxXDE0NVwxXDE1NFwxXDE0NFwxXDQ0XDFcMTU0XDFcNDBcMSIrCisgICAgICAgICJcMTQxXDFcdWZmZmZcMVw0NFwxXDE0NVwxXDE2M1wyXDE1NVwxXDE1MVwxXDE0MVwxXDE2MlwxXDE0NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDU1XDFcMTQxXDFcMTUxXDFcNDRcMlwxNDVcMVx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcNDRcMVwxNjNcMSIrCisgICAgICAgICJcMTY1XDFcMTU0XDFcNDRcMVwxNjRcMVwxNjVcMVwxNDFcMVw0NFwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNjEiKworICAgICAgICAiXDFcMTQ1XDFcMTU2XDFcMTY0XDFcMTU2XDFcMTQ1XDFcMTUxXDFcMTYyXDFcMTQ1XDFcMTYyXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTYyXDFcNTVcMVwxNjZcMVwxNjBcMlw0NFwxXDE0NVwxXDE1MFwxXDE1NFwxXHVmZmZmXDFcMTQ3XDFcMTU3IisKKyAgICAgICAgIlwxXDE0NVwxXDQ0XDFcMTU0XDFcMTQxXDFcMTYyXDFcMTQyXDFcNDRcMVwxNjNcMVwxNDRcMVx1ZmZmZlwyXDQ0IisKKyAgICAgICAgIlwxXDE1NFwxXDQ0XDJcMTQ1XDFcMTY3XDFcMTQ1XDFcMTU1XDFcMTU2XDFcMTY0XDJcNDRcMVwxNTZcMVwxNjIiKworICAgICAgICAiXDFcMTU3XDNcdWZmZmZcMVw0NFwxXDE0NVwxXDE0NFwxXDE0NVwxXDE0NFwxXDE1NlwyXHVmZmZmXDFcMTQxIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTUxXDJcMTU0XDFcMTUxXDFcMTU2XDJcMTQ3XDFcMTQ1XDFcMTQ0XDFcMTU2XDFcNDRcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNDNcMVwxNDFcMVw0NFwxXDE0N1wxXDQ0XDFcMTY0XDFcMTQyXDFcdWZmZmZcMVw0NFwxXDE2NCIrCisgICAgICAgICJcMVw0NFwxXDE1NlwxXDQ0XDJcdWZmZmZcMVwxNTBcMVwxNjJcMVwxNTZcMVwxNjRcMVw0NFwxXHVmZmZmXDEiKworICAgICAgICAiXDQ0XDFcMTU2XDFcMTY2XDFcMTQzXDFcdWZmZmZcMVw0NFwxXDE3MVwxXDQ0XDFcdWZmZmZcMVwxNTRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjRcMVw0NFwxXHVmZmZmXDFcMTYyXDFcMTYwXDJcMTY1XDFcMTU2XDFcNDRcMVwxNDFcMlwxNTZcMVwxNDUiKworICAgICAgICAiXDFcMTQ3XDFcMTU2XDFcdWZmZmZcMVwxNjJcMVwxNDRcMVwxNTVcMVx1ZmZmZlwxXDE0M1wxXDE2NFwxXDQ0IisKKyAgICAgICAgIlwxXDE0MVwxXHVmZmZmXDFcMTQ1XDFcMTYwXDFcMTU0XDFcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2NVwyXDE2NCIrCisgICAgICAgICJcMVw0NFwxXDE0N1wxXDQ0XDFcMTU2XDFcMTY0XDFcMTYyXDFcMTU2XDFcMTQ1XDFcMTQxXDFcdWZmZmZcMVwxNDUiKworICAgICAgICAiXDFcNDRcMlx1ZmZmZlwxXDE2MlwxXDE2NFwxXDE0MVwxXDE2MlwxXDE1NVwxXDE2MlwxXHVmZmZmXDFcNTVcMSIrCisgICAgICAgICJcMTYyXDFcMTQ0XDFcMTQxXDFcMTQ2XDFcdWZmZmZcMVwxNDZcMVw0NFwxXHVmZmZmXDFcMTU3XDFcMTU0XDEiKworICAgICAgICAiXHVmZmZmXDFcMTQxXDFcdWZmZmZcNVw0NFwxXDE0M1wxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTYzIisKKyAgICAgICAgIlwxXDQ0XDFcMTU0XDFcdWZmZmZcNFw0NFwxXDE2M1wxXDE2MlwxXDE0MlwxXDQ0XDFcMTY0XDFcMTQzXDFcMTQxIisKKyAgICAgICAgIlwxXDE0NVwxXDE0MVwxXDE3MFwxXDE2M1wxXDE1MVwxXDE0MVwxXHVmZmZmXDFcNDRcMVwxNjRcMVw0NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDE1MVwyXHVmZmZmXDFcMTQ3XDFcdWZmZmZcMSIrCisgICAgICAgICJcNDRcMVwxNTdcMVwxMDZcMVw0NFwyXHVmZmZmXDFcMTQzXDFcMTQxXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTcxXDFcMTY0XDFcdWZmZmZcMVw0NFwxXDE0MVwyXDE1NVwxXDU1XDFcNDRcMVx1ZmZmZlwxXDE1MVwxIisKKyAgICAgICAgIlwxNjRcMVwxNjVcMVx1ZmZmZlwxXDE1NVwxXDE0NVwxXDE0N1wxXDE2NFwzXHVmZmZmXDJcMTQxXDFcNTVcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNjJcMVwxNTZcMVwxNjNcMlw0NFwxXDE0NVwxXDQ0XDJcMTQxXDFcdWZmZmZcMVw0NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0N1wxXDQ0XDFcMTUxXDJcNDRcMVwxNTRcMVw0NFwxXHVmZmZmXDJcNDRcMVwxNDJcMVwxNTdcMVwxNTUiKworICAgICAgICAiXDFcNTVcMVwxNjBcMVwxNDdcMVwxNjNcMVwxNjJcMVw0NFwxXDE1N1wxXHVmZmZmXDFcMTU0XDFcMTUxXDFcMTY0IisKKyAgICAgICAgIlw1XHVmZmZmXDFcMTcxXDJcdWZmZmZcMVwxNjBcMVx1ZmZmZlwxXDE1N1w0XHVmZmZmXDFcNDRcMVwxNjRcMSIrCisgICAgICAgICJcMTQ1XDFcNDRcMVwxNDVcMVwxNTdcMVx1ZmZmZlwyXDQ0XDFcMTY0XDFcNDRcMlwxNjRcMVw0NFwxXDE1N1wxIisKKyAgICAgICAgIlwxNTRcMVx1ZmZmZlwxXDE1MVwyXHVmZmZmXDFcMTQ1XDFcMTUxXDFcMTQ2XDFcNDRcMVx1ZmZmZlwxXDE1NiIrCisgICAgICAgICJcMVwxNTFcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDE1NFwyXHVmZmZmXDFcNDRcMVwxNDVcMVx1ZmZmZlwxXDE0MyIrCisgICAgICAgICJcMlw0NFwxXDE0MlwxXHVmZmZmXDFcMTY0XDFcNDRcMVwxNTVcMVwxNjBcMVw0NFwxXDU1XDFcMTcxXDFcMTY0IisKKyAgICAgICAgIlwxXDE2MFwxXHVmZmZmXDFcMTQ3XDFcMTYzXDFcNDRcMlx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNjRcMVwxNjIiKworICAgICAgICAiXDFcdWZmZmZcMVw1NVwxXHVmZmZmXDFcMTU2XDJcdWZmZmZcMVw1NVwzXHVmZmZmXDFcMTQ1XDFcMTY1XDFcMTQxIisKKyAgICAgICAgIlwxXDE0MlwxXDE0MVwxXDE1MVwyXDQ0XDFcdWZmZmZcMVwxNjJcMVwxNTdcMVwxNDdcMVwxNDVcMVw0NFwxXDE0MSIrCisgICAgICAgICJcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTQ0XDFcdWZmZmZcMVwxNDFcMVwxNTdcMlx1ZmZmZlwxXDE0NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNTZcMVwxMDNcMVwxNTZcMVw0NFwxXDE2NFwxXDE1MVwxXHVmZmZmXDEiKworICAgICAgICAiXDE1MVwxXDE2MlwxXDE2M1wxXDE1N1wxXDE2M1wxXHVmZmZmXDFcMTYyXDFcMTQ1XDZcdWZmZmZcMVw0NFwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE0MlwxXDE1NFwxXHVmZmZmXDFcMTQyXDFcNDRcMVwxNjRcMVwxNDVcMVwxNTFcMVw0NFwyXHVmZmZmIisKKyAgICAgICAgIlwxXDE1MVwxXDE0N1wxXDE0M1wxXDE0N1wxXHVmZmZmXDFcMTU0XDFcMTU2XDFcMTYyXDRcdWZmZmZcMVwxNDciKworICAgICAgICAiXDFcMTU2XDJcdWZmZmZcMVwxNTVcMVwxNjJcMVwxNTZcMVw0NFwxXHVmZmZmXDFcMTU2XDFcNDRcMVx1ZmZmZiIrCisgICAgICAgICJcMVw0MFwxXDE0NFwxXDE2NFwyXDQ0XDFcdWZmZmZcMVw0NFwxXDE2M1wxXDE0N1wxXHVmZmZmXDFcMTU0XDEiKworICAgICAgICAiXDE0M1wxXDE3MlwxXDE2M1wxXDE2NFwxXDE0NlwzXDQ0XDFcdWZmZmZcMVwxNDVcMVwxNDFcNVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNDVcMVw0NFwxXDE1NlwxXHVmZmZmXDFcMTU3XDFcMTUxXDJcdWZmZmZcMlw0NFwxXDE0NFwxXDE0N1wxXDE0NSIrCisgICAgICAgICJcMVw0NFwxXDE2M1wyXDQ0XDFcdWZmZmZcMVw0NFwyXHVmZmZmXDJcMTQ1XDNcdWZmZmZcMVwxNjNcMVw0NFwxIisKKyAgICAgICAgIlwxNDVcMVw0NFwxXDE0NVwxXDE2NFwyXDQ0XDFcdWZmZmZcMVw0NFwyXHVmZmZmXDFcMTYyXDFcMTY0XDFcMTQ0IisKKyAgICAgICAgIlwxXHVmZmZmXDFcNDRcMlwxNTZcMlx1ZmZmZlwxXDE0M1wxXDE1MVwxXDU1XDFcdWZmZmZcMVw0NFwzXHVmZmZmIisKKyAgICAgICAgIlwyXDE2MlwxXDEyNVwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE0NFwxXDQ0XDNcdWZmZmZcMVw1NVwxXDE0NSIrCisgICAgICAgICJcMVw0NFwxXHVmZmZmXDJcNDRcMVwxNTdcMVwxNTZcM1x1ZmZmZlwyXDQ0XDFcMTIyXDFcdWZmZmZcMVw0NFwzIisKKyAgICAgICAgIlx1ZmZmZlwxXDQ0XDNcdWZmZmZcMVwxNTRcMVw0NFwyXHVmZmZmXDFcMTExXDJcdWZmZmZcMVwxNTdcMVx1ZmZmZiIrCisgICAgICAgICJcMVw0NFwxXDE2MlwxXHVmZmZmXDFcNDRcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9tYXhTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcNzZcMVwxNzRcMVw0NlwxXDE2NVwxXDE3MVwxXDE2NlwxXDc1XDFcNzZcNVw3NVwxXDc2IisKKyAgICAgICAgIlwxXDU2XDFcNzJcMVwxNDFcMVwxNzBcMVwxNzFcMVwxNjRcMVwxNjJcMVwxNTdcMVwxNzBcMVwxNjNcMVwxNTciKworICAgICAgICAiXDNcMTY1XDFcMTYyXDFcMTY0XDJcMTcxXDEyXHVmZmZmXDFcNzJcMVwxNTBcMVwxNzBcMVwxNTRcMVwxNzJcNSIrCisgICAgICAgICJcdWZmZmZcMVw3NVw2XHVmZmZmXDFcMTYzXDFcMTY1XDFcMTcyXDFcMTU2XDFcMTUxXDFcMTY0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTY2XDFcMTcyXDFcMTcxXDFcMTY0XDFcMTU2XDFcMTY0XDNcMTcyXDFcMTQ1XDFcMTcyXDFcMTQ3XDFcMTY0IisKKyAgICAgICAgIlwyMFx1ZmZmZlwxXDc1XDVcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTYyXDJcMTcyXDFcMTYzXDFcMTcxXDFcMTYwIisKKyAgICAgICAgIlwxXDE1NlwxXDE2MlwxXDE1MVwxXDE1N1wxXDE1NFwxXDE3MlwxXDE1MVwxXDE1NlwxXDE1N1wxXDE2MFwxXDE2NCIrCisgICAgICAgICJcMVwxNDFcMVwxNTdcMVwxNzJcMVwxNTVcMVwxNzBcMVwxNTdcMVwxNjJcMVwxNzJcMlwxNTZcMVwxNzBcMVwxNDQiKworICAgICAgICAiXDNcMTcyXDJcMTYyXDFcMTQ2XDFcMTY0XDFcMTU3XDFcNTVcMVwxNDZcMVwxNTRcMVwxNTVcMVwxNzJcMVw0MCIrCisgICAgICAgICJcMVwxNzFcMVwxNDZcMVwxNDdcMVwxNTdcMVwxNjJcMVwxNTVcMVwxNjdcMVwxNTRcMVwxNjRcMVwxNTFcMVw1NSIrCisgICAgICAgICJcMVwxNzJcMVwxNjNcMVwxNTZcMVwxNjRcMVwxNjdcMVwxNTZcMlwxNTdcMVwxNTVcMVwxNTFcMlwxNDRcMVwxNjQiKworICAgICAgICAiXDFcMTcyXDFcMTY3XDFcMTYwXDFcMTcxXDFcMTcwXDFcMTY0XDFcMTQyXDFcMTYyXDE0XHVmZmZmXDFcMTUxIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTU0XDZcdWZmZmZcMVwxNjRcMVwxNjJcMVwxNDNcMVwxNTZcMVwxNjVcMVx1ZmZmZlwxXDE2NCIrCisgICAgICAgICJcMVwxNTRcMVwxNjBcMVwxNDVcMVwxNDNcMVwxNTFcMVwxNjRcMVwxNDJcMVx1ZmZmZlwxXDE1MFwxXDE1M1wxIisKKyAgICAgICAgIlwxNDVcMVwxNjNcMVwxNDNcM1wxNDFcMVwxNzJcMVwxNDVcM1x1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTYyXDEiKworICAgICAgICAiXDE1N1w0XHVmZmZmXDJcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE0NVwxXDE2NFwxXDE1NCIrCisgICAgICAgICJcMVwxNTFcMVwxNDVcMVwxNzJcMVwxNjRcMVwxNjNcMVwxNTFcMVwxNDVcMVwxNTRcMVwxNjBcMVwxNTFcMVwxNDUiKworICAgICAgICAiXDFcMTY0XDFcMTQzXDFcMTY3XDFcMTU3XDFcMTQ3XDFcMTUwXDFcMTY0XDFcMTQ1XDFcMTU0XDFcMTU2XDFcdWZmZmYiKworICAgICAgICAiXDFcMTYzXDFcMTUxXDJcMTQ1XDFcMTQxXDFcMTU1XDFcMTcyXDJcMTY0XDFcdWZmZmZcMVwxNTdcMlwxNTFcMSIrCisgICAgICAgICJcMTQ3XDFcMTUxXDNcdWZmZmZcMVwxNjRcMVwxNDNcMVwxNzJcMVwxNDVcMVwxNTNcMVwxNDRcMVwxNTBcMVwxNjAiKworICAgICAgICAiXDFcMTYzXDFcMTU3XDFcMTcyXDFcMTU3XDJcdWZmZmZcMVwxNDRcMVwxNTdcMVwxNDVcMVwxNjRcMVwxNTBcMSIrCisgICAgICAgICJcMTUzXDFcMTU1XDFcMTQ1XDFcMTQyXDFcMTU0XDFcMTcyXDFcMTUxXDFcMTYzXDFcMTQ1XDJcdWZmZmZcMVwxNTAiKworICAgICAgICAiXDFcMTUxXDFcMTQ3XDFcMTU2XDFcMTU3XDFcMTQ0XDFcMTY1XDFcMTUxXDFcMTcyXDFcMTQ1XDFcMTQ0XDFcMTY1IisKKyAgICAgICAgIlwxXDE0NFwxXDE1NFwxXDE0NFwxXDE0N1wxXDE0NVwxXDU1XDFcMTUzXDFcMTY0XDJcMTQ0XDJcdWZmZmZcMSIrCisgICAgICAgICJcMTQxXDFcMTU1XDFcMTQxXDFcMTU0XDFcMTQ1XDJcMTU2XDFcMTcyXDFcMTQ1XDFcMTY0XDFcMTYwXDFcMTQ1IisKKyAgICAgICAgIlwyXDE1NFwxXDE1N1wxXDE1NFwxXDE1N1wxXDE0NVwxXDE0MVwxXDE2NFwxXDE2MlwxXDE1NVwxXDE0NVwzXDE3MiIrCisgICAgICAgICJcMVwxNTBcMVwxNDRcMVwxNDVcMVwxNTRcMlwxNDVcMVwxNzJcMVwxNTVcMVw0MFwxXDE2MlwxXDE1MVwxXDE2NSIrCisgICAgICAgICJcMVwxNTVcMVx1ZmZmZlwxXDE2MlwxXDE0MVwxXDE0NVwxXDE2NFwyXHVmZmZmXDFcMTYyXDFcMTQ0XDFcMTcyIisKKyAgICAgICAgIlwxXDE1MVwxXDE1NlwxXDE0NVwxXDE1NlwxXDE2MlwxXHVmZmZmXDFcMTUxXDFcMTY1XDFcNTVcMVwxNDZcMSIrCisgICAgICAgICJcMTU2XDFcMTQ1XDFcMTUxXDFcMTQ0XDFcMTcyXDFcMTQzXDFcMTUwXDFcMTE3XDFcMTYyXDFcMTQ1XDFcMTcyIisKKyAgICAgICAgIlwxXDE2NFwxXDE0MVwxXDE2MlwxXDE1MVwxXDE3MlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE3MlwxXDE1NFwxXDQwIisKKyAgICAgICAgIlwxXDE0MVwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTYzXDJcMTU1XDFcMTUxXDFcMTQxXDFcMTYyXDFcMTQ1XDEiKworICAgICAgICAiXHVmZmZmXDFcMTY0XDFcMTQxXDFcMTUxXDFcMTcyXDJcMTQ1XDFcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVwxNjNcMVwxNjVcMVwxNTRcMVwxNzJcMVwxNjRcMVwxNjVcMVwxNDFcMVwxNzJcMVwxNDVcMVwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjFcMVwxNDVcMVwxNTZcMVwxNjRcMVwxNTZcMVwxNDVcMVwxNTFcMVwxNjJcMVwxNDVcMVwxNjJcMVwxNzIiKworICAgICAgICAiXDFcdWZmZmZcMVwxNjJcMVw1NVwxXDE2NlwxXDE2MFwyXDE3MlwxXDE0NVwxXDE1MFwxXDE1NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0N1wxXDE1N1wxXDE0NVwxXDE3MlwxXDE1NFwxXDE0MVwxXDE2MlwxXDE0MlwxXDE3MlwxXDE2M1wxXDE0NCIrCisgICAgICAgICJcMVx1ZmZmZlwyXDE3MlwxXDE1NFwxXDE3MlwyXDE0NVwxXDE2N1wxXDE0NVwxXDE1NVwxXDE1NlwxXDE2NFwyIisKKyAgICAgICAgIlwxNzJcMVwxNTZcMVwxNjJcMVwxNTdcM1x1ZmZmZlwxXDE3MlwxXDE0NVwxXDE0NFwxXDE0NVwxXDE0NFwxXDE1NiIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE0MVwxXHVmZmZmXDFcMTUxXDJcMTU0XDFcMTUxXDFcMTU2XDJcMTQ3XDFcMTQ1XDFcMTYzIisKKyAgICAgICAgIlwxXDE1NlwxXDE3MlwxXHVmZmZmXDFcMTQzXDFcMTQxXDFcMTcyXDFcMTQ3XDFcMTcyXDFcMTY0XDFcMTQyXDEiKworICAgICAgICAiXHVmZmZmXDFcMTcyXDFcMTY0XDFcMTcyXDFcMTU2XDFcMTcyXDJcdWZmZmZcMVwxNTBcMVwxNjJcMVwxNTZcMSIrCisgICAgICAgICJcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNzJcMVwxNTZcMVwxNjZcMVwxNDNcMVx1ZmZmZlwxXDE3MlwxXDE3MVwxIisKKyAgICAgICAgIlwxNzJcMVx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNjJcMVwxNjBcMlwxNjUiKworICAgICAgICAiXDFcMTU2XDFcMTcyXDFcMTQxXDFcMTU2XDFcMTY2XDFcMTQ1XDFcMTQ3XDFcMTU2XDFcdWZmZmZcMVwxNjJcMSIrCisgICAgICAgICJcMTY0XDFcMTU1XDFcdWZmZmZcMVwxNDNcMVwxNjRcMVwxNzJcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDE2MFwxIisKKyAgICAgICAgIlwxNTRcMVx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTY1XDJcMTY0XDFcMTcyXDFcMTQ3XDFcMTcyXDFcMTU2XDEiKworICAgICAgICAiXDE2NFwxXDE2MlwxXDE1NlwxXDE0NVwxXDE0MVwxXHVmZmZmXDFcMTQ1XDFcMTcyXDJcdWZmZmZcMVwxNjJcMSIrCisgICAgICAgICJcMTY0XDFcMTQxXDFcMTYyXDFcMTU1XDFcMTYyXDFcdWZmZmZcMVw1NVwxXDE2MlwxXDE0NFwxXDE0MVwxXDE0NiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE0NlwxXDE3MlwxXHVmZmZmXDFcMTU3XDFcMTU0XDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlw1IisKKyAgICAgICAgIlwxNzJcMVwxNDNcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTYzXDFcMTcyXDFcMTU0XDFcdWZmZmYiKworICAgICAgICAiXDRcMTcyXDFcMTYzXDFcMTYyXDFcMTQyXDFcMTcyXDFcMTY0XDFcMTQzXDFcMTQxXDFcMTQ1XDFcMTQxXDFcMTcwIisKKyAgICAgICAgIlwxXDE2M1wxXDE1MVwxXDE0MVwxXHVmZmZmXDFcMTcyXDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTRcMVwxNjRcMVx1ZmZmZlwxXDE1MVwyXHVmZmZmXDFcMTQ3XDFcdWZmZmZcMVwxNzJcMVwxNTdcMVwxMTQiKworICAgICAgICAiXDFcMTcyXDJcdWZmZmZcMVwxNDNcMVwxNDFcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTcxXDFcMTY0IisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTcyXDFcMTQxXDJcMTU1XDFcNTVcMVwxNzJcMVx1ZmZmZlwxXDE1MVwxXDE2NFwxXDE2NSIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE1NVwxXDE0NVwxXDE0N1wxXDE2NFwzXHVmZmZmXDJcMTQxXDFcNTVcMVx1ZmZmZlwxXDE2MiIrCisgICAgICAgICJcMVwxNTZcMVwxNjNcMlwxNzJcMVwxNDVcMVwxNzJcMlwxNDFcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTQ3IisKKyAgICAgICAgIlwxXDE3MlwxXDE1MVwyXDE3MlwxXDE1NFwxXDE3MlwxXHVmZmZmXDJcMTcyXDFcMTQyXDFcMTU3XDFcMTU1XDEiKworICAgICAgICAiXDU1XDFcMTYwXDFcMTQ3XDFcMTYzXDFcMTYyXDFcMTcyXDFcMTU3XDFcdWZmZmZcMVwxNTRcMVwxNTFcMVwxNjQiKworICAgICAgICAiXDVcdWZmZmZcMVwxNzFcMlx1ZmZmZlwxXDE2MFwxXHVmZmZmXDFcMTU3XDRcdWZmZmZcMVwxNzJcMVwxNjRcMSIrCisgICAgICAgICJcMTQ1XDFcMTcyXDFcMTQ1XDFcMTU3XDFcdWZmZmZcMlwxNzJcMVwxNjRcMVwxNzJcMlwxNjRcMVwxNzJcMVwxNTciKworICAgICAgICAiXDFcMTU0XDFcdWZmZmZcMVwxNTFcMlx1ZmZmZlwxXDE0NVwxXDE1MVwxXDE0NlwxXDE3MlwxXHVmZmZmXDFcMTU2IisKKyAgICAgICAgIlwxXDE1MVwxXDE0MVwxXHVmZmZmXDFcMTQ1XDFcMTU0XDJcdWZmZmZcMVwxNzJcMVwxNDVcMVx1ZmZmZlwxXDE0MyIrCisgICAgICAgICJcMlwxNzJcMVwxNjRcMVx1ZmZmZlwxXDE2NFwxXDE3MlwxXDE1NVwxXDE2MFwxXDE3MlwxXDU1XDFcMTcxXDEiKworICAgICAgICAiXDE2NFwxXDE2MFwxXHVmZmZmXDFcMTQ3XDFcMTYzXDFcMTcyXDJcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE2NCIrCisgICAgICAgICJcMVwxNjJcMVx1ZmZmZlwxXDU1XDFcdWZmZmZcMVwxNTZcMlx1ZmZmZlwxXDU1XDNcdWZmZmZcMVwxNDVcMVwxNjUiKworICAgICAgICAiXDFcMTQxXDFcMTY0XDFcMTQxXDFcMTUxXDJcMTcyXDFcdWZmZmZcMVwxNjJcMVwxNTdcMVwxNDdcMVwxNDVcMSIrCisgICAgICAgICJcMTcyXDFcMTQxXDFcMTYyXDFcdWZmZmZcMVwxNzJcMVwxNDRcMVx1ZmZmZlwxXDE0MVwxXDE1N1wyXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwxXHVmZmZmXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNTZcMVwxMDNcMVwxNTZcMVwxNzJcMVwxNjQiKworICAgICAgICAiXDFcMTUxXDFcdWZmZmZcMVwxNTFcMVwxNjJcMVwxNjNcMVwxNTdcMVwxNjNcMVx1ZmZmZlwxXDE2MlwxXDE0NSIrCisgICAgICAgICJcNlx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTQyXDFcMTU0XDFcdWZmZmZcMVwxNjRcMVwxNzJcMVwxNjRcMVwxNDUiKworICAgICAgICAiXDFcMTUxXDFcMTcyXDJcdWZmZmZcMVwxNTFcMVwxNDdcMVwxNjNcMVwxNDdcMVx1ZmZmZlwxXDE1NFwxXDE1NiIrCisgICAgICAgICJcMVwxNjJcNFx1ZmZmZlwxXDE0N1wxXDE1NlwyXHVmZmZmXDFcMTU1XDFcMTYyXDFcMTU2XDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTU2XDFcMTcyXDFcdWZmZmZcMVw0MFwxXDE0NFwxXDE2NFwyXDE3MlwxXHVmZmZmXDFcMTcyXDFcMTYzIisKKyAgICAgICAgIlwxXDE0N1wxXHVmZmZmXDFcMTU0XDFcMTQzXDFcMTcyXDFcMTYzXDFcMTY0XDFcMTQ2XDNcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDFcMTQxXDVcdWZmZmZcMVwxNDVcMVwxNzJcMVwxNTZcMVx1ZmZmZlwxXDE1N1wxXDE1MVwyXHVmZmZmIisKKyAgICAgICAgIlwyXDE3MlwxXDE0NFwxXDE0N1wxXDE0NVwxXDE3MlwxXDE2M1wyXDE3MlwxXHVmZmZmXDFcMTcyXDJcdWZmZmYiKworICAgICAgICAiXDJcMTQ1XDNcdWZmZmZcMVwxNjNcMVwxNzJcMVwxNDVcMVwxNzJcMVwxNDVcMVwxNjRcMlwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNzJcMlx1ZmZmZlwxXDE2MlwxXDE2NFwxXDE0NFwxXHVmZmZmXDFcMTcyXDJcMTU2XDJcdWZmZmZcMVwxNDMiKworICAgICAgICAiXDFcMTUxXDFcNTVcMVx1ZmZmZlwxXDE3MlwzXHVmZmZmXDJcMTYyXDFcMTI1XDFcdWZmZmZcMVwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNDRcMVwxNzJcM1x1ZmZmZlwxXDU1XDFcMTQ1XDFcMTcyXDFcdWZmZmZcMlwxNzJcMVwxNTdcMVwxNTYiKworICAgICAgICAiXDNcdWZmZmZcMlwxNzJcMVwxMjJcMVx1ZmZmZlwxXDE3MlwzXHVmZmZmXDFcMTcyXDNcdWZmZmZcMVwxNTRcMSIrCisgICAgICAgICJcMTcyXDJcdWZmZmZcMVwxMTFcMlx1ZmZmZlwxXDE1N1wxXHVmZmZmXDFcMTcyXDFcMTYyXDFcdWZmZmZcMVwxNzIiKworICAgICAgICAiXDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfYWNjZXB0UyA9CisgICAgICAgICJcNDFcdWZmZmZcMVwxNTZcMVwxNTdcMVx1MDBiY1wxXHUwMGJkXDFcdTAwY2JcMVx1MDBjY1wxXHUwMGNkXDEiKworICAgICAgICAiXHUwMGNlXDFcdTAwY2ZcMVx1MDBkMVw1XHVmZmZmXDFcdTAwZjZcMlx1MDBmN1wxXHUwMGZhXDFcdTAwZmJcMSIrCisgICAgICAgICJcdWZmZmZcMVwyN1wxXDFcMVwyXDFcdTAwZjBcMVwzXDFcdTAwZTVcNlx1ZmZmZlwxXHUwMGY2XDE1XHVmZmZmIisKKyAgICAgICAgIlwxXDEwXDFcNDFcMVwzMlwxXDExXDFcMjRcMVw0MlwxXDMzXDFcMTJcMVwzNVwxXDM0XDFcMTNcMVx1MDBmOCIrCisgICAgICAgICJcMVx1MDBmOVwxXDM2XDFcMTRcMVwzN1wxXHVmZmZmXDFcNDBcMVwyMVwxXDIyXDFcMzBcMVwyM1wxXHVmZmZmIisKKyAgICAgICAgIlwxXDQzXDFcMzFcMVx1MDBlZlwxXHUwMGU0XDExM1x1ZmZmZlwxXDE1NlwxXDE1N1wxXHUwMGJjXDFcdTAwYmQiKworICAgICAgICAiXDFcdTAwY2JcMVx1MDBjY1wxXHUwMGNkXDFcdTAwY2VcMVx1MDBjZlwxXHUwMGQxXDFcdTAwZWVcMVx1MDBkNSIrCisgICAgICAgICJcMVx1ZmZmZlwxXHUwMGYzXDFcdWZmZmZcMVx1MDBmNFwxXHUwMGY1XDFcdTAwZjdcMVx1MDBmYVwxXDE3XDEiKworICAgICAgICAiXDE1XDVcdWZmZmZcMVw1NFwxMFx1ZmZmZlwxXHUwMGRhXDEyXHVmZmZmXDFcNjNcMVw2NFwxXDY1XDFcdWZmZmYiKworICAgICAgICAiXDFcdTAwYWNcMlx1ZmZmZlwxXDIwXDFcMTZcMVwyNVwxXDI2XDNcdWZmZmZcMVw2MVwxXHVmZmZmXDFcNjBcMzAiKworICAgICAgICAiXHVmZmZmXDFcdTAwZDJcMTFcdWZmZmZcMVw1M1w1XHVmZmZmXDFcNTVcMVw1N1wxXDYyXDE0XHVmZmZmXDFcdTAwOWMiKworICAgICAgICAiXDFcdTAwYmVcMTZcdWZmZmZcMVx1MDBiOVwxXHUwMGJiXDI2XHVmZmZmXDFcdTAwODJcMVx1MDBiMlw0N1x1ZmZmZiIrCisgICAgICAgICJcMVw3XDRcdWZmZmZcMVw0NFwxXHUwMGYxXDEwXHVmZmZmXDFcMTE3XDMzXHVmZmZmXDFcdTAwZDhcMTFcdWZmZmYiKworICAgICAgICAiXDFcMTE0XDZcdWZmZmZcMVw3MVwxXHVmZmZmXDFcMTUzXDEzXHVmZmZmXDFcdTAwZGJcMTNcdWZmZmZcMVx1MDBhZCIrCisgICAgICAgICJcMTFcdWZmZmZcMVwxMjVcMTNcdWZmZmZcMVx1MDBlMFwyMFx1ZmZmZlwxXHUwMGFlXDFcMTUxXDFcdTAwZDciKworICAgICAgICAiXDZcdWZmZmZcMVx1MDBhMFwxXHUwMDlmXDFcdWZmZmZcMVx1MDBiZlwxM1x1ZmZmZlwxXHUwMGQzXDdcdWZmZmYiKworICAgICAgICAiXDFcMTAwXDVcdWZmZmZcMVwxNDdcMVx1MDA4OFw1XHVmZmZmXDFcNTZcNFx1ZmZmZlwxXHUwMGMyXDNcdWZmZmYiKworICAgICAgICAiXDFcMTUyXDFcdWZmZmZcMVwxNjJcMlx1ZmZmZlwxXHUwMDg2XDE0XHVmZmZmXDFcdTAwYjZcM1x1ZmZmZlwxIisKKyAgICAgICAgIlx1MDA5Ylw0XHVmZmZmXDFcMTAyXDNcdWZmZmZcMVwxMzFcMVx1ZmZmZlwxXHUwMGRjXDE0XHVmZmZmXDFcMTI3IisKKyAgICAgICAgIlwyXHVmZmZmXDFcdTAwYWJcMVwxMTNcNlx1ZmZmZlwxXHUwMGU2XDVcdWZmZmZcMVwxNzJcMlx1ZmZmZlwxXHUwMGYyIisKKyAgICAgICAgIlwyXHVmZmZmXDFcdTAwYzdcMVx1ZmZmZlwxXHUwMGExXDdcdWZmZmZcMVwxMTVcMVx1ZmZmZlwxXHUwMDgwXDMiKworICAgICAgICAiXHVmZmZmXDFcdTAwZTNcMjFcdWZmZmZcMVwxNTRcM1x1ZmZmZlwxXHUwMDg5XDFcdWZmZmZcMVw1MVwyXHVmZmZmIisKKyAgICAgICAgIlwxXDEwMVwxXHVmZmZmXDFcMTUwXDFcdTAwY2FcMVx1ZmZmZlwxXDEzMlw0XHVmZmZmXDFcdTAwYzlcMVwxNDAiKworICAgICAgICAiXDNcdWZmZmZcMVw1MlwxXHVmZmZmXDFcMTA3XDJcdWZmZmZcMVwxNjVcNlx1ZmZmZlwxXDE2N1wzXHVmZmZmIisKKyAgICAgICAgIlwxXDE0Nlw0XHVmZmZmXDFcNjZcMVw2N1wxXDcwXDNcdWZmZmZcMVx1MDBjNlwxMVx1ZmZmZlwxXDEwNFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDEzN1w3XHVmZmZmXDFcdTAwYjFcMTRcdWZmZmZcMVx1MDBjM1wzXHVmZmZmXDFcdTAwYmFcMVx1MDBiMCIrCisgICAgICAgICJcMVx1MDBkZVwxXHUwMGQ5XDFcNFwxXHVmZmZmXDFcNlwxXDE2NFwxXHVmZmZmXDFcMTAzXDFcdWZmZmZcMVw1IisKKyAgICAgICAgIlwxXDEzM1wxXDEzNVwxXDEzNFw2XHVmZmZmXDFcdTAwYTlcMTFcdWZmZmZcMVw0NlwxXHVmZmZmXDFcMTcwXDEiKworICAgICAgICAiXHUwMGMwXDRcdWZmZmZcMVx1MDBkNFwzXHVmZmZmXDFcNDdcMlx1ZmZmZlwxXDc1XDFcdTAwODdcMlx1ZmZmZiIrCisgICAgICAgICJcMVx1MDBhYVw0XHVmZmZmXDFcMTY2XDExXHVmZmZmXDFcMTYwXDNcdWZmZmZcMVw3NFwxXHUwMDllXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQxXDJcdWZmZmZcMVwxMjRcMVx1ZmZmZlwxXHUwMDlkXDFcdWZmZmZcMVx1MDBkZlwxXHUwMGVkXDFcdWZmZmYiKworICAgICAgICAiXDFcMTM2XDFcdTAwYTdcMVx1MDBhOFwxMFx1ZmZmZlwxXHUwMGRkXDdcdWZmZmZcMVx1MDA4MVwyXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMGIzXDJcdWZmZmZcMVx1MDBkNlwxXHUwMGVjXDFcdWZmZmZcMVwxMjBcMlx1ZmZmZlwxXDQ1XDZcdWZmZmYiKworICAgICAgICAiXDFcMTI2XDVcdWZmZmZcMVx1MDBlMVwyXHVmZmZmXDFcMTIxXDFcMTIyXDFcdTAwOTdcMVx1MDA5OFwxXHUwMDk5IisKKyAgICAgICAgIlwxXHUwMDlhXDFcdWZmZmZcMVwxMTBcMlx1ZmZmZlwxXDE1NVw2XHVmZmZmXDFcdTAwYjVcMVw3Nlw0XHVmZmZmIisKKyAgICAgICAgIlwxXDEwNlwzXHVmZmZmXDFcdTAwOGZcMVx1MDA5MFwxXHUwMDkxXDFcdTAwOTJcMlx1ZmZmZlwxXHUwMDg1XDEiKworICAgICAgICAiXHUwMGE0XDRcdWZmZmZcMVwxMTJcMlx1ZmZmZlwxXHUwMGEyXDVcdWZmZmZcMVx1MDBjOFwzXHVmZmZmXDFcdTAwYzQiKworICAgICAgICAiXDExXHVmZmZmXDFcNzJcMlx1ZmZmZlwxXHUwMDkzXDFcdTAwOTRcMVx1MDA5NVwxXHUwMDk2XDFcdTAwYjdcMyIrCisgICAgICAgICJcdWZmZmZcMVx1MDA4M1wyXHVmZmZmXDFcMTE2XDFcMTIzXDExXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwxXHUwMGMxIisKKyAgICAgICAgIlwxXHUwMGE2XDJcdWZmZmZcMVx1MDA4Y1wxXHUwMGI4XDFcNTBcMTBcdWZmZmZcMVx1MDBiNFwxXHVmZmZmXDEiKworICAgICAgICAiXHUwMDhhXDFcNzdcM1x1ZmZmZlwxXDczXDNcdWZmZmZcMVx1MDBhM1wxXHUwMGViXDNcdWZmZmZcMVwxNzRcMSIrCisgICAgICAgICJcdWZmZmZcMVx1MDA4ZFwxXHUwMDhlXDFcdTAwYWZcM1x1ZmZmZlwxXDEzMFwxXHVmZmZmXDFcMTExXDJcdWZmZmYiKworICAgICAgICAiXDFcdTAwZThcMVx1MDBkMFwxXDE2M1wzXHVmZmZmXDFcMTc1XDRcdWZmZmZcMVwxNDVcMVwxNDNcMVx1MDA4NCIrCisgICAgICAgICJcM1x1ZmZmZlwxXHUwMGM1XDFcdWZmZmZcMVx1MDBlN1wxXDE0NFwxXDE0MlwxXHVmZmZmXDFcMTA1XDFcMTczIisKKyAgICAgICAgIlwxXDE3N1wyXHVmZmZmXDFcdTAwZTlcMVx1MDBlYVwxXHVmZmZmXDFcdTAwZTJcMVwxNzFcMVx1ZmZmZlwxXDE3NiIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE2MVwxXHVmZmZmXDFcdTAwOGIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfc3BlY2lhbFMgPQorICAgICAgICAiXDFcMFx1MDQxY1x1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjFfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDExXDY0XDJcNjNcMlw2NFwxXDYzXDIyXDY0XDFcNjNcMVwxNFwxXDYxXDFcNTBcMVw2MFwxXDEzXDEiKworICAgICAgICAgICAgIlwzXDFcNjJcMVw0M1wxXDQ0XDFcMTFcMVw3XDFcNDZcMVwxMFwxXDE3XDFcMTJcMVw1NVwxMVw1NlwxIisKKyAgICAgICAgICAgICJcNTNcMVw1MlwxXDE2XDFcMVwxXDE1XDFcMjBcMVw0NVwzMlw2MFwxXDUxXDFcNjRcMVw0N1wxXDU3XDEiKworICAgICAgICAgICAgIlw2MFwxXDY0XDFcNlwxXDM3XDFcNFwxXDVcMVwyMlwxXDI1XDFcMzVcMVwzNlwxXDI0XDJcNjBcMVwzMSIrCisgICAgICAgICAgICAiXDFcMjZcMVwzMlwxXDMzXDFcMjdcMVw2MFwxXDM0XDFcMjNcMVw0MFwxXDMwXDFcMjFcMVw1NFwzXDYwIisKKyAgICAgICAgICAgICJcMVw0MVwxXDJcMVw0Mlx1ZmY4Mlw2NCIsCisgICAgICAgICAgICAiXDFcNjVcMVw2NiIsCisgICAgICAgICAgICAiXDFcNzAiLAorICAgICAgICAgICAgIlwxXDcyIiwKKyAgICAgICAgICAgICJcMVwxMDFcM1x1ZmZmZlwxXDc3XDZcdWZmZmZcMVwxMDBcMVw3NlwxXHVmZmZmXDFcNzVcNVx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNzQiLAorICAgICAgICAgICAgIlwxXDEwNVwzXHVmZmZmXDFcMTA2XDNcdWZmZmZcMVwxMDNcNVx1ZmZmZlwxXDEwNFwxMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTA3IiwKKyAgICAgICAgICAgICJcMVwxMTJcMVwxMTFcMVwxMTNcNjFcdWZmZmZcMVwxMTZcNFx1ZmZmZlwxXDExMFw2XHVmZmZmXDEiKworICAgICAgICAgICAgIlwxMTVcMVx1ZmZmZlwxXDExN1wxXDExNCIsCisgICAgICAgICAgICAiXDFcMTIxXDIxXHVmZmZmXDFcMTIwIiwKKyAgICAgICAgICAgICJcMVwxMjVcMTdcdWZmZmZcMVwxMjNcMVwxMjQiLAorICAgICAgICAgICAgIlwxXDEzMFwyMlx1ZmZmZlwxXDEyNyIsCisgICAgICAgICAgICAiXDFcMTMzXDRcdWZmZmZcMVwxMzRcMTVcdWZmZmZcMVwxMzIiLAorICAgICAgICAgICAgIlwxXDEzNiIsCisgICAgICAgICAgICAiXDFcMTQwIiwKKyAgICAgICAgICAgICJcMVwxNDIiLAorICAgICAgICAgICAgIlwxXDE0NCIsCisgICAgICAgICAgICAiXDFcMTQ2IiwKKyAgICAgICAgICAgICJcMVwxNTFcMTNcdWZmZmZcMVwxNTAiLAorICAgICAgICAgICAgIlwxXDE1MyIsCisgICAgICAgICAgICAiXDFcMTU2XDFcMTU1XDEyXHVmZmZmXDFcMTU0IiwKKyAgICAgICAgICAgICJcMVwxNjFcMVx1ZmZmZlwxXDE2M1wxXHVmZmZmXDFcMTYyXDJcdWZmZmZcMVwxNzFcMVwxNjZcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTY0XDJcdWZmZmZcMVwxNjVcNFx1ZmZmZlwxXDE1N1wxXDE2MFwxXHVmZmZmXDFcMTY3XDFcdWZmZmYiKworICAgICAgICAgICAgIlwxXDE3MCIsCisgICAgICAgICAgICAiXDFcMTc1XDJcdWZmZmZcMVwxNzZcNlx1ZmZmZlwxXDE3MlwxXDE3M1w1XHVmZmZmXDFcMTc0IiwKKyAgICAgICAgICAgICJcMVwxNzdcN1x1ZmZmZlwxXHUwMDgwXDVcdWZmZmZcMVx1MDA4MlwyXHVmZmZmXDFcdTAwODEiLAorICAgICAgICAgICAgIlwxXHUwMDg2XDNcdWZmZmZcMVx1MDA4N1wzXHVmZmZmXDFcdTAwODVcM1x1ZmZmZlwxXHUwMDgzXDEiKworICAgICAgICAgICAgIlx1ZmZmZlwxXHUwMDg0IiwKKyAgICAgICAgICAgICJcMVx1MDA4ZVwxXHVmZmZmXDFcdTAwODlcMVx1MDA4ZFwxXHUwMDhjXDExXHVmZmZmXDFcdTAwOGIiKworICAgICAgICAgICAgIlwyXHVmZmZmXDFcdTAwOGZcMVx1ZmZmZlwxXHUwMDg4XDNcdWZmZmZcMVx1MDA4YSIsCisgICAgICAgICAgICAiXDFcdTAwOTRcNFx1ZmZmZlwxXHUwMDkxXDFcdTAwOTNcMVx1MDA5NVwxXHVmZmZmXDFcdTAwOTJcMSIrCisgICAgICAgICAgICAiXHUwMDkwIiwKKyAgICAgICAgICAgICJcMVx1MDA5NlwzXHVmZmZmXDFcdTAwOTdcM1x1ZmZmZlwxXHUwMDk4XDVcdWZmZmZcMVx1MDA5OSIsCisgICAgICAgICAgICAiXDFcdTAwOWNcMTFcdWZmZmZcMVx1MDA5YVw1XHVmZmZmXDFcdTAwOWIiLAorICAgICAgICAgICAgIlwxXHUwMDlkXDNcdWZmZmZcMVx1MDBhMVw3XHVmZmZmXDFcdTAwYTBcM1x1ZmZmZlwxXHUwMDlmXDIiKworICAgICAgICAgICAgIlx1ZmZmZlwxXHUwMDllIiwKKyAgICAgICAgICAgICJcMVx1MDBhNFwzXHVmZmZmXDFcdTAwYTJcNVx1ZmZmZlwxXHUwMGE1XDVcdWZmZmZcMVx1MDBhMyIsCisgICAgICAgICAgICAiXDFcdTAwYTZcMTFcdWZmZmZcMVx1MDBhN1wyXHVmZmZmXDFcdTAwYTgiLAorICAgICAgICAgICAgIlwxXHUwMGFhXDNcdWZmZmZcMVx1MDBhYlwxMlx1ZmZmZlwxXHUwMGE5IiwKKyAgICAgICAgICAgICJcMVx1MDBhY1wxNVx1ZmZmZlwxXHUwMGFkXDExXHVmZmZmXDFcdTAwYWUiLAorICAgICAgICAgICAgIlwxXHUwMGI0XDNcdWZmZmZcMVx1MDBiMlwyXHVmZmZmXDFcdTAwYjVcMVx1MDBiM1w1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBhZlwyXHVmZmZmXDFcdTAwYjFcNlx1ZmZmZlwxXHUwMGIwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGMwIiwKKyAgICAgICAgICAgICJcMVx1MDBjMiIsCisgICAgICAgICAgICAiXDEyXHUwMGM0XDEwXHVmZmZmXDFcdTAwYzZcMVx1ZmZmZlwzXHUwMGM2XDVcdWZmZmZcMVx1MDBjNiIrCisgICAgICAgICAgICAiXDEzXHVmZmZmXDFcdTAwYzNcNlx1ZmZmZlwxXHUwMGM0XDJcdWZmZmZcMVx1MDBjNlwxXHVmZmZmXDMiKworICAgICAgICAgICAgIlx1MDBjNlw1XHVmZmZmXDFcdTAwYzZcMTNcdWZmZmZcMVx1MDBjMyIsCisgICAgICAgICAgICAiXDEyXHUwMGM0XDEwXHVmZmZmXDFcdTAwYzZcMVx1ZmZmZlwzXHUwMGM2XDVcdWZmZmZcMVx1MDBjNiIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwYzRcMlx1ZmZmZlwxXHUwMGM2XDFcdWZmZmZcM1x1MDBjNlw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBjNiIsCisgICAgICAgICAgICAiXDFcMTAyXDM0XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmZcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYzkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGNjXDFcdTAwY2IiLAorICAgICAgICAgICAgIlwxXHUwMGNmXDFcdWZmZmZcMVx1MDBjZFw2XHVmZmZmXDFcdTAwY2UiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDBkMlwxXHVmZmZmXDFcdTAwZDEiLAorICAgICAgICAgICAgIlwxXHUwMGQzIiwKKyAgICAgICAgICAgICJcMVx1MDBkNFwxXHUwMGQ1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGQ2IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDIzXDEwMlwxXHUwMGQ3XDFcdTAwZDhcNVwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMGRiXDFcdTAwZGFcMVx1MDBkY1w0XHVmZmZmXDFcdTAwZGQiLAorICAgICAgICAgICAgIlwxXHUwMGUwXDE0XHVmZmZmXDFcdTAwZGVcMVx1MDBkZiIsCisgICAgICAgICAgICAiXDFcdTAwZTEiLAorICAgICAgICAgICAgIlwxXHUwMGUyXDdcdWZmZmZcMVx1MDBlMyIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAwZTciLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDBlOSIsCisgICAgICAgICAgICAiXDFcdTAwZWEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZWIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBlZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBlZlw1XHVmZmZmXDFcdTAwZjAiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMjNcMTAyXDFcdTAwZjFcNlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxMDJcMVx1MDBmM1wzMFwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMGY1IiwKKyAgICAgICAgICAgICJcMVx1MDBmNlwyMFx1ZmZmZlwxXHUwMGY4XDZcdWZmZmZcMVx1MDBmNyIsCisgICAgICAgICAgICAiXDFcdTAwZmJcMTJcdWZmZmZcMVx1MDBmYVwyXHVmZmZmXDFcdTAwZjkiLAorICAgICAgICAgICAgIlwxXHUwMGZjIiwKKyAgICAgICAgICAgICJcMVx1MDBmZCIsCisgICAgICAgICAgICAiXDFcdTAwZmZcN1x1ZmZmZlwxXHUwMGZlIiwKKyAgICAgICAgICAgICJcMVx1MDEwMCIsCisgICAgICAgICAgICAiXDFcdTAxMDEiLAorICAgICAgICAgICAgIlwxXHUwMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTA1IiwKKyAgICAgICAgICAgICJcMVx1MDEwN1wxNlx1ZmZmZlwxXHUwMTA2IiwKKyAgICAgICAgICAgICJcMVx1MDEwOFwxN1x1ZmZmZlwxXHUwMTA5XDFcdTAxMGEiLAorICAgICAgICAgICAgIlwxXHUwMTBiIiwKKyAgICAgICAgICAgICJcMVx1MDEwYyIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTBlXDFcdTAxMGYiLAorICAgICAgICAgICAgIlwxXHUwMTExXDFcdWZmZmZcMVx1MDExMlwxMVx1ZmZmZlwxXHUwMTEwIiwKKyAgICAgICAgICAgICJcMVx1MDExMyIsCisgICAgICAgICAgICAiXDFcdTAxMTVcMVx1MDExNlwyXHVmZmZmXDFcdTAxMTQiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDExOCIsCisgICAgICAgICAgICAiXDFcdTAxMTkiLAorICAgICAgICAgICAgIlwxXHUwMTFiXDVcdWZmZmZcMVx1MDExYSIsCisgICAgICAgICAgICAiXDFcdTAxMWMiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTIwIiwKKyAgICAgICAgICAgICJcMVx1MDEyMSIsCisgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTI0XDFcdTAxMjVcMlx1ZmZmZlwxXHUwMTIzXDE0XHVmZmZmXDFcdTAxMjYiLAorICAgICAgICAgICAgIlwxXHUwMTI3IiwKKyAgICAgICAgICAgICJcMVx1MDEyOCIsCisgICAgICAgICAgICAiXDFcdTAxMjkiLAorICAgICAgICAgICAgIlwxXHUwMTJhIiwKKyAgICAgICAgICAgICJcMVx1MDEyYiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTJkIiwKKyAgICAgICAgICAgICJcMVx1MDEzMFwxM1x1ZmZmZlwxXHUwMTJlXDEyXHVmZmZmXDFcdTAxMmYiLAorICAgICAgICAgICAgIlwxXHUwMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxMzMiLAorICAgICAgICAgICAgIlwxXHUwMTM1XDNcdWZmZmZcMVx1MDEzNCIsCisgICAgICAgICAgICAiXDFcdTAxMzdcMVx1MDEzNiIsCisgICAgICAgICAgICAiXDFcdTAxMzgiLAorICAgICAgICAgICAgIlwxXHUwMTM5IiwKKyAgICAgICAgICAgICJcMVx1MDEzYSIsCisgICAgICAgICAgICAiXDFcdTAxM2IiLAorICAgICAgICAgICAgIlwxXHUwMTNjIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAxNDBcMlx1ZmZmZlwxXHUwMTNlXDEzXHVmZmZmXDFcdTAxM2YiLAorICAgICAgICAgICAgIlwxXHUwMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE0M1wxXHVmZmZmXDFcdTAxNDJcMlx1ZmZmZlwxXHUwMTQ1XDFcdTAxNDQiLAorICAgICAgICAgICAgIlwxXHUwMTQ2IiwKKyAgICAgICAgICAgICJcMVx1MDE0NyIsCisgICAgICAgICAgICAiXDFcdTAxNDgiLAorICAgICAgICAgICAgIlwxXHUwMTRhXDVcdWZmZmZcMVx1MDE0OSIsCisgICAgICAgICAgICAiXDFcdTAxNGIiLAorICAgICAgICAgICAgIlwxXHUwMTRjXDdcdWZmZmZcMVx1MDE0ZCIsCisgICAgICAgICAgICAiXDFcdTAxNGUiLAorICAgICAgICAgICAgIlwxXHUwMTUwXDFcdTAxNGYiLAorICAgICAgICAgICAgIlwxXHUwMTUzXDVcdWZmZmZcMVx1MDE1MlwxXHVmZmZmXDFcdTAxNTEiLAorICAgICAgICAgICAgIlwxXDEwMlwxMFx1ZmZmZlwxXHUwMTU0XDJcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmYiKworICAgICAgICAgICAgIlwxXDEwMlwxXHVmZmZmXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAxNTlcMVx1MDE1N1wzXHVmZmZmXDFcdTAxNTZcMlx1ZmZmZlwxXHUwMTU4IiwKKyAgICAgICAgICAgICJcMVx1MDE1YSIsCisgICAgICAgICAgICAiXDFcdTAxNWJcM1x1ZmZmZlwxXHUwMTVjXDE3XHVmZmZmXDFcdTAxNWVcM1x1ZmZmZlwxXHUwMTVkIiwKKyAgICAgICAgICAgICJcMVx1MDE2MFwxMlx1ZmZmZlwxXHUwMTVmIiwKKyAgICAgICAgICAgICJcMVx1MDE2MVw2XHVmZmZmXDFcdTAxNjIiLAorICAgICAgICAgICAgIlwxXHUwMTYzIiwKKyAgICAgICAgICAgICJcMVx1MDE2NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXHUwMGM0XDEwXHVmZmZmXDFcdTAwYzZcMVx1ZmZmZlwzXHUwMGM2XDVcdWZmZmZcMVx1MDBjNiIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwYzRcMlx1ZmZmZlwxXHUwMGM2XDFcdWZmZmZcM1x1MDBjNlw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBjNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjYiLAorICAgICAgICAgICAgIlwxXHUwMTY3IiwKKyAgICAgICAgICAgICJcMVx1MDE2OCIsCisgICAgICAgICAgICAiXDFcdTAxNjkiLAorICAgICAgICAgICAgIlwxXHUwMTZhXDVcdWZmZmZcMVx1MDE2YiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE2YyIsCisgICAgICAgICAgICAiXDFcdTAxNmQiLAorICAgICAgICAgICAgIlwxXHUwMTZlIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZiIsCisgICAgICAgICAgICAiXDFcdTAxNzAiLAorICAgICAgICAgICAgIlwxXHUwMTcxIiwKKyAgICAgICAgICAgICJcMVx1MDE3MiIsCisgICAgICAgICAgICAiXDFcdTAxNzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzQiLAorICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICJcMVx1MDE3N1wzXHVmZmZmXDFcdTAxNzYiLAorICAgICAgICAgICAgIlwxXHUwMTc4IiwKKyAgICAgICAgICAgICJcMVx1MDE3OSIsCisgICAgICAgICAgICAiXDFcdTAxN2EiLAorICAgICAgICAgICAgIlwxXHUwMTdiIiwKKyAgICAgICAgICAgICJcMVx1MDE3YyIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTdlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3ZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4MCIsCisgICAgICAgICAgICAiXDFcdTAxODEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDE4NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4NiIsCisgICAgICAgICAgICAiXDFcdTAxODhcMTRcdWZmZmZcMVx1MDE4NyIsCisgICAgICAgICAgICAiXDFcdTAxODkiLAorICAgICAgICAgICAgIlwxXHUwMThhIiwKKyAgICAgICAgICAgICJcMVx1MDE4YiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMThlXDFcdTAxOGQiLAorICAgICAgICAgICAgIlwxXHUwMThmIiwKKyAgICAgICAgICAgICJcMVx1MDE5MCIsCisgICAgICAgICAgICAiXDFcdTAxOTEiLAorICAgICAgICAgICAgIlwxXHUwMTkyIiwKKyAgICAgICAgICAgICJcMVx1MDE5MyIsCisgICAgICAgICAgICAiXDFcdTAxOTQiLAorICAgICAgICAgICAgIlwxXHUwMTk1IiwKKyAgICAgICAgICAgICJcMVx1MDE5NiIsCisgICAgICAgICAgICAiXDFcdTAxOTciLAorICAgICAgICAgICAgIlwxXHUwMTk4IiwKKyAgICAgICAgICAgICJcMVx1MDE5OSIsCisgICAgICAgICAgICAiXDFcdTAxOWEiLAorICAgICAgICAgICAgIlwxXHUwMTliIiwKKyAgICAgICAgICAgICJcMVx1MDE5Y1wxNlx1ZmZmZlwxXHUwMTlkIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZSIsCisgICAgICAgICAgICAiXDFcdTAxOWYiLAorICAgICAgICAgICAgIlwxXHUwMWEwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWExIiwKKyAgICAgICAgICAgICJcMVx1MDFhMiIsCisgICAgICAgICAgICAiXDFcdTAxYTMiLAorICAgICAgICAgICAgIlwxXHUwMWE0IiwKKyAgICAgICAgICAgICJcMVx1MDFhNSIsCisgICAgICAgICAgICAiXDFcdTAxYTYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMTRcMTAyXDFcdTAxYTdcMTVcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDFhOSIsCisgICAgICAgICAgICAiXDFcdTAxYWEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYWIiLAorICAgICAgICAgICAgIlwxXHUwMWFjIiwKKyAgICAgICAgICAgICJcMVx1MDFhZCIsCisgICAgICAgICAgICAiXDFcdTAxYWUiLAorICAgICAgICAgICAgIlwxXHUwMWFmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFiMCIsCisgICAgICAgICAgICAiXDFcdTAxYjEiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDFiMyIsCisgICAgICAgICAgICAiXDFcdTAxYjQiLAorICAgICAgICAgICAgIlwxXHUwMWI1IiwKKyAgICAgICAgICAgICJcMVx1MDFiNiIsCisgICAgICAgICAgICAiXDFcdTAxYjciLAorICAgICAgICAgICAgIlwxXHUwMWI4XDZcdWZmZmZcMVx1MDFiOSIsCisgICAgICAgICAgICAiXDFcdTAxYmEiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDFiYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWJkIiwKKyAgICAgICAgICAgICJcMVx1MDFiZSIsCisgICAgICAgICAgICAiXDFcdTAxYmYiLAorICAgICAgICAgICAgIlwxXHUwMWMwIiwKKyAgICAgICAgICAgICJcMVx1MDFjMSIsCisgICAgICAgICAgICAiXDFcdTAxYzIiLAorICAgICAgICAgICAgIlwxXHUwMWMzIiwKKyAgICAgICAgICAgICJcMVx1MDFjNCIsCisgICAgICAgICAgICAiXDFcdTAxYzUiLAorICAgICAgICAgICAgIlwxXHUwMWM2IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAxYzgiLAorICAgICAgICAgICAgIlwxXHUwMWM5IiwKKyAgICAgICAgICAgICJcMVx1MDFjYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWNiIiwKKyAgICAgICAgICAgICJcMVx1MDFjYyIsCisgICAgICAgICAgICAiXDFcdTAxY2QiLAorICAgICAgICAgICAgIlwxXHUwMWNlIiwKKyAgICAgICAgICAgICJcMVx1MDFjZiIsCisgICAgICAgICAgICAiXDFcdTAxZDAiLAorICAgICAgICAgICAgIlwxXHUwMWQxIiwKKyAgICAgICAgICAgICJcMVx1MDFkMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMWQ0IiwKKyAgICAgICAgICAgICJcMVx1MDFkNSIsCisgICAgICAgICAgICAiXDFcdTAxZDZcNVx1ZmZmZlwxXHUwMWQ3IiwKKyAgICAgICAgICAgICJcMVx1MDFkOCIsCisgICAgICAgICAgICAiXDFcdTAxZDkiLAorICAgICAgICAgICAgIlwxXHUwMWRhIiwKKyAgICAgICAgICAgICJcMVx1MDFkYiIsCisgICAgICAgICAgICAiXDFcdTAxZGMiLAorICAgICAgICAgICAgIlwxXHUwMWRkIiwKKyAgICAgICAgICAgICJcMVx1MDFkZSIsCisgICAgICAgICAgICAiXDFcdTAxZGYiLAorICAgICAgICAgICAgIlwxXHUwMWUwIiwKKyAgICAgICAgICAgICJcMVx1MDFlMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWUyIiwKKyAgICAgICAgICAgICJcMVx1MDFlMyIsCisgICAgICAgICAgICAiXDFcdTAxZTQiLAorICAgICAgICAgICAgIlwxXHUwMWU1IiwKKyAgICAgICAgICAgICJcMVx1MDFlNiIsCisgICAgICAgICAgICAiXDFcdTAxZTciLAorICAgICAgICAgICAgIlwxXHUwMWU4IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAxZWEiLAorICAgICAgICAgICAgIlwxXHUwMWViIiwKKyAgICAgICAgICAgICJcMVx1MDFlYyIsCisgICAgICAgICAgICAiXDFcdTAxZWQiLAorICAgICAgICAgICAgIlwxXHUwMWVlIiwKKyAgICAgICAgICAgICJcMVx1MDFlZiIsCisgICAgICAgICAgICAiXDFcdTAxZjAiLAorICAgICAgICAgICAgIlwxXHUwMWYxIiwKKyAgICAgICAgICAgICJcMVx1MDFmMiIsCisgICAgICAgICAgICAiXDFcdTAxZjMiLAorICAgICAgICAgICAgIlwxXHUwMWY0IiwKKyAgICAgICAgICAgICJcMVx1MDFmNSIsCisgICAgICAgICAgICAiXDFcdTAxZjYiLAorICAgICAgICAgICAgIlwxXHUwMWY3IiwKKyAgICAgICAgICAgICJcMVx1MDFmOCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwyXDEwMlwxXHUwMWY5XDI3XDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDFmZCIsCisgICAgICAgICAgICAiXDFcdTAxZmUiLAorICAgICAgICAgICAgIlwxXHUwMWZmIiwKKyAgICAgICAgICAgICJcMVx1MDIwMCIsCisgICAgICAgICAgICAiXDFcdTAyMDEiLAorICAgICAgICAgICAgIlwxXHUwMjAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcNlx1ZmZmZlwxXHUwMjAzXDRcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmYiKworICAgICAgICAgICAgIlwxXDEwMlwxXHVmZmZmXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyMDUiLAorICAgICAgICAgICAgIlwxXHUwMjA2IiwKKyAgICAgICAgICAgICJcMVx1MDIwNyIsCisgICAgICAgICAgICAiXDFcdTAyMDgiLAorICAgICAgICAgICAgIlwxXHUwMjA5IiwKKyAgICAgICAgICAgICJcMVx1MDIwYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIwYiIsCisgICAgICAgICAgICAiXDFcdTAyMGMiLAorICAgICAgICAgICAgIlwxXHUwMjBkIiwKKyAgICAgICAgICAgICJcMVx1MDIwZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjBmXDNcdWZmZmZcMVx1MDIxMCIsCisgICAgICAgICAgICAiXDFcdTAyMTEiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDIxMyIsCisgICAgICAgICAgICAiXDFcdTAyMTQiLAorICAgICAgICAgICAgIlwxXHUwMjE1IiwKKyAgICAgICAgICAgICJcMVx1MDIxNiIsCisgICAgICAgICAgICAiXDFcdTAyMTciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMTgiLAorICAgICAgICAgICAgIlwxXHUwMjE5IiwKKyAgICAgICAgICAgICJcMVx1MDIxYSIsCisgICAgICAgICAgICAiXDFcdTAyMWIiLAorICAgICAgICAgICAgIlwxXHUwMjFjIiwKKyAgICAgICAgICAgICJcMVx1MDIxZCIsCisgICAgICAgICAgICAiXDFcdTAyMWUiLAorICAgICAgICAgICAgIlwxXHUwMjFmIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTBcdWZmZmZcMVx1MDIyMFwyXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxMDJcMVx1ZmZmZlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjIyIiwKKyAgICAgICAgICAgICJcMVx1MDIyMyIsCisgICAgICAgICAgICAiXDFcdTAyMjQiLAorICAgICAgICAgICAgIlwxXHUwMjI1IiwKKyAgICAgICAgICAgICJcMVx1MDIyNiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjI4IiwKKyAgICAgICAgICAgICJcMVx1MDIyOSIsCisgICAgICAgICAgICAiXDFcdTAyMmEiLAorICAgICAgICAgICAgIlwxXHUwMjJiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyMmQiLAorICAgICAgICAgICAgIlwxXHUwMjJlIiwKKyAgICAgICAgICAgICJcMVx1MDIyZiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjMxIiwKKyAgICAgICAgICAgICJcMVx1MDIzMiIsCisgICAgICAgICAgICAiXDFcdTAyMzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwyMlwxMDJcMVx1MDIzNFw3XDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyMzYiLAorICAgICAgICAgICAgIlwxXHUwMjM3IiwKKyAgICAgICAgICAgICJcMVx1MDIzOCIsCisgICAgICAgICAgICAiXDFcdTAyMzkiLAorICAgICAgICAgICAgIlwxXHUwMjNhIiwKKyAgICAgICAgICAgICJcMVx1MDIzYiIsCisgICAgICAgICAgICAiXDFcdTAyM2MiLAorICAgICAgICAgICAgIlwxXHUwMjNkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjNlXDEwNlx1ZmZmZlwxXHUwMjNmIiwKKyAgICAgICAgICAgICJcMVx1MDI0MCIsCisgICAgICAgICAgICAiXDFcdTAyNDEiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI0MyIsCisgICAgICAgICAgICAiXDFcdTAyNDQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNDUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjQ3IiwKKyAgICAgICAgICAgICJcMVx1MDI0OCIsCisgICAgICAgICAgICAiXDFcdTAyNDkiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMTRcMTAyXDFcdTAyNGFcMTVcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI0YyIsCisgICAgICAgICAgICAiXDFcdTAyNGQiLAorICAgICAgICAgICAgIlwxXHUwMjRlIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyNTAiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjUyIiwKKyAgICAgICAgICAgICJcMVx1MDI1MyIsCisgICAgICAgICAgICAiXDFcdTAyNTQiLAorICAgICAgICAgICAgIlwxXHUwMjU1IiwKKyAgICAgICAgICAgICJcMVx1MDI1NiIsCisgICAgICAgICAgICAiXDFcdTAyNTciLAorICAgICAgICAgICAgIlwxXHUwMjU4IiwKKyAgICAgICAgICAgICJcMVx1MDI1OSIsCisgICAgICAgICAgICAiXDFcdTAyNWEiLAorICAgICAgICAgICAgIlwxXHUwMjViIiwKKyAgICAgICAgICAgICJcMVx1MDI1YyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI1ZCIsCisgICAgICAgICAgICAiXDFcdTAyNWUiLAorICAgICAgICAgICAgIlwxXHUwMjVmIiwKKyAgICAgICAgICAgICJcMVx1MDI2MCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI2MyIsCisgICAgICAgICAgICAiXDFcdTAyNjQiLAorICAgICAgICAgICAgIlwxXHUwMjY1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjY2IiwKKyAgICAgICAgICAgICJcMVx1MDI2NyIsCisgICAgICAgICAgICAiXDFcdTAyNjgiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI2YSIsCisgICAgICAgICAgICAiXDFcdTAyNmIiLAorICAgICAgICAgICAgIlwxXHUwMjZjIiwKKyAgICAgICAgICAgICJcMVx1MDI2ZCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxNlwxMDJcMVx1MDI2ZVwxM1wxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjcwIiwKKyAgICAgICAgICAgICJcMVx1MDI3MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxXHUwMjc0XDFcMTAyXDFcdTAyNzNcMjdcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI3NiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjc4IiwKKyAgICAgICAgICAgICJcMVx1MDI3OSIsCisgICAgICAgICAgICAiXDFcdTAyN2EiLAorICAgICAgICAgICAgIlwxXHUwMjdiIiwKKyAgICAgICAgICAgICJcMVx1MDI3YyIsCisgICAgICAgICAgICAiXDFcdTAyN2QiLAorICAgICAgICAgICAgIlwxXHUwMjdlIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwyMlwxMDJcMVx1MDI4MFw3XDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyODIiLAorICAgICAgICAgICAgIlwxXHUwMjgzIiwKKyAgICAgICAgICAgICJcMVx1MDI4NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMjg2IiwKKyAgICAgICAgICAgICJcMVx1MDI4NyIsCisgICAgICAgICAgICAiXDFcdTAyODgiLAorICAgICAgICAgICAgIlwxXHUwMjg5IiwKKyAgICAgICAgICAgICJcMVx1MDI4YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjhiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjhjIiwKKyAgICAgICAgICAgICJcMVx1MDI4ZCIsCisgICAgICAgICAgICAiXDFcdTAyOGUiLAorICAgICAgICAgICAgIlwxXHUwMjhmIiwKKyAgICAgICAgICAgICJcMVx1MDI5MCIsCisgICAgICAgICAgICAiXDFcdTAyOTEiLAorICAgICAgICAgICAgIlwxXHUwMjkyIiwKKyAgICAgICAgICAgICJcMVx1MDI5MyIsCisgICAgICAgICAgICAiXDFcdTAyOTRcMTZcdWZmZmZcMVx1MDI5NSIsCisgICAgICAgICAgICAiXDFcdTAyOTYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjk4IiwKKyAgICAgICAgICAgICJcMVx1MDI5OSIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwyMlwxMDJcMVx1MDI5YVw3XDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyOWMiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDI5ZSIsCisgICAgICAgICAgICAiXDFcdTAyOWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMmExIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTBcdWZmZmZcMVx1MDJhMlwyXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxMDJcMVx1ZmZmZlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMmE0IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmE2IiwKKyAgICAgICAgICAgICJcMVx1MDJhNyIsCisgICAgICAgICAgICAiXDFcdTAyYTgiLAorICAgICAgICAgICAgIlwxXHUwMmE5IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyYWMiLAorICAgICAgICAgICAgIlwxXHUwMmFkIiwKKyAgICAgICAgICAgICJcMVx1MDJhZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyYjAiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmIyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmIzIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJiNSIsCisgICAgICAgICAgICAiXDFcdTAyYjYiLAorICAgICAgICAgICAgIlwxXHUwMmI3IiwKKyAgICAgICAgICAgICJcMVx1MDJiOCIsCisgICAgICAgICAgICAiXDFcdTAyYjkiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMjJcMTAyXDFcdTAyYmFcN1wxMDIiLAorICAgICAgICAgICAgIlwxXHUwMmJjIiwKKyAgICAgICAgICAgICJcMVx1MDJiZCIsCisgICAgICAgICAgICAiXDFcdTAyYmVcN1x1ZmZmZlwxXHUwMmJmIiwKKyAgICAgICAgICAgICJcMVx1MDJjMCIsCisgICAgICAgICAgICAiXDFcdTAyYzEiLAorICAgICAgICAgICAgIlwxXHUwMmMyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmMzIiwKKyAgICAgICAgICAgICJcMVx1MDJjNlwyXHVmZmZmXDFcdTAyYzVcMTRcdWZmZmZcMVx1MDJjNCIsCisgICAgICAgICAgICAiXDFcdTAyYzciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyYzgiLAorICAgICAgICAgICAgIlwxXHUwMmM5IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyY2IiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyY2MiLAorICAgICAgICAgICAgIlwxXHUwMmNkIiwKKyAgICAgICAgICAgICJcMVx1MDJjZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJjZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJkMCIsCisgICAgICAgICAgICAiXDFcdTAyZDEiLAorICAgICAgICAgICAgIlwxXHUwMmQyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDE0XDEwMlwxXHUwMmQzXDE1XDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyZDUiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDJkNyIsCisgICAgICAgICAgICAiXDFcdTAyZDgiLAorICAgICAgICAgICAgIlwxXHUwMmQ5IiwKKyAgICAgICAgICAgICJcMVx1MDJkYSIsCisgICAgICAgICAgICAiXDFcdTAyZGIiLAorICAgICAgICAgICAgIlwxXHUwMmRjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmRkIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmRmIiwKKyAgICAgICAgICAgICJcMVx1MDJlMCIsCisgICAgICAgICAgICAiXDFcdTAyZTEiLAorICAgICAgICAgICAgIlwxXHUwMmUyIiwKKyAgICAgICAgICAgICJcMVx1MDJlMyIsCisgICAgICAgICAgICAiXDFcdTAyZTQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZTUiLAorICAgICAgICAgICAgIlwxXHUwMmU2IiwKKyAgICAgICAgICAgICJcMVx1MDJlNyIsCisgICAgICAgICAgICAiXDFcdTAyZTgiLAorICAgICAgICAgICAgIlwxXHUwMmU5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmVhIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJlYyIsCisgICAgICAgICAgICAiXDFcdTAyZWQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZWUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDJmNCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZjciLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDJmOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAyZmUiLAorICAgICAgICAgICAgIlwxXHUwMmZmIiwKKyAgICAgICAgICAgICJcMVx1MDMwMCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlw1XDEwMlwxXHUwMzAzXDFcMTAyXDFcdTAzMDJcMTJcMTAyXDFcdTAzMDFcN1wxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzA1IiwKKyAgICAgICAgICAgICJcMVx1MDMwNiIsCisgICAgICAgICAgICAiXDFcdTAzMDciLAorICAgICAgICAgICAgIlwxXHUwMzA4IiwKKyAgICAgICAgICAgICJcMVx1MDMwOSIsCisgICAgICAgICAgICAiXDFcdTAzMGEiLAorICAgICAgICAgICAgIlwxXHUwMzBiIiwKKyAgICAgICAgICAgICJcMVx1MDMwYyIsCisgICAgICAgICAgICAiXDFcdTAzMGQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzBmIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDMxMiIsCisgICAgICAgICAgICAiXDFcdTAzMTMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMTQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDMxNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAzMTciLAorICAgICAgICAgICAgIlwxXHUwMzE4XDVcdWZmZmZcMVx1MDMxOSIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDMxYiIsCisgICAgICAgICAgICAiXDFcdTAzMWMiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzFmIiwKKyAgICAgICAgICAgICJcMVx1MDMyMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAzMjIiLAorICAgICAgICAgICAgIlwxXHUwMzIzIiwKKyAgICAgICAgICAgICJcMVx1MDMyNCIsCisgICAgICAgICAgICAiXDFcdTAzMjUiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzI3IiwKKyAgICAgICAgICAgICJcMVx1MDMyOCIsCisgICAgICAgICAgICAiXDFcdTAzMjkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMmEiLAorICAgICAgICAgICAgIlwxXHUwMzJiIiwKKyAgICAgICAgICAgICJcMVx1MDMyYyIsCisgICAgICAgICAgICAiXDFcdTAzMmQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzJlIiwKKyAgICAgICAgICAgICJcMVx1MDMyZiIsCisgICAgICAgICAgICAiXDFcdTAzMzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMzEiLAorICAgICAgICAgICAgIlwxXHUwMzMyIiwKKyAgICAgICAgICAgICJcMVx1MDMzMyIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDMzNiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzM4IiwKKyAgICAgICAgICAgICJcMVx1MDMzOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDMzYiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzNkIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzQwIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzQ0IiwKKyAgICAgICAgICAgICJcMVx1MDM0NSIsCisgICAgICAgICAgICAiXDFcdTAzNDYiLAorICAgICAgICAgICAgIlwxXHUwMzQ3IiwKKyAgICAgICAgICAgICJcMVx1MDM0OCIsCisgICAgICAgICAgICAiXDFcdTAzNDkiLAorICAgICAgICAgICAgIlwxXHUwMzRhIiwKKyAgICAgICAgICAgICJcMVx1MDM0YiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzRkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzRlIiwKKyAgICAgICAgICAgICJcMVx1MDM0ZiIsCisgICAgICAgICAgICAiXDFcdTAzNTAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM1MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzUyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzUzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDM1NSIsCisgICAgICAgICAgICAiXDFcdTAzNTYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDM1OCIsCisgICAgICAgICAgICAiXDFcdTAzNTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDM1YyIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzVlIiwKKyAgICAgICAgICAgICJcMVx1MDM1ZiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzYxIiwKKyAgICAgICAgICAgICJcMVx1MDM2MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM2MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzY0IiwKKyAgICAgICAgICAgICJcMVx1MDM2NSIsCisgICAgICAgICAgICAiXDFcdTAzNjYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzY4IiwKKyAgICAgICAgICAgICJcMVx1MDM2OSIsCisgICAgICAgICAgICAiXDFcdTAzNmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzNmIiLAorICAgICAgICAgICAgIlwxXHUwMzZjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzZlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzZmIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzczXDExXHVmZmZmXDFcdTAzNzRcNVx1ZmZmZlwxXHUwMzc1XDFcdWZmZmZcMVx1MDM3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM3NiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzc4IiwKKyAgICAgICAgICAgICJcMVx1MDM3OSIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzdiIiwKKyAgICAgICAgICAgICJcMVx1MDM3YyIsCisgICAgICAgICAgICAiXDFcdTAzN2QiLAorICAgICAgICAgICAgIlwxXHUwMzdlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzdmIiwKKyAgICAgICAgICAgICJcMVx1MDM4MCIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM4MyIsCisgICAgICAgICAgICAiXDFcdTAzODQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzODUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzODYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM4NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzODgiLAorICAgICAgICAgICAgIlwxXHUwMzg5IiwKKyAgICAgICAgICAgICJcMVx1MDM4YSIsCisgICAgICAgICAgICAiXDFcdTAzOGNcMTFcdWZmZmZcMVx1MDM4ZFw1XHVmZmZmXDFcdTAzOGVcMVx1ZmZmZlwxXHUwMzhiIiwKKyAgICAgICAgICAgICJcMVx1MDM4ZiIsCisgICAgICAgICAgICAiXDFcdTAzOTAiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM5MyIsCisgICAgICAgICAgICAiXDFcdTAzOTQiLAorICAgICAgICAgICAgIlwxXHUwMzk1IiwKKyAgICAgICAgICAgICJcMVx1MDM5NiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwMzk4IiwKKyAgICAgICAgICAgICJcMVx1MDM5OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAzOWIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzOWMiLAorICAgICAgICAgICAgIlwxXHUwMzlkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzOWUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzOWYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2ExIiwKKyAgICAgICAgICAgICJcMVx1MDNhMiIsCisgICAgICAgICAgICAiXDFcdTAzYTMiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDNhNSIsCisgICAgICAgICAgICAiXDFcdTAzYTYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYTciLAorICAgICAgICAgICAgIlwxXHUwM2E4IiwKKyAgICAgICAgICAgICJcMVx1MDNhOSIsCisgICAgICAgICAgICAiXDFcdTAzYWEiLAorICAgICAgICAgICAgIlwxXHUwM2FiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2FjIiwKKyAgICAgICAgICAgICJcMVx1MDNhZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYWYiLAorICAgICAgICAgICAgIlwxXHUwM2IwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2IyXDExXHVmZmZmXDFcdTAzYjNcNVx1ZmZmZlwxXHUwM2I0XDFcdWZmZmZcMVx1MDNiMSIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwM2I2IiwKKyAgICAgICAgICAgICJcMVx1MDNiNyIsCisgICAgICAgICAgICAiXDFcdTAzYjgiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYmEiLAorICAgICAgICAgICAgIlwxXHUwM2JiIiwKKyAgICAgICAgICAgICJcMVx1MDNiY1wxN1x1ZmZmZlwxXHUwM2JkIiwKKyAgICAgICAgICAgICJcMVx1MDNiZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNiZiIsCisgICAgICAgICAgICAiXDFcdTAzYzAiLAorICAgICAgICAgICAgIlwxXHUwM2MxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2MyIiwKKyAgICAgICAgICAgICJcMVx1MDNjMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2M0IiwKKyAgICAgICAgICAgICJcMVx1MDNjNSIsCisgICAgICAgICAgICAiXDFcdTAzYzYiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2M4IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNjYSIsCisgICAgICAgICAgICAiXDFcdTAzY2IiLAorICAgICAgICAgICAgIlwxXHUwM2NjIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwM2QwIiwKKyAgICAgICAgICAgICJcMVx1MDNkMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNkMiIsCisgICAgICAgICAgICAiXDFcdTAzZDMiLAorICAgICAgICAgICAgIlwxXHUwM2Q0IiwKKyAgICAgICAgICAgICJcMVx1MDNkNSIsCisgICAgICAgICAgICAiXDFcdTAzZDYiLAorICAgICAgICAgICAgIlwxXHUwM2Q3IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwyMlwxMDJcMVx1MDNkOVw3XDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZGMiLAorICAgICAgICAgICAgIlwxXHUwM2RkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZGUiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDNlMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNlMSIsCisgICAgICAgICAgICAiXDFcdTAzZTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwM2U1IiwKKyAgICAgICAgICAgICJcMVx1MDNlNiIsCisgICAgICAgICAgICAiXDFcdTAzZTciLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDNlOSIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZWQiLAorICAgICAgICAgICAgIlwxXHUwM2VlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNlZiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwM2YxIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcdTAzZjMiLAorICAgICAgICAgICAgIlwxXHUwM2Y0IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNmOCIsCisgICAgICAgICAgICAiXDFcdTAzZjkiLAorICAgICAgICAgICAgIlwxXHUwM2ZhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDNmYyIsCisgICAgICAgICAgICAiXDFcdTAzZmQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNmZSIsCisgICAgICAgICAgICAiXDFcdTAzZmYiLAorICAgICAgICAgICAgIlwxXHUwNDAwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDQwMyIsCisgICAgICAgICAgICAiXDFcdTA0MDQiLAorICAgICAgICAgICAgIlwxXHUwNDA1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwNDA3IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTA0MDkiLAorICAgICAgICAgICAgIlwxXHUwNDBiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwNDBmIiwKKyAgICAgICAgICAgICJcMVx1MDQxMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDQxMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwNDE2IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTNcdWZmZmZcMTJcMTAyXDdcdWZmZmZcMzJcMTAyXDRcdWZmZmZcMVwxMDJcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEwMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwNDE4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTA0MTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAyXDEzXHVmZmZmXDEyXDEwMlw3XHVmZmZmXDMyXDEwMlw0XHVmZmZmXDFcMTAyXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMDIiLAorICAgICAgICAgICAgIlwxXHUwNDFiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEwMlwxM1x1ZmZmZlwxMlwxMDJcN1x1ZmZmZlwzMlwxMDJcNFx1ZmZmZlwxXDEwMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTAyIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMV9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjFfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMV90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIxX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIxX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgREZBMjEgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIxOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIxX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjFfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIxX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIxX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBUX18xNjcgfCBUX18xNjggfCBUX18xNjkgfCBUX18xNzAgfCBUX18xNzEgfCBUX18xNzIgfCBUX18xNzMgfCBUX18xNzQgfCBUX18xNzUgfCBUX18xNzYgfCBUX18xNzcgfCBUX18xNzggfCBUX18xNzkgfCBUX18xODAgfCBUX18xODEgfCBUX18xODIgfCBUX18xODMgfCBUX18xODQgfCBUX18xODUgfCBUX18xODYgfCBUX18xODcgfCBUX18xODggfCBUX18xODkgfCBUX18xOTAgfCBUX18xOTEgfCBUX18xOTIgfCBUX18xOTMgfCBUX18xOTQgfCBUX18xOTUgfCBUX18xOTYgfCBUX18xOTcgfCBUX18xOTggfCBUX18xOTkgfCBUX18yMDAgfCBUX18yMDEgfCBUX18yMDIgfCBUX18yMDMgfCBUX18yMDQgfCBUX18yMDUgfCBUX18yMDYgfCBUX18yMDcgfCBUX18yMDggfCBUX18yMDkgfCBUX18yMTAgfCBUX18yMTEgfCBUX18yMTIgfCBUX18yMTMgfCBUX18yMTQgfCBUX18yMTUgfCBUX18yMTYgfCBUX18yMTcgfCBUX18yMTggfCBUX18yMTkgfCBUX18yMjAgfCBUX18yMjEgfCBUX18yMjIgfCBUX18yMjMgfCBUX18yMjQgfCBUX18yMjUgfCBUX18yMjYgfCBUX18yMjcgfCBUX18yMjggfCBUX18yMjkgfCBUX18yMzAgfCBUX18yMzEgfCBUX18yMzIgfCBUX18yMzMgfCBUX18yMzQgfCBUX18yMzUgfCBUX18yMzYgfCBUX18yMzcgfCBUX18yMzggfCBUX18yMzkgfCBUX18yNDAgfCBUX18yNDEgfCBUX18yNDIgfCBUX18yNDMgfCBUX18yNDQgfCBUX18yNDUgfCBUX18yNDYgfCBUX18yNDcgfCBUX18yNDggfCBUX18yNDkgfCBUX18yNTAgfCBUX18yNTEgfCBUX18yNTIgfCBUX18yNTMgfCBUX18yNTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09Jz0nKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfCcpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScmJykgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2MnKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZCcpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdhJykgKSB7cyA9IDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JysnKSApIHtzID0gNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLScpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScqJykgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy8nKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyUnKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyEnKSApIHtzID0gMTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz4nKSApIHtzID0gMTM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzwnKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy4nKSApIHtzID0gMTU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz8nKSApIHtzID0gMTY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3YnKSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3MnKSApIHtzID0gMTk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2knKSApIHtzID0gMjA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2YnKSApIHtzID0gMjE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J20nKSApIHtzID0gMjI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3AnKSApIHtzID0gMjM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3UnKSApIHtzID0gMjQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2wnKSApIHtzID0gMjU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J24nKSApIHtzID0gMjY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J28nKSApIHtzID0gMjc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3InKSApIHtzID0gMjg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2cnKSApIHtzID0gMjk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2gnKSApIHtzID0gMzA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2InKSApIHtzID0gMzE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3QnKSApIHtzID0gMzI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3snKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J30nKSApIHtzID0gMzQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JygnKSApIHtzID0gMzU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gMzY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0AnKSApIHtzID0gMzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JywnKSApIHtzID0gMzg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J10nKSApIHtzID0gMzk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gNDA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1snKSApIHtzID0gNDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gNDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gNDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3cnKSApIHtzID0gNDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzAnKSApIHtzID0gNDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PScxJyAmJiBMQTIxXzA8PSc5JykpICkge3MgPSA0Njt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXicpICkge3MgPSA0Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdaJyl8fExBMjFfMD09J18nfHwoTEEyMV8wPj0naicgJiYgTEEyMV8wPD0naycpfHxMQTIxXzA9PSdxJ3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDQ4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA0OTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdCcgJiYgTEEyMV8wPD0nXG4nKXx8TEEyMV8wPT0nXHInfHxMQTIxXzA9PScgJykgKSB7cyA9IDUxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorIAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjdmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDE1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbDsgCisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW0uSGlkZGVuVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkRGQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJ2aWNlcy5SZXBvcnREU0xHcmFtbWFyQWNjZXNzOworCisKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQoraW50ZXJmYWNlIEludGVybmFsUmVwb3J0RFNMUGFyc2VyU2lnbmF0dXJlcyB7CisgICAgIHZvaWQgZW50cnlSdWxlUmVwb3J0TW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlcG9ydE1vZGVsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVJlcG9ydFBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlcG9ydFBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlUGFnZVRlbXBsYXRlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUGFnZVRlbXBsYXRlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVTb21lRm9ybWF0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlU29tZUZvcm1hdHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlQ29sb3JzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVDb2xvcnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlRm9udHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUZvbnRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU1lZGlhcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlTWVkaWFzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU1lZGlhKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVNZWRpYSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVTdHlsZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVN0eWxlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVQYWdlVGVtcGxhdGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVBhZ2VUZW1wbGF0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVVbnNpZ25lZE51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVW5zaWduZWROdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlQ29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUNvbG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUZvbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUZvbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVCdWlsZEluRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlQnVpbGRJbkZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlQ3VzdG9tRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlQ3VzdG9tRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVCb3JkZXJTdHlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlQm9yZGVyU3R5bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlU3R5bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVN0eWxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU1lZGlhU3R5bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZU1lZGlhU3R5bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlU29tZUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlU29tZUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVVb21vRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVVb21vRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU51bWJlckZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlTnVtYmVyRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUN1cnJlbmN5Rm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVDdXJyZW5jeUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVEYXRlRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVEYXRlRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZURhdGVUaW1lRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVEYXRlVGltZUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUaW1lRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUaW1lRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVJlcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUmVwb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVJlcG9ydERlc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUmVwb3J0RGVzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVJlcG9ydERlc2lnbkZpbGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlcG9ydERlc2lnbkZpbGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlUmVwb3J0RGVzaWduVGVtcGxhdGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlcG9ydERlc2lnblRlbXBsYXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVBhZ2VIZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVBhZ2VIZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlUGFnZURldGFpbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUGFnZURldGFpbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVQYWdlRm9vdGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVQYWdlRm9vdGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUVsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUVsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlR3JpZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlR3JpZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVHcmlkUm93KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVHcmlkUm93KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUdyaWRDZWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVHcmlkQ2VsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVEYXRhbWFydFRhYmxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVEYXRhbWFydFRhYmxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVHcm91cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRGF0YW1hcnRUYWJsZUdyb3VwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVEZXRhaWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZURhdGFtYXJ0VGFibGVEZXRhaWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVEYXRhbWFydFRhYmxlUHJvcGVydHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVJbWFnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVJbWFnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZVZhbHVlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVWYWx1ZUVsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVQcm9wZXJ0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVQcm9wZXJ0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZUFnZ3JlZ2F0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZUFnZ3JlZ2F0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZVB1cmVBZ2dyZWdhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVQdXJlQWdncmVnYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZVVuYXJ5QWdncmVnYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZUludGVydmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZUludGVydmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlTnVtYmVySW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRhYmxlTnVtYmVySW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVEYXRlRGF5SW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRhYmxlRGF0ZURheUludGVydmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlTG9va3VwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZUxvb2t1cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZU51bWJlckxvb2t1cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVOdW1iZXJMb29rdXAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVTdHJpbmdMb29rdXAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRhYmxlU3RyaW5nTG9va3VwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlRGF0ZURheUxvb2t1cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVEYXRlRGF5TG9va3VwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlUmFuZ2VFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVUYWJsZVJhbmdlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVTaWduZWROdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVNpZ25lZE51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVUYWJsZVRleHRDb2xvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVUZXh0Q29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGFibGVDZWxsQ29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRhYmxlQ2VsbENvbG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlSWNvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGFibGVJY29uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRhYmxlVHJlbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRhYmxlVHJlbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlVGl0bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRpdGxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVN1YlRpdGxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVTdWJUaXRsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVTdWJTdWJUaXRsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlU3ViU3ViVGl0bGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlTGFiZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUxhYmVsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRleHQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRleHQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlQXV0b1RleHQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUF1dG9UZXh0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUltYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVJbWFnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVSZXBvcnRJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlcG9ydEltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQW5ub3RhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlT3BTaW5nbGVBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhBbmRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVPcEFuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlT3BPdGhlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlT3BPdGhlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wQWRkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYVW5hcnlPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWENhc3RlZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhQb3N0Zml4T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU9wUG9zdGZpeCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWE1lbWJlckZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFByaW1hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYU2V0TGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFNldExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWExpc3RMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWENsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYU2hvcnRDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhJZkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhJZkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhDYXNlUGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWENhc2VQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhCbG9ja0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWEZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlRmVhdHVyZUNhbGxJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRmVhdHVyZUNhbGxJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVJZE9yU3VwZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYQ29uc3RydWN0b3JDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWEJvb2xlYW5MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWE51bGxMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYVHlwZUxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFRocm93RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWFJldHVybkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVhDYXRjaENsYXVzZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZU51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlQXJyYXlCcmFja2V0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlQXJyYXlCcmFja2V0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVYRnVuY3Rpb25UeXBlUmVmKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVKdm1VcHBlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBlbnRyeVJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlWEltcG9ydERlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVVbml0RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlUGFnZVNpemVFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVPcmllbnRhdGlvbkVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUZvbnRTdHlsZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVGV4dEFsaWduRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVJlbmRlcmluZ0VudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZVB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlVHJlbmRJY29uRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlQm9yZGVyVHlwZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZUF1dG9UZXh0RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlSW1hZ2VTaXplRW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlSW1hZ2VTb3VyY2VFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19BbHRlcm5hdGl2ZXNfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250RmFtaWx5X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU29tZUZvcm1hdF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0VsZW1lbnRfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19BbHRlcm5hdGl2ZXNfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVZhbHVlRWxlbWVudF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQmFzZUFnZ3JlZ2F0aW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbnRlcnZhbF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTG9va3VwX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVSYW5nZUVsZW1lbnRfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMV8wXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVW5pdEVudW1fX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlU2l6ZUVudW1fX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcmllbnRhdGlvbkVudW1fX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250U3R5bGVFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQnVpbGRJbkZvbnRGYW1pbHlFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGV4dEFsaWduRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdENhdGVnb3J5RW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVuZGVyaW5nRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1B1cmVBZ2dyZWdhdGlvblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVHJlbmRJY29uRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0JvcmRlclR5cGVFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQXV0b1RleHRFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VTaXplRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ltYWdlU291cmNlRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81X184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfXzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV9fOV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fR3JvdXBfNV8yX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0dyb3VwXzVfMl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19Hcm91cF81XzJfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVzX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVzX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVzX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVzX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU29tZUZvcm1hdHNfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1NvbWVGb3JtYXRzX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Tb21lRm9ybWF0c19fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JzX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcnNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yc19fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JzX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcnNfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yc19fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JzX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcnNfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yc19fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JzX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250c19fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udHNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRzX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250c19fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udHNfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRzX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250c19fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udHNfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRzX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250c19fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFzX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYXNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhc19fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFzX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYXNfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhc19fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFzX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYXNfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhc19fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFzX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVzX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZXNfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlc19fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVzX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZXNfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlc19fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVzX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZXNfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlc19fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVzX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX0dyb3VwX185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fR3JvdXBfXzlfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMThfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMTlfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Hcm91cF9fMjFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzFfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMV9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8yX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzJfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfMl9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8zX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fR3JvdXBfMl8zX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yX19Hcm91cF8yXzNfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0dyb3VwXzJfM19fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfMF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfMF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wXzRfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfMF80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzBfNF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8wXzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8zXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfM18wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzNfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fR3JvdXBfM18wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX0dyb3VwXzNfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Cb3JkZXJTdHlsZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0JvcmRlclN0eWxlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Cb3JkZXJTdHlsZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0JvcmRlclN0eWxlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Cb3JkZXJTdHlsZV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8yX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzJfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8yXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfMl8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzJfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzRfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfNF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF80X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF82X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzdfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfN19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF83X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzdfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfOF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF84X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzhfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfOF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF85X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzlfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfOV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF85X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Hcm91cF80XzlfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0dyb3VwXzRfOV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzJfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18yX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMl8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzRfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM180X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfNF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM181X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM181X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM182X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzdfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM183X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfN19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzdfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM184X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfOF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzhfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM184X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfOV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzlfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM185X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfOV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzlfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM185X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzExX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzExX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEyX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEyX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEzX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzEzX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTRfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE0X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE0X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTVfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE1X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE1X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTZfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE2X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0dyb3VwXzNfMTZfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fR3JvdXBfM18xNl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Hcm91cF8zXzE2X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fR3JvdXBfXzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19Hcm91cF9fOV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX0dyb3VwX18xMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fR3JvdXBfXzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19Hcm91cF9fMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ3VycmVuY3lGb3JtYXRfX0dyb3VwX18xMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fOV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19Hcm91cF9fMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZUZvcm1hdF9fR3JvdXBfXzEwX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzlfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX0dyb3VwX18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlVGltZUZvcm1hdF9fR3JvdXBfXzEwX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX184X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX0dyb3VwX18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaW1lRm9ybWF0X19Hcm91cF9fMTBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEwX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzExKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzExX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEyX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzEzX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzE0X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfXzE1X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfOV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwXzlfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fR3JvdXBfOV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0dyb3VwXzlfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85XzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85XzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85XzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19Hcm91cF85XzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduRmlsZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduRmlsZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduRmlsZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduRmlsZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZF9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZFJvd19fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkUm93X19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZFJvd19fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkUm93X19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZFJvd19fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfM18xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF8zXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF80XzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBfNF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0dyb3VwXzRfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Hcm91cF80XzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fN19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwX185X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF82X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzZfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzZfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzZfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzZfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzdfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fR3JvdXBfN19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0dyb3VwXzdfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83XzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83XzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83XzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cF83XzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJfX0dyb3VwXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcl9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwXzNfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8zXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX0dyb3VwXzNfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlRGV0YWlsX19Hcm91cF8zXzFfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fR3JvdXBfM18xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzJfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Hcm91cF8xXzNfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfM18yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSW1hZ2VfX0dyb3VwXzNfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUltYWdlX19Hcm91cF8zXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fR3JvdXBfM18yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlUHJvcGVydHlfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlUHJvcGVydHlfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlUHJvcGVydHlfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlUHJvcGVydHlfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwXzJfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fR3JvdXBfMl8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19Hcm91cF8yXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fR3JvdXBfMl8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX0dyb3VwXzJfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19Hcm91cF8yXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVVbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVVuYXJ5QWdncmVnYXRpb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVVbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVVuYXJ5QWdncmVnYXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVEYXRlRGF5SW50ZXJ2YWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUludGVydmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVEYXRlRGF5SW50ZXJ2YWxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUludGVydmFsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVEYXRlRGF5SW50ZXJ2YWxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckxvb2t1cF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVOdW1iZXJMb29rdXBfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckxvb2t1cF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVOdW1iZXJMb29rdXBfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckxvb2t1cF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVTdHJpbmdMb29rdXBfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlU3RyaW5nTG9va3VwX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVN0cmluZ0xvb2t1cF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVTdHJpbmdMb29rdXBfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlU3RyaW5nTG9va3VwX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVN0cmluZ0xvb2t1cF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVTdHJpbmdMb29rdXBfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlU3RyaW5nTG9va3VwX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlMb29rdXBfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUxvb2t1cF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVEYXRlRGF5TG9va3VwX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlMb29rdXBfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUxvb2t1cF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVEYXRlRGF5TG9va3VwX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlMb29rdXBfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUxvb2t1cF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVRleHRDb2xvcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUZXh0Q29sb3JfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlVGV4dENvbG9yX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVRleHRDb2xvcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVDZWxsQ29sb3JfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQ2VsbENvbG9yX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUNlbGxDb2xvcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVDZWxsQ29sb3JfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSWNvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJY29uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUljb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSWNvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUcmVuZF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUcmVuZF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUcmVuZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUcmVuZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGl0bGVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpdGxlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGl0bGVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpdGxlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGl0bGVfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpdGxlX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJUaXRsZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViVGl0bGVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJUaXRsZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViVGl0bGVfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJUaXRsZV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViVGl0bGVfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlRpdGxlX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlN1YlRpdGxlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJTdWJUaXRsZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlN1YlRpdGxlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJTdWJUaXRsZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N1YlN1YlRpdGxlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJTdWJUaXRsZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3ViU3ViVGl0bGVfX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTGFiZWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0xhYmVsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTGFiZWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0xhYmVsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTGFiZWxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0xhYmVsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RleHRfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGV4dF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BdXRvVGV4dF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQXV0b1RleHRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BdXRvVGV4dF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQXV0b1RleHRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0F1dG9UZXh0X19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ltYWdlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ltYWdlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ltYWdlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ltYWdlX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19JbWFnZV9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRJbXBvcnRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydEltcG9ydF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0SW1wb3J0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRJbXBvcnRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X184KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X185KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fVW5vcmRlcmVkR3JvdXBfNF9fMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzRfXzEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18xMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fVW5vcmRlcmVkR3JvdXBfNF9fMTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzRfXzE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fVW5vcmRlcmVkR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fVW5vcmRlcmVkR3JvdXBfM19fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzNfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fVW5vcmRlcmVkR3JvdXBfM19fNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzNfXzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fVW5vcmRlcmVkR3JvdXBfM19fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Vbm9yZGVyZWRHcm91cF8zX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX1Vub3JkZXJlZEdyb3VwXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Vbm9yZGVyZWRHcm91cF8xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fVW5vcmRlcmVkR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX1Vub3JkZXJlZEdyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Vbm9yZGVyZWRHcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fVW5vcmRlcmVkR3JvdXBfMV9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUltYWdlX19Vbm9yZGVyZWRHcm91cF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSW1hZ2VfX1Vub3JkZXJlZEdyb3VwXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fVW5vcmRlcmVkR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUltYWdlX19Vbm9yZGVyZWRHcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSW1hZ2VfX1Vub3JkZXJlZEdyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fVW5vcmRlcmVkR3JvdXBfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUFnZ3JlZ2F0aW9uX19Vbm9yZGVyZWRHcm91cF8yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQWdncmVnYXRpb25fX1Vub3JkZXJlZEdyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fVW5vcmRlcmVkR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRNb2RlbF9fUGNrZ0Fzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0V4dGVybmFsQ3NzVVJJQXNzaWdubWVudF81XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19FeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfNV8yXzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRQYWNrYWdlX19QYWdldGVtcGxhdGVzQXNzaWdubWVudF81XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fRm9ybWF0dGVyc0Fzc2lnbm1lbnRfNV80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0NvbG9yc0Fzc2lnbm1lbnRfNV81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydFBhY2thZ2VfX0ZvbnRzQXNzaWdubWVudF81XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fTWVkaWFzQXNzaWdubWVudF81XzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fU3R5bGVzQXNzaWdubWVudF81XzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0UGFja2FnZV9fUmVwb3J0c0Fzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVzX19QYWdldGVtcGxhdGVzQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1NvbWVGb3JtYXRzX19Gb3JtYXR0ZXJzQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0NvbG9yc19fQ29sb3JzQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRzX19Gb250c0Fzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYXNfX01lZGlhc0Fzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYV9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZXNfX1N0eWxlc0Fzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19TaXplQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fT3JpZW50YXRpb25Bc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19Ub3BNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX1RvcE1hcmdpblVuaXRBc3NpZ25tZW50XzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19MZWZ0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzExKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fTGVmdE1hcmdpblVuaXRBc3NpZ25tZW50XzEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fQm90dG9tTWFyZ2luVmFsdWVBc3NpZ25tZW50XzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fQm90dG9tTWFyZ2luVW5pdEFzc2lnbm1lbnRfMTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19SaWdodE1hcmdpblZhbHVlQXNzaWdubWVudF8xNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlVGVtcGxhdGVfX1JpZ2h0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZVRlbXBsYXRlX19IZWFkZXJBc3NpZ25tZW50XzE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VUZW1wbGF0ZV9fRm9vdGVyQXNzaWdubWVudF8yMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fQ29sb3JBc3NpZ25tZW50XzJfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fRGFya2Vuc2J5QXNzaWdubWVudF8yXzFfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fQmFzZWNvbG9yQXNzaWdubWVudF8yXzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Db2xvcl9fTGlnaHRlbnNieUFzc2lnbm1lbnRfMl8yXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX1RyYW5zZm9ybXNieUFzc2lnbm1lbnRfMl8zXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQ29sb3JfX1RhcmdldGNvbG9yQXNzaWdubWVudF8yXzNfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19OYW1lQXNzaWdubWVudF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fRXh0ZW5kc0Fzc2lnbm1lbnRfMF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fRmFtaWx5QXNzaWdubWVudF8wXzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19TdHlsZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Gb250X19Cb2xkQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0ZvbnRfX1NpemV2YWx1ZUFzc2lnbm1lbnRfM18wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRm9udF9fU2l6ZXVuaXRBc3NpZ25tZW50XzNfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0J1aWxkSW5Gb250RmFtaWx5X19DdXN0b21Bc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1c3RvbUZvbnRGYW1pbHlfX0N1c3RvbUFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX1R5cGVBc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX1dpZHRodmFsdWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQm9yZGVyU3R5bGVfX1dpZHRodW5pdEFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Cb3JkZXJTdHlsZV9fQ29sb3JBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0V4dGVuZHNBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fRm9ybWF0QXNzaWdubWVudF80XzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fRm9udEFzc2lnbm1lbnRfNF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfNF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzRfMl8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1RleHRjb2xvckFzc2lnbm1lbnRfNF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1RleHRhbGlnbkFzc2lnbm1lbnRfNF80XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0JvcmRlclRvcEFzc2lnbm1lbnRfNF81XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0JvcmRlckJvdHRvbUFzc2lnbm1lbnRfNF82XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX0JvcmRlckxlZnRBc3NpZ25tZW50XzRfN18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19Cb3JkZXJSaWdodEFzc2lnbm1lbnRfNF84XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfNF85XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdUb3BVbml0QXNzaWdubWVudF80XzlfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fUGFkZGluZ0JvdHRvbVZhbHVlQXNzaWdubWVudF80XzEwXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdCb3R0b21Vbml0QXNzaWdubWVudF80XzEwXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzRfMTFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fUGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF80XzExXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdSaWdodFZhbHVlQXNzaWdubWVudF80XzEyXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX1BhZGRpbmdSaWdodFVuaXRBc3NpZ25tZW50XzRfMTJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fTWFyZ2luVG9wVmFsdWVBc3NpZ25tZW50XzRfMTNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdHlsZV9fTWFyZ2luVG9wVW5pdEFzc2lnbm1lbnRfNF8xM18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19NYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfNF8xNF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19NYXJnaW5Cb3R0b21Vbml0QXNzaWdubWVudF80XzE0XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX01hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xNV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19NYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfNF8xNV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19NYXJnaW5SaWdodFZhbHVlQXNzaWdubWVudF80XzE2XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fU3R5bGVfX01hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xNl8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1N0eWxlX19NZWRpYXN0eWxlc0Fzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NZWRpYUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Gb3JtYXRBc3NpZ25tZW50XzNfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0ZvbnRBc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfM18yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUFzc2lnbm1lbnRfM18yXzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19UZXh0Y29sb3JBc3NpZ25tZW50XzNfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1RleHRhbGlnbkFzc2lnbm1lbnRfM180XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTWVkaWFTdHlsZV9fQm9yZGVyVG9wQXNzaWdubWVudF8zXzVfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19Cb3JkZXJCb3R0b21Bc3NpZ25tZW50XzNfNl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0JvcmRlckxlZnRBc3NpZ25tZW50XzNfN18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX0JvcmRlclJpZ2h0QXNzaWdubWVudF8zXzhfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nVG9wVmFsdWVBc3NpZ25tZW50XzNfOV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1BhZGRpbmdUb3BVbml0QXNzaWdubWVudF8zXzlfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nQm90dG9tVW5pdEFzc2lnbm1lbnRfM18xMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzNfMTFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nTGVmdFVuaXRBc3NpZ25tZW50XzNfMTFfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19QYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfM18xMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX1BhZGRpbmdSaWdodFVuaXRBc3NpZ25tZW50XzNfMTJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NYXJnaW5Ub3BWYWx1ZUFzc2lnbm1lbnRfM18xM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX01hcmdpblRvcFVuaXRBc3NpZ25tZW50XzNfMTNfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xNF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NYXJnaW5MZWZ0VmFsdWVBc3NpZ25tZW50XzNfMTVfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfM18xNV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX01lZGlhU3R5bGVfX01hcmdpblJpZ2h0VmFsdWVBc3NpZ25tZW50XzNfMTZfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19NZWRpYVN0eWxlX19NYXJnaW5SaWdodFVuaXRBc3NpZ25tZW50XzNfMTZfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Vb21vRm9ybWF0X19OYW1lQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1VvbW9Gb3JtYXRfX1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVW9tb0Zvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVW9tb0Zvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF84KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX051bWJlckZvcm1hdF9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19SZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fTnVtYmVyRm9ybWF0X19SZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19OdW1iZXJGb3JtYXRfX1RleHRhbGlnbkFzc2lnbm1lbnRfOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fVWlfcGF0dGVybkFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0N1cnJlbmN5Rm9ybWF0X19SZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19DdXJyZW5jeUZvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF85KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVGb3JtYXRfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZUZvcm1hdF9fVWlfcGF0dGVybkFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRlRm9ybWF0X19SZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZUZvcm1hdF9fUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZUZvcm1hdF9fVGV4dGFsaWduQXNzaWdubWVudF85KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19OYW1lQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19VaV9wYXR0ZXJuQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19SZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0ZVRpbWVGb3JtYXRfX1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGVUaW1lRm9ybWF0X19UZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGltZUZvcm1hdF9fTmFtZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaW1lRm9ybWF0X19VaV9wYXR0ZXJuQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RpbWVGb3JtYXRfX1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaW1lRm9ybWF0X19SZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaW1lRm9ybWF0X19UZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19OYW1lQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fRGVzY3JpcHRpb25Bc3NpZ25tZW50XzJfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX1Rvb2xiYXJBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0RhdGFtYXJ0UmVmQXNzaWdubWVudF82KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fUmVuZGVyaW5nQXNzaWdubWVudF84KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydF9fRXh0ZXJuYWxDc3NVUklBc3NpZ25tZW50XzlfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX0V4dGVybmFsQ3NzVVJJQnVuZGxlQXNzaWdubWVudF85XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnRfX1BhZ2VUZW1wbGF0ZUFzc2lnbm1lbnRfMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19NZWRpYUFzc2lnbm1lbnRfMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0X19EZXNpZ25Bc3NpZ25tZW50XzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnbkZpbGVfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUmVwb3J0RGVzaWduVGVtcGxhdGVfX0hlYWRlckFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19SZXBvcnREZXNpZ25UZW1wbGF0ZV9fRGV0YWlsQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydERlc2lnblRlbXBsYXRlX19Gb290ZXJBc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZUhlYWRlcl9fU2hvd09uRmlyc3RBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZUhlYWRlcl9fSGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZUhlYWRlcl9fSGVpZ2h0VW5pdEFzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlSGVhZGVyX19FbGVtZW50c0Fzc2lnbm1lbnRfNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRGV0YWlsX19FbGVtZW50c0Fzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19QYWdlRm9vdGVyX19TaG93T25MYXN0QXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VGb290ZXJfX0hlaWdodFZhbHVlQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1BhZ2VGb290ZXJfX0hlaWdodFVuaXRBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fUGFnZUZvb3Rlcl9fRWxlbWVudHNBc3NpZ25tZW50XzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZF9fTmFtZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRfX1Jvd3NBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZFJvd19fTmFtZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRSb3dfX1N0eWxlQXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZFJvd19fQ2VsbHNBc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fR3JpZENlbGxfX05hbWVBc3NpZ25tZW50XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19HcmlkQ2VsbF9fQ29sdW1uc3BhbkFzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0dyaWRDZWxsX19FbGVtZW50c0Fzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19TdHlsZUFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0RldGFpbGhlYWRlckFzc2lnbm1lbnRfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0hlYWRlcnN0eWxlQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19EZXRhaWxmb290ZXJBc3NpZ25tZW50XzRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlX19Gb290ZXJzdHlsZUFzc2lnbm1lbnRfNF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZV9fR3JvdXBzQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVfX0RldGFpbEFzc2lnbm1lbnRfNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Hcm91cGluZ1JlZkFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0hlYWRlckFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBfX0RldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fSGVhZGVyc3R5bGVBc3NpZ25tZW50XzZfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cF9fRGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Gb290ZXJzdHlsZUFzc2lnbm1lbnRfN18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwX19Gb290ZXJBc3NpZ25tZW50XzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyX19TdHlsZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcl9fUm93c0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJfX1N0eWxlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyX19Sb3dzQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVEZXRhaWxfX1N0eWxlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZURldGFpbF9fQ29sdW1uRm9ybWF0dGVyc0Fzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19Db2x1bW5Bc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19TdHlsZUFzc2lnbm1lbnRfMV8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19IYXNJbWFnZUFzc2lnbm1lbnRfMV8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19JbWFnZUFzc2lnbm1lbnRfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19IaWRlTGFiZWxJbnRlcnZhbEFzc2lnbm1lbnRfMV8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRGF0YW1hcnRUYWJsZVByb3BlcnR5X19JbnRlcnZhbHNBc3NpZ25tZW50XzFfMl8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fSGlkZUxhYmVsTG9va3VwQXNzaWdubWVudF8xXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19EYXRhbWFydFRhYmxlUHJvcGVydHlfX0xvb2t1cHNBc3NpZ25tZW50XzFfM18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSW1hZ2VfX0ltYWdlUGF0aFBhdHRlcm5Bc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fSGFzUGFyYW1ldGVyQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVJbWFnZV9fSGlkZUltYWdlTGFiZWxBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUltYWdlX19SZXNpemVBc3NpZ25tZW50XzNfMl8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlSW1hZ2VfX1Jlc2l6ZVN0cmluZ0Fzc2lnbm1lbnRfM18yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVQcm9wZXJ0eV9fVmFsdWVSZWZBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fQWdncmVnYXRpb25Bc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fT25Hcm91cEFzc2lnbm1lbnRfMl8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVBZ2dyZWdhdGlvbl9fVGV4dEFzc2lnbm1lbnRfMl8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVQdXJlQWdncmVnYXRpb25fX0FnZ3JlZ2F0aW9uQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZVVuYXJ5QWdncmVnYXRpb25fX0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlVW5hcnlBZ2dyZWdhdGlvbl9fVmFsdWVSZWZzQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbl9fQWdncmVnYXRpb25Bc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX19WYWx1ZVJlZnNBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9fQWdncmVnYXRpb25Bc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9fVmFsdWVSZWZzQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQmluYXJ5QWdncmVnYXRpb25fX1ZhbHVlUmVmc0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckludGVydmFsX19OdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTnVtYmVySW50ZXJ2YWxfX051bWJlclJhbmdlQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUludGVydmFsX19EYXRlSW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlJbnRlcnZhbF9fRGF0ZVJhbmdlQXNzaWdubWVudF8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlTnVtYmVyTG9va3VwX19Mb29rdXBWYWx1ZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZU51bWJlckxvb2t1cF9fRGlzY3JldGVBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVTdHJpbmdMb29rdXBfX0xvb2t1cFZhbHVlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlU3RyaW5nTG9va3VwX19EaXNjcmV0ZUFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZURhdGVEYXlMb29rdXBfX0xvb2t1cFZhbHVlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlRGF0ZURheUxvb2t1cF9fRGlzY3JldGVBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUZXh0Q29sb3JfX0NvbG9yQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RhYmxlQ2VsbENvbG9yX19Db2xvckFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UYWJsZUljb25fX0ljb25Bc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fVGFibGVUcmVuZF9fSWNvbkFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fVGV4dEFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UaXRsZV9fU3R5bGVBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJUaXRsZV9fVGV4dEFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJUaXRsZV9fU3R5bGVBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJTdWJUaXRsZV9fVGV4dEFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19TdWJTdWJUaXRsZV9fU3R5bGVBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fVGV4dEFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19MYWJlbF9fU3R5bGVBc3NpZ25tZW50XzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19UZXh0X19UZXh0QXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1RleHRfX1N0eWxlQXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQXV0b1RleHRfX1R5cGVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fQXV0b1RleHRfX1N0eWxlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX1NpemVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX1NjYWxlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX1NvdXJjZVR5cGVBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSW1hZ2VfX0ZpbGVuYW1lQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1JlcG9ydEltcG9ydF9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8xXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgICAgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMV8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOworICAgICB2b2lkIHN5bnByZWQzM19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ2MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNjFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDc0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ4Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkODNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDk2X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQxMDBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDEwMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMTA3X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyNTJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI1NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjU1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyNTZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI1N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjU4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyNTlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI2MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjYxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyNjJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI2M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjY1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyNjZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI3NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjgxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQyODRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDI5N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMjk4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMDJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMwM19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzA0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMxMF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzExX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMTJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMxNF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzE4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMjBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMyMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzI4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMjlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMzMF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzMxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzM0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMzVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMzNl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzM3X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzMzhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDMzOV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzQwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNDFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM0Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzQzX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNDRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM0NV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzQ2X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNDdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM0OF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzQ5X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNTBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM1MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzUyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNTNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM1NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzU1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNTZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM1N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzU4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNTlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM2MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzYxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNjJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM2M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzY0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNjVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM2Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzY3X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNjhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM2OV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzcwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNzFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM3Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzczX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNzRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM3NV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzc2X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzNzdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM3OF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzc5X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzODBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM4MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzgyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzODNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM4NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzg1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzODZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM4N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzg4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzODlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM5MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzkxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzOTJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM5M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzk0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzOTVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM5Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkMzk3X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQzOThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDM5OV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNDAwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ0MDFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDQwMl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNDAzX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ0MDRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDQwNV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNDA2X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ0MDdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDQwOF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNDA5X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ0MTBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDQxMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKKyAgICAgdm9pZCBzeW5wcmVkNDEyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOyAgIAorICAgICB2b2lkIHN5bnByZWQ0MTNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247ICAgCisgICAgIHZvaWQgc3lucHJlZDQxNF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgICAKK30KKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCithYnN0cmFjdCBjbGFzcyBJbnRlcm5hbFJlcG9ydERTTFBhcnNlcjEgZXh0ZW5kcyBBYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlciBpbXBsZW1lbnRzIEludGVybmFsUmVwb3J0RFNMUGFyc2VyU2lnbmF0dXJlcyB7CisKKyAgICAgICAgSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIxKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgICAgICB9CisKKyAgICAgICAgSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIxKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiUlVMRV9TVFJJTkciLCAiUlVMRV9JRCIsICJSVUxFX0hFWCIsICJSVUxFX0lOVCIsICJSVUxFX0RFQ0lNQUwiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIsICJSVUxFX1dTIiwgIlJVTEVfQU5ZX09USEVSIiwgIic9JyIsICInfHwnIiwgIicmJiciLCAiJ2N1c3RvbSciLCAiJ2RpdmlkZSciLCAiJ2NvbmNhdCciLCAiJ2FsbCciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic9PSciLCAiJyE9JyIsICInPT09JyIsICInIT09JyIsICInPj0nIiwgIic+JyIsICInPCciLCAiJy0+JyIsICInLi48JyIsICInLi4nIiwgIic9PiciLCAiJzw+JyIsICInPzonIiwgIicrJyIsICInLSciLCAiJyonIiwgIicqKiciLCAiJy8nIiwgIiclJyIsICInISciLCAiJysrJyIsICInLS0nIiwgIicuJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N0YXRpYyciLCAiJ2ltcG9ydCciLCAiJ2V4dGVuc2lvbiciLCAiJ3N1cGVyJyIsICInZmFsc2UnIiwgIidtbSciLCAiJ2NtJyIsICIncHQnIiwgIidpbmNoJyIsICIncGMnIiwgIidlbSciLCAiJ2V4JyIsICIncHgnIiwgIidhNCciLCAiJ2EzJyIsICInYTUnIiwgIid1cy1sZXR0ZXInIiwgIid1cy1sZWdhbCciLCAiJ3VzLWxlZGdlciciLCAiJ3VzLXN1cGVyLWInIiwgIidwb3J0cmFpdCciLCAiJ2xhbmRzY2FwZSciLCAiJ25vcm1hbCciLCAiJ2l0YWxpYyciLCAiJ29ibGlxdWUnIiwgIidtb25vc3BhY2UnIiwgIidzYW5zLXNlcmlmJyIsICInc2VyaWYnIiwgIidsZWZ0JyIsICInY2VudGVyJyIsICIncmlnaHQnIiwgIid1bmZvcm1hdHRlZCciLCAiJ2dlbmVyYWwtbnVtYmVyJyIsICInZml4ZWQnIiwgIidwZXJjZW50JyIsICInc2NpZW50aWZpYyciLCAiJ2N1cnJlbmN5JyIsICInaHRtbCciLCAiJ3BkZiciLCAiJ2NvdW50JyIsICIncnVubmluZy1jb3VudCciLCAiJ3N1bSciLCAiJ2F2ZXJhZ2UnIiwgIidtaW5pbXVtJyIsICInbWF4aW11bSciLCAiJ3J1bm5pbmctc3VtJyIsICIncmlzaW5nJyIsICInYmFkLXJpc2luZyciLCAiJ3Nsb3BpbmcnIiwgIidnb29kLXNsb3BpbmcnIiwgIidzdGFnbmF0aW5nJyIsICInbm9uZSciLCAiJ3NvbGlkJyIsICInZG90dGVkJyIsICInZGFzaGVkJyIsICInZG91YmxlJyIsICInZ3Jvb3ZlJyIsICIncmlkZ2UnIiwgIidpbnNldCciLCAiJ291dHNldCciLCAiJ3BhZ2UtbnVtYmVyJyIsICIndG90YWwtcGFnZSciLCAiJ3BhZ2UtbnVtYmVyLXVuZmlsdGVyZWQnIiwgIid0b3RhbC1wYWdlLXVuZmlsdGVyZWQnIiwgIidwYWdlLXZhcmlhYmxlJyIsICInc2l6ZS10by1pbWFnZSciLCAiJ3NjYWxlLXRvLWl0ZW0nIiwgIidjbGlwJyIsICInZmlsZSciLCAiJ3VybCciLCAiJ2VtYmVkJyIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInbGF5b3V0LWRhdGEnIiwgIidleHRlcm5hbENzc1VSSSciLCAiJ2Zyb20gYnVuZGxlJyIsICInZm9ybWF0dGVycyciLCAiJ2NvbG9ycyciLCAiJ2ZvbnRzJyIsICInbWVkaWFzJyIsICInbWVkaWEnIiwgIidzdHlsZXMnIiwgIidwYWdldGVtcGxhdGUnIiwgIid0eXBlJyIsICInb3JpZW50YXRpb24nIiwgIid0b3BtYXJnaW4nIiwgIidsZWZ0bWFyZ2luJyIsICInYm90dG9tbWFyZ2luJyIsICIncmlnaHRtYXJnaW4nIiwgIidjb2xvciciLCAiJ2RhcmtlbnMnIiwgIidieS1wZXJjZW50JyIsICInbGlnaHRlbnMnIiwgIid0cmFuc2Zvcm1zJyIsICIndG93YXJkcyciLCAiJ2ZvbnQnIiwgIidmYW1pbHknIiwgIidzaXplJyIsICInc3R5bGUnIiwgIidmb3JtYXR0ZXInIiwgIidiYWNrZ3JvdW5kY29sb3InIiwgIidhbHRlcm5hdGUnIiwgIid0ZXh0Y29sb3InIiwgIid0ZXh0YWxpZ24nIiwgIidib3JkZXItdG9wJyIsICInYm9yZGVyLWJvdHRvbSciLCAiJ2JvcmRlci1sZWZ0JyIsICInYm9yZGVyLXJpZ2h0JyIsICIncGFkZGluZy10b3AnIiwgIidwYWRkaW5nLWJvdHRvbSciLCAiJ3BhZGRpbmctbGVmdCciLCAiJ3BhZGRpbmctcmlnaHQnIiwgIidtYXJnaW4tdG9wJyIsICInbWFyZ2luLWJvdHRvbSciLCAiJ21hcmdpbi1sZWZ0JyIsICInbWFyZ2luLXJpZ2h0JyIsICIndW9tbyciLCAiJ3VpJyIsICIncmVwb3J0JyIsICInbnVtYmVyJyIsICInZGF0ZSciLCAiJ2RhdGUrdGltZSciLCAiJ3RpbWUnIiwgIidkYXRhbWFydCciLCAiJ3JlbmRlcmluZyciLCAiJ3Rvb2xiYXInIiwgIid0ZW1wbGF0ZSciLCAiJ2Rlc2NyaWJlZCBieSciLCAiJ2hlYWRlciciLCAiJ2hlaWdodCciLCAiJ2RldGFpbCciLCAiJ2Zvb3RlciciLCAiJ2dyaWQnIiwgIidhcyciLCAiJ3JvdyciLCAiJ2NlbGwnIiwgIidjb2x1bW5zcGFuJyIsICIndGFibGUnIiwgIidncm91cCciLCAiJ2J5JyIsICInZGV0YWlscyciLCAiJ2ludGVydmFscyciLCAiJ2xvb2t1cHMnIiwgIidwYXRoJyIsICIncHJvcGVydHknIiwgIidhZ2dyZWdhdGUnIiwgIidvbi1ncm91cCciLCAiJ3RpdGxlJyIsICInb2YnIiwgIicoJyIsICInKSciLCAiJ3VwIHRvJyIsICInZGF5cyBpbiBwYXN0JyIsICInc3RyaW5nJyIsICInY2VsbGNvbG9yJyIsICInaWNvbiciLCAiJ3RyZW5kJyIsICInc3VidGl0bGUnIiwgIidzdWJzdWJ0aXRsZSciLCAiJ2xhYmVsJyIsICIndGV4dCciLCAiJ2F1dG90ZXh0JyIsICInaW1hZ2UnIiwgIidzY2FsZSciLCAiJ0AnIiwgIicsJyIsICInXSciLCAiJyMnIiwgIidbJyIsICInaW5zdGFuY2VvZiciLCAiJzsnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIidmb3InIiwgIid3aGlsZSciLCAiJ2RvJyIsICInbmV3JyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidib2xkJyIsICInc2hvd09uRmlyc3QnIiwgIidzaG93T25MYXN0JyIsICInZGV0YWlsaGVhZGVyJyIsICInZGV0YWlsZm9vdGVyJyIsICInaGlkZWxhYmVsJyIsICInZHluYW1pYyciLCAiJ3Jlc2l6ZSciLCAiJzo6JyIsICInPy4nIiwgIid8JyIsICIndmFyJyIsICIndHJ1ZSciCisgICAgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDQ9MTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Mz0xNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ2PTE0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDU9MTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0MD0xNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQyPTE0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDE9MTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU5PTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU1PTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU2PTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU3PTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU4PTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUxPTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNz0xMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM2PTEzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzk9MTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU0PTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzOD0xMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMzPTEzMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTQ9MjU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMj0xMzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUzPTI1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzU9MTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYxPTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzND0xMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUwPTI1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMxPTEzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTI9MjUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMD0xMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUxPTI1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lOVD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY2PTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY3PTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOT0xMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI2PTEyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDc9MjQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYzPTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNT0xMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ2PTI0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjg9MTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0OT0yNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI3PTEyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDg9MjQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nj0xNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY1PTE2NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjg9MTY4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Nz0xNjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYyPTE2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjE9MTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2ND0xNjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYzPTE2MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjA9MTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMzPTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM0PTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM1PTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM2PTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1OT0xNTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzA9MzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU4PTE1ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTU9MTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1ND0xNTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU3PTE1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTY9MTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MT0xNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUwPTE1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTM9MTUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mj0xNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDg9NDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDk9NDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDQ9NDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDU9NDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDY9NDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDc9NDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDA9NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ4PTE0ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDc9MTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQyPTQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQzPTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0OT0xNDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAwPTEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjE9MjIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyMD0yMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAyPTEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjM9MjIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMT0xMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjIyPTIyMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTg9MjE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxNz0yMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE5PTIxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTQ9MjE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMz0yMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE2PTIxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTU9MjE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMD0yMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjEyPTIxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTE9MjExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfREVDSU1BTD04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI3PTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI4PTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI5PTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwNz0yMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA2PTIwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDk9MjA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwOD0yMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAzPTIwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDI9MjAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwNT0yMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA0PTIwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjI9MTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0Mz0yNDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIxPTEyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDI9MjQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyND0xMjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ1PTI0NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjM9MTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0ND0yNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIwPTEyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDE9MjQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0MD0yNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TTF9DT01NRU5UPTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExOT0xMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE4PTExODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzk9MjM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNT0xMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM2PTIzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzU9MjM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNz0xMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM4PTIzODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTY9MTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzNz0yMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTExPTExMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzI9MjMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjMxPTIzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTM9MTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzND0yMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEyPTExMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzM9MjMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzMD0yMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjk9MjI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI4PTIyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDk9MTA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwND0xMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI1PTIyNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyND0yMjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjc9MjI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNT0xMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI2PTIyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0hFWD02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwMT0yMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAwPTIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODg9MTg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Nz0xODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTM9OTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg5PTE4OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODQ9MTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Mz0xODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg2PTE4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODU9MTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4MD0xODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTgyPTE4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODE9MTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk5PTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk1PTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk2PTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk3PTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk4PTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3Nz0xNzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc2PTE3NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzk9MTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3OD0xNzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTczPTE3MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzI9MTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3NT0xNzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc0PTE3NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzE9MTcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3MD0xNzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY5PTE2OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc3PTc3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc4PTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc5PTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzczPTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5OT0xOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk4PTE5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mz04MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTU9MTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5ND0xOTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTc9MTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Nj0xOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkxPTE5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTA9MTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Mz0xOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkyPTE5MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nj04NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbFJlcG9ydERTTFBhcnNlci50b2tlbk5hbWVzOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmciOyB9CisKKworICAgICAKKyAgICAgCXByb3RlY3RlZCBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgICAgIAkKKyAgICAgICAgcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAgICAgCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgR3JhbW1hciBnZXRHcmFtbWFyKCkgeworICAgICAgICAJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZvclRva2VuTmFtZShTdHJpbmcgdG9rZW5OYW1lKSB7CisgICAgICAgIAlyZXR1cm4gdG9rZW5OYW1lOworICAgICAgICB9CisKKworCisKKworICAgIC8vIERlbGVnYXRlZCBydWxlcworCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM1OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM0NV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNDVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDQwNl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ0MDZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI5N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyOTdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI4NF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyODRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMxOF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNTdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMzMl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMzNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMyMF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMjBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM3M19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNzNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM4Nl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzODZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM5OV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzOTlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM2MF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNjBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI5OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyOThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM0Nl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNDZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM1OV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNTlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDQwN19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ0MDdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM4N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzODdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI2MF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNjBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM2MV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNjFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM3MV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNzFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM1N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNTdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM5N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzOTdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM3Ml9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNzJfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM5OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzOThfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM0N19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNDdfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM4OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzODhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1Nl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNTZfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMyMV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMjFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMzMV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMzFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMzNV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMzVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM5MF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzOTBfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM0OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNDhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM2OF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNjhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMyOF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMjhfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDgyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDgyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNjFfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjYxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNzVfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzc1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNTVfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzU1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ0MDNfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNDAzX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ0MTBfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNDEwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyODFfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjgxX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzMzBfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzMwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNDNfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzQzX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNTVfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjU1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ5Nl9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ5Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzEwX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMxMF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzUwX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzcwX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM3MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzYzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM2M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzgzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM4M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTAxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDEwMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjYzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI2M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzAzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMwM19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzk1X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5NV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzRfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM4NV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzODVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDQwNV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ0MDVfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDc0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDc0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ0MDBfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNDAwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzODBfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzgwX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ0MTNfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNDEzX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNzhfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzc4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNTJfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzUyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzMzhfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzM4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNjVfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzY1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzMTJfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzEyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNjVfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjY1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNzlfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzc5X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ2MF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ2MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzUzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzQwX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM0MF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjUyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI1Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDE0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQxNF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDAxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQwMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzM5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMzOV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzY2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM2Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzkzX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzUxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzc3X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM3N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzQxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM0MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzgxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM4MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzY3X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM2N19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzgyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM4Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzkyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDA5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQwOV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzM3X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMzN19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzkxX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5MV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDAyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQwMl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDEyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQxMl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjY2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI2Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzExX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMxMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNjFfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNjFfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM1X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzMDJfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzAyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ0MDhfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkNDA4X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNTRfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjU0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNjJfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzYyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzNDJfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzQyX0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQyNzRfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMjc0X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQzODlfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzg5X0ludGVybmFsUmVwb3J0RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQ4M19JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQ4M19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMjYyX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDI2Ml9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTAwX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDEwMF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzM2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMzNl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzk2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzc2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM3Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDExX0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQxMV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzY5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM2OV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkNDA0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDQwNF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzI5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDMyOV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzU2X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1Nl9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzQ5X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM0OV9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzc0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM3NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzg0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM4NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzY0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM2NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzU0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM1NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTA3X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDEwN19JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzk0X0ludGVybmFsUmVwb3J0RFNMKCkgeworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3lucHJlZDM5NF9JbnRlcm5hbFJlcG9ydERTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMzNfSW50ZXJuYWxSZXBvcnREU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMzNfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMxNF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMTRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMwNF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMDRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDI1OV9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQyNTlfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDMzNF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzMzRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDM0NF9JbnRlcm5hbFJlcG9ydERTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQzNDRfSW50ZXJuYWxSZXBvcnREU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBERkExNCBkZmExNCA9IG5ldyBERkExNCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTUgZGZhMTUgPSBuZXcgREZBMTUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE2IGRmYTE2ID0gbmV3IERGQTE2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMyBkZmEyMyA9IG5ldyBERkEyMyh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMzEgZGZhMzEgPSBuZXcgREZBMzEodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTM0IGRmYTM0ID0gbmV3IERGQTM0KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEzNSBkZmEzNSA9IG5ldyBERkEzNSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMzggZGZhMzggPSBuZXcgREZBMzgodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTQzIGRmYTQzID0gbmV3IERGQTQzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkE0NiBkZmE0NiA9IG5ldyBERkE0Nih0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBNTUgZGZhNTUgPSBuZXcgREZBNTUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE1MiBkZmExNTIgPSBuZXcgREZBMTUyKHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNTggZGZhMTU4ID0gbmV3IERGQTE1OCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTY1IGRmYTE2NSA9IG5ldyBERkExNjUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE2NiBkZmExNjYgPSBuZXcgREZBMTY2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExNzQgZGZhMTc0ID0gbmV3IERGQTE3NCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMTg0IGRmYTE4NCA9IG5ldyBERkExODQodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTE5NyBkZmExOTcgPSBuZXcgREZBMTk3KHRoaXMpOworICAgIHByb3RlY3RlZCBERkExOTggZGZhMTk4ID0gbmV3IERGQTE5OCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjAyIGRmYTIwMiA9IG5ldyBERkEyMDIodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIwMyBkZmEyMDMgPSBuZXcgREZBMjAzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMDQgZGZhMjA0ID0gbmV3IERGQTIwNCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjA5IGRmYTIwOSA9IG5ldyBERkEyMDkodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIxOCBkZmEyMTggPSBuZXcgREZBMjE4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMjEgZGZhMjIxID0gbmV3IERGQTIyMSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjI5IGRmYTIyOSA9IG5ldyBERkEyMjkodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIzMCBkZmEyMzAgPSBuZXcgREZBMjMwKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMzEgZGZhMjMxID0gbmV3IERGQTIzMSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjMyIGRmYTIzMiA9IG5ldyBERkEyMzIodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIzMyBkZmEyMzMgPSBuZXcgREZBMjMzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMzQgZGZhMjM0ID0gbmV3IERGQTIzNCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjM1IGRmYTIzNSA9IG5ldyBERkEyMzUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIzNiBkZmEyMzYgPSBuZXcgREZBMjM2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyMzcgZGZhMjM3ID0gbmV3IERGQTIzNyh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjM4IGRmYTIzOCA9IG5ldyBERkEyMzgodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTIzOSBkZmEyMzkgPSBuZXcgREZBMjM5KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNDAgZGZhMjQwID0gbmV3IERGQTI0MCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjQxIGRmYTI0MSA9IG5ldyBERkEyNDEodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI0MiBkZmEyNDIgPSBuZXcgREZBMjQyKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNDMgZGZhMjQzID0gbmV3IERGQTI0Myh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjQ0IGRmYTI0NCA9IG5ldyBERkEyNDQodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI0NSBkZmEyNDUgPSBuZXcgREZBMjQ1KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNDYgZGZhMjQ2ID0gbmV3IERGQTI0Nih0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjQ3IGRmYTI0NyA9IG5ldyBERkEyNDcodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI0OCBkZmEyNDggPSBuZXcgREZBMjQ4KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNDkgZGZhMjQ5ID0gbmV3IERGQTI0OSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjUwIGRmYTI1MCA9IG5ldyBERkEyNTAodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI1MSBkZmEyNTEgPSBuZXcgREZBMjUxKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNTIgZGZhMjUyID0gbmV3IERGQTI1Mih0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjUzIGRmYTI1MyA9IG5ldyBERkEyNTModGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI1NCBkZmEyNTQgPSBuZXcgREZBMjU0KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNTUgZGZhMjU1ID0gbmV3IERGQTI1NSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjU2IGRmYTI1NiA9IG5ldyBERkEyNTYodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI1NyBkZmEyNTcgPSBuZXcgREZBMjU3KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNTggZGZhMjU4ID0gbmV3IERGQTI1OCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjU5IGRmYTI1OSA9IG5ldyBERkEyNTkodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI2MCBkZmEyNjAgPSBuZXcgREZBMjYwKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNjEgZGZhMjYxID0gbmV3IERGQTI2MSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjYyIGRmYTI2MiA9IG5ldyBERkEyNjIodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI2MyBkZmEyNjMgPSBuZXcgREZBMjYzKHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNjQgZGZhMjY0ID0gbmV3IERGQTI2NCh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgREZBMjY1IGRmYTI2NSA9IG5ldyBERkEyNjUodGhpcyk7CisgICAgcHJvdGVjdGVkIERGQTI2NiBkZmEyNjYgPSBuZXcgREZBMjY2KHRoaXMpOworICAgIHByb3RlY3RlZCBERkEyNjcgZGZhMjY3ID0gbmV3IERGQTI2Nyh0aGlzKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE0X2VvdFMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE0X2VvZlMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE0X21pblMgPQorICAgICAgICAiXDFcNFwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTRfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTRfYWNjZXB0UyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDJcMzdcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE0X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFw0MVx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMTRfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcMlwxXDFcM1wyXDI2XHVmZmZmXDFcMlw2XHVmZmZmXDJcMlw0XHVmZmZmXDFcMlw0XHVmZmZmXDYiKworICAgICAgICAgICAgIlwyXDEwM1x1ZmZmZlwxXDJcMTE1XHVmZmZmXDFcMlwxNlx1ZmZmZlwxXDJcMlx1ZmZmZlwyXDJcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMlwxXHVmZmZmXDFcMlwzXHVmZmZmXDExXDJcMVx1ZmZmZlwxXDJcMTdcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTRfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTRfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTRfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTRfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExNF9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExNF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE0X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE0X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE0X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE0X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE0X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExNF90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTE0X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMTRfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTRfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE0X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTE0IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNDsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMTRfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExNF9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTE0X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMTRfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExNF9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkExNF9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMTRfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI1MTk1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIDogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKSB8ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKSApOyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTRfMSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMzX0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTRfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTQsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9lb3RTID0KKyAgICAgICAgIlw0M1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9lb2ZTID0KKyAgICAgICAgIlw0M1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9taW5TID0KKyAgICAgICAgIlwxXDRcMVwwXDQxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1X21heFMgPQorICAgICAgICAiXDFcdTAwZmVcMVwwXDQxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1X2FjY2VwdFMgPQorICAgICAgICAiXDJcdWZmZmZcMVwyXDM3XHVmZmZmXDFcMSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcNDFcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTE1X3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlw1XDJcMjZcdWZmZmZcMVwyXDZcdWZmZmZcMlwyXDRcdWZmZmZcMVwyXDRcdWZmZmZcNlwyXDEwM1x1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMlwxMTVcdWZmZmZcMVwyXDE2XHVmZmZmXDFcMlwyXHVmZmZmXDFcMVwxXDJcMlx1ZmZmZlwxXDIiKworICAgICAgICAgICAgIlwxXHVmZmZmXDFcMlwzXHVmZmZmXDExXDJcMVx1ZmZmZlwxXDJcMTdcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTVfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTVfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTVfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTVfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExNV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExNV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE1X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE1X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE1X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExNV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTE1X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMTVfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTVfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE1X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTE1IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMTVfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExNV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTE1X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMTVfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExNV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkExNV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMTVfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI1MjE3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNV8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzRfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDM0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2X2VvdFMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2X2VvZlMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2X21pblMgPQorICAgICAgICAiXDFcNFwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTZfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTZfYWNjZXB0UyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDJcMzdcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFw0MVx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMTZfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMlwyNlx1ZmZmZlwxXDJcNlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMTAzXHVmZmZmIisKKyAgICAgICAgICAgICJcMVwyXDExNVx1ZmZmZlwxXDJcMTZcdWZmZmZcMVwyXDJcdWZmZmZcMVwxXDFcMlwyXHVmZmZmXDFcMiIrCisgICAgICAgICAgICAiXDFcdWZmZmZcMVwyXDNcdWZmZmZcMTFcMlwxXHVmZmZmXDFcMlwxN1x1ZmZmZlwxXDIiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNl9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNl9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNl9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNl9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE2X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE2X21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTZfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTZfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTZfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTZfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTZfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2X3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTE2X3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMTZfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExNl90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkExNl90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTZfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTYgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE2OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExNl9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTE2X2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMTZfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExNl9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTE2X2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTE2X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExNl90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjUyMzk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKSB8ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKTsiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2XzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTZfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzNV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE2LCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjNfZW90UyA9CisgICAgICAgICJcMTNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjNfZW9mUyA9CisgICAgICAgICJcMTNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjNfbWluUyA9CisgICAgICAgICJcMVwzNlwyXHVmZmZmXDFcMzZcN1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyM19tYXhTID0KKyAgICAgICAgIlwxXDQ1XDJcdWZmZmZcMVw0Mlw3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzX2FjY2VwdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwxXDFcMlwxXHVmZmZmXDFcNFwxXDVcMVw3XDFcMTBcMVwxMVwxXDZcMVwzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzX3NwZWNpYWxTID0KKyAgICAgICAgIlwxM1x1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjNfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcM1wxXDZcMVwxXDFcMlwxXDRcMVw1XDFcN1wxXDEwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTFcM1x1ZmZmZlwxXDEyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIzX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIzX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjNfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjNfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyM19tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyM19tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyM19hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyM19hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyM19zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjNfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjNfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyM190cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIzX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIzX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyM190cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEyMyBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjM7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTIzX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjNfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyM19taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTIzX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjNfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjNfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIzX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiNTQ3MToxOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgOiAoICggJy0+JyApIHwgKCAnLi48JyApIHwgKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgKSApIHwgKCAnLi4nICkgfCAoICc9PicgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81X18wICkgKSB8ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wICkgKSB8ICggJzw+JyApIHwgKCAnPzonICkgKTsiOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzFfZW90UyA9CisgICAgICAgICJcMTJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzFfZW9mUyA9CisgICAgICAgICJcNFx1ZmZmZlw1XDNcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEzMV9taW5TID0KKyAgICAgICAgIlwxXDU3XDJcNVwxXHVmZmZmXDVcNFwxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTMxX21heFMgPQorICAgICAgICAiXDFcdTAwZmJcMlw2NVwxXHVmZmZmXDVcdTAwZmVcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEzMV9hY2NlcHRTID0KKyAgICAgICAgIlwzXHVmZmZmXDFcMlw1XHVmZmZmXDFcMSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEzMV9zcGVjaWFsUyA9CisgICAgICAgICJcMTJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTMxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxXDFcdTAwY2FcdWZmZmZcMVwyXDFcMyIsCisgICAgICAgICAgICAiXDFcNFwzMVx1ZmZmZlwxXDNcMjFcdWZmZmZcMVw1XDFcNlwxXDdcMVwxMFwxXDMiLAorICAgICAgICAgICAgIlwxXDRcMzFcdWZmZmZcMVwzXDIxXHVmZmZmXDFcNVwxXDZcMVw3XDFcMTBcMVwzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDJcM1w0XHVmZmZmXDQzXDNcMTAzXHVmZmZmXDJcM1w3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcM1wxN1x1ZmZmZlwyXDNcMTZcdWZmZmZcMzBcM1wxMlx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDJcM1w0XHVmZmZmXDQzXDNcMTAzXHVmZmZmXDJcM1w3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcM1wxN1x1ZmZmZlwyXDNcMTZcdWZmZmZcMzBcM1wxMlx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDJcM1w0XHVmZmZmXDQzXDNcMTAzXHVmZmZmXDJcM1w3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcM1wxN1x1ZmZmZlwyXDNcMTZcdWZmZmZcMzBcM1wxMlx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDJcM1w0XHVmZmZmXDQzXDNcMTAzXHVmZmZmXDJcM1w3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcM1wxN1x1ZmZmZlwyXDNcMTZcdWZmZmZcMzBcM1wxMlx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDJcM1w0XHVmZmZmXDQzXDNcMTAzXHVmZmZmXDJcM1w3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcM1wxN1x1ZmZmZlwyXDNcMTZcdWZmZmZcMzBcM1wxMlx1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzFfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzFfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzFfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzFfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEzMV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEzMV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTMxX21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTMxX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTMxX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTMxX2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTMxX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEzMV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEzMV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTMxX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMzFfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMzFfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTMxX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTMxIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMzEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAzMTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMzFfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEzMV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTMxX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMzFfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEzMV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEzMV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMzFfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI1NzUzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCApICkgfCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAgKSApICk7IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM0X2VvdFMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM0X2VvZlMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM0X21pblMgPQorICAgICAgICAiXDFcNFwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzRfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzRfYWNjZXB0UyA9CisgICAgICAgICJcM1x1ZmZmZlwxXDFcMVx1ZmZmZlwxXDJcMzVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzRfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDFcMVw0MFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMzRfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcNVwxXDFcM1w1XDI2XHVmZmZmXDFcNVwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNVw0XHVmZmZmXDEiKworICAgICAgICAgICAgIlw1XDRcdWZmZmZcNlw1XDEwM1x1ZmZmZlwxXDVcMTE1XHVmZmZmXDFcMlwyMVx1ZmZmZlwyXDVcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNVwxXHVmZmZmXDFcNVwzXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcMTVcdWZmZmZcMVwzXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM0X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM0X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM0X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM0X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMzRfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMzRfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEzNF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEzNF9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEzNF9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEzNF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEzNF9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzRfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMzRfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEzNF90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTM0X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTM0X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEzNF90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEzNCBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTM0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMzQ7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTM0X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMzRfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEzNF9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTM0X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMzRfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMzRfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTM0X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiNTgyOToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xIDogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgKSApIHwgKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wICkgKSApOyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzRfMSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgzNF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDc0X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgzNF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzRfMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgzNF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDc0X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgzNF8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAzNCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM1X2VvdFMgPQorICAgICAgICAiXDQwXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM1X2VvZlMgPQorICAgICAgICAiXDQwXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTM1X21pblMgPQorICAgICAgICAiXDFcNFwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzVfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzVfYWNjZXB0UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDFcMVwyXDFcM1wxXDRcMVw1XDZcdWZmZmZcMVw2XDExXHVmZmZmXDFcN1wxXHVmZmZmXDEiKworICAgICAgICAiXDEyXDFcMTNcMVwxNFwxXDE1XDFcMTZcMVwxN1wxXDEwXDFcMTEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzVfc3BlY2lhbFMgPQorICAgICAgICAiXDI3XHVmZmZmXDFcMFwxMFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMzVfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcMTRcMVw1XDNcMTRcMjZcdWZmZmZcMVw1XDIxXHVmZmZmXDVcNVwxXDE0XDEwM1x1ZmZmZlwxXDIiKworICAgICAgICAgICAgIlwxMTVcdWZmZmZcMVwzNVwyMVx1ZmZmZlwyXDE0XDJcdWZmZmZcMVwyNlwxXHVmZmZmXDFcM1wzXHVmZmZmIisKKyAgICAgICAgICAgICJcMVwyN1wxXDMwXDFcMzFcMVwxXDJcMTRcMVwzMlwxXDMzXDFcMzRcMVx1ZmZmZlwxXDRcMTdcdWZmZmYiKworICAgICAgICAgICAgIlwxXDE0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzVfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzVfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzVfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzVfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEzNV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEzNV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTM1X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTM1X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM1X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM1X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM1X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEzNV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEzNV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTM1X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMzVfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMzVfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM1X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTM1IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMzUoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAzNTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMzVfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEzNV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTM1X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMzVfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEzNV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEzNV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMzVfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI1ODUxOjE6IHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsICkgfCAoIHJ1bGVYQmxvY2tFeHByZXNzaW9uICkgfCAoIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiApIHwgKCAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYRmVhdHVyZUNhbGwgKSB8ICggcnVsZVhMaXRlcmFsICkgfCAoIHJ1bGVYSWZFeHByZXNzaW9uICkgfCAoICggcnVsZVhGb3JMb29wRXhwcmVzc2lvbiApICkgfCAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiApIHwgKCBydWxlWFdoaWxlRXhwcmVzc2lvbiApIHwgKCBydWxlWERvV2hpbGVFeHByZXNzaW9uICkgfCAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uICkgfCAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiApIHwgKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gKSB8ICggcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiApICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzNV8yMyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgzNV8yMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ4Ml9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ4M19JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MzVfMjMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDM1LCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzhfZW90UyA9CisgICAgICAgICJcNDNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzhfZW9mUyA9CisgICAgICAgICJcNDNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzhfbWluUyA9CisgICAgICAgICJcMVw0XDFcMFw0MVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEzOF9tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDFcMFw0MVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEzOF9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwzN1x1ZmZmZlwxXDEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMzhfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDQxXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEzOF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcNVwyXDI2XHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwyXHVmZmZmXDJcMlw0XHVmZmZmXDFcMlw0XHVmZmZmIisKKyAgICAgICAgICAgICJcNlwyXDEwM1x1ZmZmZlwxXDJcMTE1XHVmZmZmXDFcMVwyMVx1ZmZmZlwyXDJcMlx1ZmZmZlwxXDJcMSIrCisgICAgICAgICAgICAiXHVmZmZmXDFcMlwzXHVmZmZmXDExXDJcMVx1ZmZmZlwxXDJcMTdcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzhfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzhfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMzhfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMzhfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEzOF9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEzOF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTM4X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTM4X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM4X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM4X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTM4X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEzOF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEzOF90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTM4X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMzhfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMzhfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTM4X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTM4IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMzgoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAzODsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMzhfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEzOF9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTM4X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMzhfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEzOF9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEzOF9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMzhfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI2MDI1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiA6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgKSApICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOF8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDM4XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkOTZfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDM0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgzOF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAzOCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQzX2VvdFMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQzX2VvZlMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQzX21pblMgPQorICAgICAgICAiXDFcNFwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDNfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDNfYWNjZXB0UyA9CisgICAgICAgICJcM1x1ZmZmZlwxXDFcMVx1ZmZmZlwxXDJcMzVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDNfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDFcMVw0MFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBNDNfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcNVwxXDFcM1w1XDI2XHVmZmZmXDFcNVwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNVw0XHVmZmZmXDEiKworICAgICAgICAgICAgIlw1XDRcdWZmZmZcNlw1XDEwM1x1ZmZmZlwxXDVcMTE1XHVmZmZmXDFcMlwyMVx1ZmZmZlwyXDVcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNVwxXHVmZmZmXDFcNVwzXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcMTVcdWZmZmZcMVwzXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTQzX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTQzX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTQzX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTQzX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBNDNfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBNDNfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkE0M19tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkE0M19tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0M19hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0M19hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0M19zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNDNfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBNDNfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkE0M190cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTQzX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTQzX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0M190cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkE0MyBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTQzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNDM7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTQzX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBNDNfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkE0M19taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTQzX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBNDNfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBNDNfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTQzX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiNjEzNzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCApICkgfCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCApICkgKTsiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTQzXzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NDNfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMDFfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDQzXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE0M18yID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDQzXzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTAxX0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg0M18yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCA0MywgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQ2X2VvdFMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQ2X2VvZlMgPQorICAgICAgICAiXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTQ2X21pblMgPQorICAgICAgICAiXDFcNFwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDZfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwyXDBcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDZfYWNjZXB0UyA9CisgICAgICAgICJcM1x1ZmZmZlwxXDFcMVx1ZmZmZlwxXDJcMzVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNDZfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDFcMVw0MFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBNDZfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcNVwxXDFcM1w1XDI2XHVmZmZmXDFcNVwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNVw0XHVmZmZmXDEiKworICAgICAgICAgICAgIlw1XDRcdWZmZmZcNlw1XDEwM1x1ZmZmZlwxXDVcMTE1XHVmZmZmXDFcMlwyMVx1ZmZmZlwyXDVcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNVwxXHVmZmZmXDFcNVwzXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcMTVcdWZmZmZcMVwzXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTQ2X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTQ2X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTQ2X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTQ2X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBNDZfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBNDZfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkE0Nl9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkE0Nl9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0Nl9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0Nl9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0Nl9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNDZfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBNDZfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkE0Nl90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTQ2X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTQ2X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0Nl90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkE0NiBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTQ2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNDY7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTQ2X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBNDZfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkE0Nl9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTQ2X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBNDZfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBNDZfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTQ2X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiNjIzMToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xIDogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCApICkgfCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgKSApICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Nl8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDQ2XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTA3X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg0Nl8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDZfMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg0Nl8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwN19JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NDZfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgNDYsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE1NV9lb3RTID0KKyAgICAgICAgIlw3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTU1X2VvZlMgPQorICAgICAgICAiXDJcdWZmZmZcMVw0XDJcdWZmZmZcMVw0XDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNTVfbWluUyA9CisgICAgICAgICJcMVw1XDFcdWZmZmZcMVw1N1wxXDVcMVx1ZmZmZlwxXDU3XDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNTVfbWF4UyA9CisgICAgICAgICJcMVw2MlwxXHVmZmZmXDFcdTAwZGRcMVw1MFwxXHVmZmZmXDFcdTAwZGRcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE1NV9hY2NlcHRTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMVwyXHVmZmZmXDFcMlwxXHVmZmZmXDFcMyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE1NV9zcGVjaWFsUyA9CisgICAgICAgICJcN1x1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBNTVfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcMlw1NFx1ZmZmZlwxXDEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcM1x1MDBhZFx1ZmZmZlwxXDQiLAorICAgICAgICAgICAgIlwxXDVcNDJcdWZmZmZcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDNcdTAwYWRcdWZmZmZcMVw0IiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTU1X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTU1X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTU1X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTU1X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBNTVfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBNTVfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkE1NV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkE1NV9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE1NV9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE1NV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE1NV9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNTVfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBNTVfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkE1NV90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTU1X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTU1X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE1NV90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkE1NSBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTU1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gNTU7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTU1X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBNTVfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkE1NV9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTU1X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBNTVfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBNTVfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTU1X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiNjQzMToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xIDogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEgKSApIHwgKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMiApICkgKTsiOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTUyX2VvdFMgPQorICAgICAgICAiXDEyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1Ml9lb2ZTID0KKyAgICAgICAgIlwxXDEwXDExXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1Ml9taW5TID0KKyAgICAgICAgIlwxXDRcN1wwXDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTUyX21heFMgPQorICAgICAgICAiXDFcdTAwZmVcN1wwXDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTUyX2FjY2VwdFMgPQorICAgICAgICAiXDEwXHVmZmZmXDFcMlwxXDEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTUyX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMVwxXDBcMVw2XDFcNFwxXDJcMVw1XDFcM1wyXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkExNTJfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMTBcNVx1ZmZmZlwyXDEwXDRcdWZmZmZcMVwxXDFcMlwxXDNcMVw0XDFcNVw1XDEwXDFcN1wxXDYiKworICAgICAgICAgICAgIlwyN1wxMFwxMDNcdWZmZmZcMlwxMFw3NFx1ZmZmZlwxXDEwXDE3XHVmZmZmXDJcMTBcMTZcdWZmZmZcMzAiKworICAgICAgICAgICAgIlwxMFwxMlx1ZmZmZlwyXDEwXDFcdWZmZmZcMlwxMCIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNTJfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTUyX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1Ml9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNTJfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExNTJfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTUyX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTUyX21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE1Ml9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNTJfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTUyX2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1Ml9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTUyX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTE1Ml90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTE1Ml90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTE1Ml90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkExNTJfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE1Ml90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkExNTIgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNTIoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNTI7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTE1Ml9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTE1Ml9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTE1Ml9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTE1Ml9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTE1Ml9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkExNTJfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTE1Ml90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjI2MTU1OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzIgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjUyX0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI1Ml9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNTJfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzcgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzcgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjUyX0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1Ml80ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1Ml80ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI1Ml9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTUyXzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNTJfNiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNTJfNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNTJfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1Ml82KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTUyXzMgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTUyXzMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjUyX0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNTJfMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTUyLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTU4X2VvdFMgPQorICAgICAgICAiXDEzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1OF9lb2ZTID0KKyAgICAgICAgIlwxXDFcMTJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTU4X21pblMgPQorICAgICAgICAiXDFcNFwxXHVmZmZmXDEwXDBcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNThfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXHVmZmZmXDEwXDBcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNThfYWNjZXB0UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDJcMTBcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1OF9zcGVjaWFsUyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDVcMVwwXDFcN1wxXDFcMVw0XDFcM1wxXDZcMVwyXDFcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTE1OF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcNVwxXDVcdWZmZmZcMlwxXDRcdWZmZmZcMTJcMVwxXDNcMVwyXDFcNFwxXDVcMVw2XDFcN1wxXDEwIisKKyAgICAgICAgICAgICJcMVwxMVwyMVwxXDEwM1x1ZmZmZlwyXDFcNzRcdWZmZmZcMVwxXDE3XHVmZmZmXDJcMVwxNlx1ZmZmZiIrCisgICAgICAgICAgICAiXDMwXDFcMTJcdWZmZmZcMlwxXDFcdWZmZmZcMlwxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNThfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTU4X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1OF9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNThfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExNThfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTU4X21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTU4X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE1OF9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNThfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTU4X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE1OF9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTU4X3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTE1OF90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTE1OF90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTE1OF90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkExNThfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE1OF90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkExNTggZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNTgoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNTg7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTE1OF9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTE1OF9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTE1OF9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTE1OF9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTE1OF9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkExNThfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTE1OF90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIigpKiBsb29wYmFjayBvZiAyNzY0NzoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU4XzMgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTU4XzMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjU4X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTU4XzMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNThfNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNThfNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNThfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNThfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1OF85ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1OF85ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI1OF9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1OF85KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU4XzcgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTU4XzcgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjU4X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTU4XzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNThfNiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNThfNiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNThfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNThfNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE1OF8yID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE1OF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI1OF9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE1OF8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTU4XzggPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTU4XzggPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjU4X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTU4XzgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNThfNCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNThfNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNThfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxNThfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMTU4LCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTY1X2VvdFMgPQorICAgICAgICAiXDExNlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjVfZW9mUyA9CisgICAgICAgICJcMVwyXDExNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjVfbWluUyA9CisgICAgICAgICJcMVw0XDFcMFwxMTRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTY1X21heFMgPQorICAgICAgICAiXDFcdTAwZmVcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjVfYWNjZXB0UyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDJcMTEyXHVmZmZmXDFcMSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjVfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDExNFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMTY1X3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlw1XDJcNVx1ZmZmZlwyXDJcNFx1ZmZmZlw0M1wyXDEwM1x1ZmZmZlwyXDJcNzRcdWZmZmZcMVwyXDE3IisKKyAgICAgICAgICAgICJcdWZmZmZcMVwxXDFcMlwxNlx1ZmZmZlwzMFwyXDEyXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTY1X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2NV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNjVfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTY1X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTY1X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE2NV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE2NV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExNjVfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTY1X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2NV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNjVfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2NV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExNjVfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkExNjVfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExNjVfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTY1X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNjVfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTY1IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTY1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTY1OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExNjVfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExNjVfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkExNjVfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExNjVfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExNjVfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMTY1X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExNjVfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIyOTQ3NDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2NV8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2NV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI2NV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2NV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNjUsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjZfZW90UyA9CisgICAgICAgICJcMTE2XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2Nl9lb2ZTID0KKyAgICAgICAgIlwxXDJcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2Nl9taW5TID0KKyAgICAgICAgIlwxXDRcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNjZfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2Nl9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE2Nl9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMTE0XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkExNjZfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDJcMlw0XHVmZmZmXDQzXDJcMTAzXHVmZmZmXDJcMlw3NFx1ZmZmZlwxXDJcMTciKworICAgICAgICAgICAgIlx1ZmZmZlwyXDJcMTZcdWZmZmZcM1wyXDFcMVwyNFwyXDEyXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTY2X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2Nl9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNjZfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTY2X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTY2X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE2Nl9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE2Nl9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExNjZfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTY2X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2Nl9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNjZfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE2Nl9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExNjZfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkExNjZfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExNjZfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTY2X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNjZfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTY2IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTY2KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTY2OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExNjZfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExNjZfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkExNjZfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExNjZfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExNjZfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMTY2X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExNjZfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIyOTUwMjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2Nl8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE2Nl8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI2Nl9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE2Nl8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNjYsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNzRfZW90UyA9CisgICAgICAgICJcNDZcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTc0X2VvZlMgPQorICAgICAgICAiXDQ2XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE3NF9taW5TID0KKyAgICAgICAgIlwxXDRcMlwwXDQzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE3NF9tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDJcMFw0M1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNzRfYWNjZXB0UyA9CisgICAgICAgICJcM1x1ZmZmZlwxXDFcMVx1ZmZmZlwxXDJcNDBcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTc0X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFwxXDFcNDNcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTE3NF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVw1XDFcMVwzXDVcMjZcdWZmZmZcMVw1XDNcdWZmZmZcMVwzXDJcdWZmZmZcMlw1XDRcdWZmZmZcMSIrCisgICAgICAgICAgICAiXDVcM1x1ZmZmZlw3XDVcMTAzXHVmZmZmXDFcNVwxMTVcdWZmZmZcMVwyXDIwXHVmZmZmXDNcNVwyXHVmZmZmIisKKyAgICAgICAgICAgICJcMVw1XDFcdWZmZmZcMVw1XDNcdWZmZmZcMTFcNVwxXHVmZmZmXDFcNVwxNVx1ZmZmZlwxXDNcMlw1IiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNzRfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTc0X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE3NF9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNzRfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExNzRfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTc0X21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTc0X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE3NF9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNzRfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTc0X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE3NF9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTc0X3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTE3NF90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTE3NF90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTE3NF90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkExNzRfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE3NF90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkExNzQgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNzQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAxNzQ7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTE3NF9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTE3NF9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTE3NF9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTE3NF9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTE3NF9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkExNzRfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTE3NF90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjMwNjQzOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE3NF8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE3NF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI3NF9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTc0XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExNzRfMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxNzRfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyNzRfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE3NF8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxNzQsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExODRfZW90UyA9CisgICAgICAgICJcNDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTg0X2VvZlMgPQorICAgICAgICAiXDQyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE4NF9taW5TID0KKyAgICAgICAgIlwxXDRcMlwwXDM3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE4NF9tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDJcMFwzN1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExODRfYWNjZXB0UyA9CisgICAgICAgICJcM1x1ZmZmZlwxXDFcMVwyXDM1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE4NF9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMVwxXDM3XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkExODRfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcNFwxXDFcM1w0XDI2XHVmZmZmXDFcNFwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNFw0XHVmZmZmXDEiKworICAgICAgICAgICAgIlw0XDRcdWZmZmZcNlw0XDEwM1x1ZmZmZlwxXDRcMTE1XHVmZmZmXDFcMlwyMVx1ZmZmZlwyXDRcMlx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNFwxXHVmZmZmXDFcNFwzXHVmZmZmXDExXDRcMVx1ZmZmZlwxXDRcMTdcdWZmZmZcMVw0IiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTg0X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE4NF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExODRfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTg0X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTg0X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE4NF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE4NF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExODRfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTg0X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE4NF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExODRfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE4NF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExODRfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkExODRfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExODRfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTg0X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExODRfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTg0IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTg0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTg0OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExODRfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExODRfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkExODRfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExODRfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExODRfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMTg0X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExODRfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzMjMxMToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTg0XzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTg0XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjg0X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgxODRfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE4NF8yID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE4NF8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI4NF9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MTg0XzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDE4NCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5N19lb3RTID0KKyAgICAgICAgIlwxMTZcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTk3X2VvZlMgPQorICAgICAgICAiXDFcMlwxMTVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTk3X21pblMgPQorICAgICAgICAiXDFcNFwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5N19tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDFcMFwxMTRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTk3X2FjY2VwdFMgPQorICAgICAgICAiXDJcdWZmZmZcMVwyXDExMlx1ZmZmZlwxXDEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTk3X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFwxMTRcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTE5N190cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcMlwyXDRcdWZmZmZcNDNcMlwxMDNcdWZmZmZcMlwyXDc0XHVmZmZmXDFcMlwxNyIrCisgICAgICAgICAgICAiXHVmZmZmXDFcMVwxXDJcMTZcdWZmZmZcMzBcMlwxMlx1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE5N19lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExOTdfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTk3X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE5N19lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE5N19taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExOTdfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkExOTdfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTk3X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTE5N19hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExOTdfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTk3X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExOTdfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMTk3X3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMTk3X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMTk3X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTE5N190cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTk3X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTE5NyBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTE5NyhCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE5NzsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMTk3X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMTk3X2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMTk3X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMTk3X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMTk3X2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTE5N19zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMTk3X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMzQ3OTk6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE5N18xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE5N18xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI5N19JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE5N18xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxOTcsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExOThfZW90UyA9CisgICAgICAgICJcMTE2XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5OF9lb2ZTID0KKyAgICAgICAgIlwxXDJcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5OF9taW5TID0KKyAgICAgICAgIlwxXDRcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExOThfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5OF9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE5OF9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMTE0XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkExOThfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDJcMlw0XHVmZmZmXDQzXDJcMTAzXHVmZmZmXDJcMlw3NFx1ZmZmZlwxXDJcMTciKworICAgICAgICAgICAgIlx1ZmZmZlwyXDJcMTZcdWZmZmZcM1wyXDFcMVwyNFwyXDEyXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTk4X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE5OF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExOThfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTk4X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTk4X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE5OF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE5OF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkExOThfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTk4X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE5OF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExOThfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE5OF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkExOThfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkExOThfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExOThfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMTk4X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExOThfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTk4IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMTk4KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMTk4OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExOThfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkExOThfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkExOThfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExOThfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkExOThfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMTk4X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExOThfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzNDgyNzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE5OF8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDE5OF8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDI5OF9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDE5OF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAxOTgsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDJfZW90UyA9CisgICAgICAgICJcMTE2XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwMl9lb2ZTID0KKyAgICAgICAgIlwxXDJcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwMl9taW5TID0KKyAgICAgICAgIlwxXDRcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDJfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwMl9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwMl9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMTE0XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyMDJfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDJcMlw0XHVmZmZmXDEzXDJcMVwxXDI3XDJcMTAzXHVmZmZmXDJcMlw3NFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMlwxN1x1ZmZmZlwyXDJcMTZcdWZmZmZcMzBcMlwxMlx1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIwMl9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDJfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjAyX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwMl9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIwMl9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMDJfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMDJfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjAyX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIwMl9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDJfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjAyX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDJfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjAyX3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjAyX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMjAyX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIwMl90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjAyX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIwMiBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIwMihCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIwMjsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMjAyX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjAyX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjAyX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMjAyX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjAyX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIwMl9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjAyX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMzUzNjU6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDJfMSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDJfMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDJfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDJfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMjAyLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjAzX2VvdFMgPQorICAgICAgICAiXDExNlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDNfZW9mUyA9CisgICAgICAgICJcMVwyXDExNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDNfbWluUyA9CisgICAgICAgICJcMVw0XDFcMFwxMTRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjAzX21heFMgPQorICAgICAgICAiXDFcdTAwZmVcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDNfYWNjZXB0UyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDJcMTEyXHVmZmZmXDFcMSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDNfc3BlY2lhbFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwwXDExNFx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjAzX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlw1XDJcNVx1ZmZmZlwyXDJcNFx1ZmZmZlw0M1wyXDEwM1x1ZmZmZlwyXDJcNzRcdWZmZmZcMVwyXDE3IisKKyAgICAgICAgICAgICJcdWZmZmZcMVwxXDFcMlwxNlx1ZmZmZlwzMFwyXDEyXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjAzX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwM19lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDNfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjAzX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjAzX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIwM19taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIwM19tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMDNfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjAzX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwM19hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDNfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwM19zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMDNfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMDNfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMDNfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjAzX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDNfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjAzIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjAzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjAzOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMDNfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMDNfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMDNfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMDNfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMDNfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjAzX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMDNfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzNTM5NDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwM18xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwM18xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwM19JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwM18xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMDMsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDRfZW90UyA9CisgICAgICAgICJcMTE2XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwNF9lb2ZTID0KKyAgICAgICAgIlwxXDJcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwNF9taW5TID0KKyAgICAgICAgIlwxXDRcMVwwXDExNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDRfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVwxXDBcMTE0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwNF9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwNF9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMTE0XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyMDRfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDJcMlw0XHVmZmZmXDQzXDJcMTAzXHVmZmZmXDJcMlw3NFx1ZmZmZlwxXDJcMTciKworICAgICAgICAgICAgIlx1ZmZmZlwyXDJcMTZcdWZmZmZcM1wyXDFcMVwyNFwyXDEyXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjA0X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwNF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDRfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjA0X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjA0X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIwNF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIwNF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMDRfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjA0X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwNF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDRfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwNF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMDRfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMDRfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMDRfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjA0X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDRfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjA0IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjA0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjA0OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMDRfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMDRfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMDRfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMDRfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMDRfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjA0X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMDRfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzNTQyMjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA0XzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA0XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA0X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA0XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIwNCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwOV9lb3RTID0KKyAgICAgICAgIlwxMTZcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjA5X2VvZlMgPQorICAgICAgICAiXDFcNDFcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwOV9taW5TID0KKyAgICAgICAgIlwxXDRcNDBcMFw1NVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMDlfbWF4UyA9CisgICAgICAgICJcMVx1MDBmZVw0MFwwXDU1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwOV9hY2NlcHRTID0KKyAgICAgICAgIlw0MVx1ZmZmZlwxXDJcNTNcdWZmZmZcMVwxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIwOV9zcGVjaWFsUyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDBcMVwxXDFcMlwxXDNcMVw0XDFcNVwxXDZcMVw3XDFcMTBcMVwxMVwxXDEyXDFcMTNcMSIrCisgICAgICAgICJcMTRcMVwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNlwxXDI3XDFcMzAiKworICAgICAgICAiXDFcMzFcMVwzMlwxXDMzXDFcMzRcMVwzNVwxXDM2XDFcMzdcNTVcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIwOV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyN1wxXDFcMVwyM1wxXDI0XDFcMjVcNVx1ZmZmZlwyXDQxXDRcdWZmZmZcMTNcNDFcMVwxNVw2IisKKyAgICAgICAgICAgICJcNDFcMVwxMFwxXDdcNFw0MVwxXDZcNFw0MVwxXDJcMVwzXDFcNFwxXDVcMVwxNlwxXDIxXDEwM1x1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTJcMVw0MVw3NFx1ZmZmZlwxXDQxXDE3XHVmZmZmXDFcNDBcMVw0MVwxNlx1ZmZmZlwyXDQxXDEiKworICAgICAgICAgICAgIlwxN1wxXDIwXDJcNDFcMVwzMVwxXDQxXDFcMTNcM1w0MVwxXDMyXDFcMzNcMVwzNFwxXDExXDFcMjZcMSIrCisgICAgICAgICAgICAiXDMwXDFcMzVcMVwzNlwxXDM3XDFcNDFcMVwxNFwxXDQxXDEyXHVmZmZmXDJcNDFcMVx1ZmZmZlwxXDQxIisKKyAgICAgICAgICAgICJcMVwyMiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDlfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjA5X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIwOV9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMDlfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMDlfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjA5X21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjA5X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIwOV9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMDlfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjA5X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIwOV9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjA5X3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTIwOV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTIwOV90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIwOV90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyMDlfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIwOV90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEyMDkgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMDkoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyMDk7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTIwOV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIwOV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTIwOV9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTIwOV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIwOV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEyMDlfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIwOV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjM2NDc1OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8yID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8yID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8zID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8zID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV80ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV80ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV81ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV81ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV82ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV82ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV83ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV83ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDcgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV84ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV84ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDggOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV85ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV85ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDkgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8xMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMTAgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8xMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMTEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzExID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzEyID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8xMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8xMyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMTMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8xMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEzIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMTQgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzE0ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzE1ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8xNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzE1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8xNiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMTYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8xNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE2IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMTcgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzE3ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMTcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNyA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzE4ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8xOCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzE4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTggOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8xOSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMTkgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8xOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMjAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzIwID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMjApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzIxID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8yMSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8yMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMjIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8yMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIyIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMjMgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzIzID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMjMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMyA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzI0ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8yNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8yNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMjUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8yNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI1IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMjYgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzI2ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMjYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNiA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzI3ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8yNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzI3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8yOCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMjggPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8yOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI4IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMjkgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzI5ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMjkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjA5XzMwID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIwOV8zMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzMDlfSW50ZXJuYWxSZXBvcnREU0woKSkgKSB7cyA9IDc3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjA5XzMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIwOV8zMSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMDlfMzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzA5X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIwOV8zMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDMxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMDlfMzIgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjA5XzMyID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMwOV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMDlfMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIwOSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxOF9lb3RTID0KKyAgICAgICAgIlwxMTdcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjE4X2VvZlMgPQorICAgICAgICAiXDFcMlwxMTZcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjE4X21pblMgPQorICAgICAgICAiXDFcNFwxXDBcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxOF9tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDFcMFwxMTVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjE4X2FjY2VwdFMgPQorICAgICAgICAiXDJcdWZmZmZcMVwyXDExM1x1ZmZmZlwxXDEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjE4X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFwxMTVcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxOF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcMlwyXDRcdWZmZmZcMTNcMlwxXDFcMjdcMlwxMDNcdWZmZmZcMlwyXDc0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVwyXDE3XHVmZmZmXDJcMlwxNlx1ZmZmZlwzMFwyXDFcdWZmZmZcMVwyXDEwXHVmZmZmXDJcMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMlwyIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxOF9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMThfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjE4X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxOF9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxOF9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMThfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMThfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjE4X21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxOF9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMThfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjE4X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMThfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjE4X3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjE4X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMjE4X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIxOF90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjE4X3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIxOCBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIxOChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIxODsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMjE4X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjE4X2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjE4X21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMjE4X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjE4X2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIxOF9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjE4X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMzgwNTQ6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjE4XzEgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjE4XzEgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMzE4X0ludGVybmFsUmVwb3J0RFNMKCkpICkge3MgPSA3ODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjE4XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxOCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIyMV9lb3RTID0KKyAgICAgICAgIlwxMTdcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjIxX2VvZlMgPQorICAgICAgICAiXDFcMlwxMTZcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjIxX21pblMgPQorICAgICAgICAiXDFcNFwxXDBcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIyMV9tYXhTID0KKyAgICAgICAgIlwxXHUwMGZlXDFcMFwxMTVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjIxX2FjY2VwdFMgPQorICAgICAgICAiXDJcdWZmZmZcMVwyXDExM1x1ZmZmZlwxXDEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXHVmZmZmXDFcMFwxMTVcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIyMV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcMlwyXDRcdWZmZmZcMTNcMlwxXDFcMjdcMlwxMDNcdWZmZmZcMlwyXDc0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVwyXDE3XHVmZmZmXDJcMlwxNlx1ZmZmZlwzMFwyXDFcdWZmZmZcMVwyXDEwXHVmZmZmXDJcMlwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMlwyIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIyMV9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMjFfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjIxX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIyMV9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIyMV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMjFfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMjFfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjIxX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIyMV9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMjFfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjIxX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMjFfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjIxX3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjIxX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMjIxX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIyMV90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjIxX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIyMSBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIyMTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMjIxX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjIxX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjIxX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMjIxX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjIxX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIyMV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjIxX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMzgzNjU6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIyMV8xID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIyMV8xID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDMyMV9JbnRlcm5hbFJlcG9ydERTTCgpKSApIHtzID0gNzg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIyMV8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMjEsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMjlfZW90UyA9CisgICAgICAgICJcMzRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjI5X2VvZlMgPQorICAgICAgICAiXDFcMTBcMzNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjI5X21pblMgPQorICAgICAgICAiXDFcMTEwXDFcNVw0XDBcMVw2XDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w1M1wxXDBcMTFcMTczXDEiKworICAgICAgICAiXDdcMVwwXDJcNTMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjI5X21heFMgPQorICAgICAgICAiXDFcdTAwZjJcMVw1XDRcMFwxXDEwXDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w3NlwxXDBcMTFcMTczIisKKyAgICAgICAgIlwxXDEwXDFcMFwyXDc2IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIyOV9hY2NlcHRTID0KKyAgICAgICAgIlwxMFx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDFcMjFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjI5X3NwZWNpYWxTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcM1wxXDRcMVwxXDFcMFwxXHVmZmZmXDFcNVw2XHVmZmZmXDFcNlwxMlx1ZmZmZlwxXDJcMiIrCisgICAgICAgICJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIyOV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyXDFcM1wxXDRcNjBcdWZmZmZcMVw3XDI2XHVmZmZmXDFcMVwxXHVmZmZmXDFcNlwxMzVcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXDExIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcMTNcMVwxNFwxXDE1IiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDNcdWZmZmZcMVwzMFw3XHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDEiKworICAgICAgICAgICAgIlwyNVwxXDI2IiwKKyAgICAgICAgICAgICJcMVwyN1wzXHVmZmZmXDFcMzBcN1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxIisKKyAgICAgICAgICAgICJcMjVcMVwyNiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMyXDFcMzMiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDEzXHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjI5X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIyOV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMjlfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjI5X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjI5X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIyOV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIyOV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMjlfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjI5X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIyOV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMjlfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIyOV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMjlfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMjlfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMjlfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjI5X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMjlfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjI5IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjI5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjI5OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMjlfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMjlfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMjlfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMjlfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMjlfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjI5X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMjlfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzOTYyNToyOiAoIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18xICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMjlfNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMjlfNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzMV9JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDIpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIyOV81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjI5XzQgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjI5XzQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzFfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMjlfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIyOV8yNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMjlfMjUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzFfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAzKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMjlfMjUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMjlfMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMjlfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzMV9JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIyOV8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjI5XzMgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjI5XzMgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzFfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMjlfMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIyOV83ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIyOV83ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzeW5wcmVkMzMxX0ludGVybmFsUmVwb3J0RFNMKCkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMykgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSkgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjI5XzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMjlfMTQgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjI5XzE0ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzeW5wcmVkMzMxX0ludGVybmFsUmVwb3J0RFNMKCkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMCkgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSkgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjI5XzE0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMjksIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzBfZW90UyA9CisgICAgICAgICJcMzRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMwX2VvZlMgPQorICAgICAgICAiXDFcMTBcMzNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMwX21pblMgPQorICAgICAgICAiXDFcMTEwXDFcNVw0XDBcMVw2XDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w1M1wxXDBcMTFcMTczXDEiKworICAgICAgICAiXDdcMVwwXDJcNTMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMwX21heFMgPQorICAgICAgICAiXDFcdTAwZjJcMVw1XDRcMFwxXDEwXDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w3NlwxXDBcMTFcMTczIisKKyAgICAgICAgIlwxXDEwXDFcMFwyXDc2IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzMF9hY2NlcHRTID0KKyAgICAgICAgIlwxMFx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDFcMjFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMwX3NwZWNpYWxTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMVwxXDZcMVwzXDFcNFwxXHVmZmZmXDFcMFw2XHVmZmZmXDFcMlwxMlx1ZmZmZlwxXDVcMiIrCisgICAgICAgICJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIzMF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyXDFcM1wxXDRcNjBcdWZmZmZcMVw3XDI2XHVmZmZmXDFcMVwxXHVmZmZmXDFcNlwxMzVcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXDExIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcMTNcMVwxNFwxXDE1IiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDNcdWZmZmZcMVwzMFw3XHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDEiKworICAgICAgICAgICAgIlwyNVwxXDI2IiwKKyAgICAgICAgICAgICJcMVwyN1wzXHVmZmZmXDFcMzBcN1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxIisKKyAgICAgICAgICAgICJcMjVcMVwyNiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMyXDFcMzMiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDEzXHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMwX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzBfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMwX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjMwX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzMF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIzMF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMzBfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMwX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzBfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMzBfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMzBfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMzBfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjMwX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzBfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjMwIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjMwKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjMwOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMzBfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMzBfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMzBfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMzBfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMzBfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjMwX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMzBfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzOTYzODoyOiAoIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18yICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzBfNyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzBfNyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzMl9JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDMpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMF83KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjMwXzIgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjMwXzIgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzBfMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzMF8xNCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzBfMTQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAwKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzBfMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzBfNCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzBfNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzMl9JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMF80KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjMwXzUgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjMwXzUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAyKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzBfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzMF8yNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzBfMjUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzJfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAzKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzBfMjUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzBfMyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzBfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzMl9JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMF8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMzAsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzFfZW90UyA9CisgICAgICAgICJcMzRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMxX2VvZlMgPQorICAgICAgICAiXDFcMTBcMzNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMxX21pblMgPQorICAgICAgICAiXDFcMTEwXDFcNVw0XDBcMVw2XDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w1M1wxXDBcMTFcMTczXDEiKworICAgICAgICAiXDdcMVwwXDJcNTMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMxX21heFMgPQorICAgICAgICAiXDFcdTAwZjJcMVw1XDRcMFwxXDEwXDFcMFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcM1w3NlwxXDBcMTFcMTczIisKKyAgICAgICAgIlwxXDEwXDFcMFwyXDc2IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzMV9hY2NlcHRTID0KKyAgICAgICAgIlwxMFx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDFcMjFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMxX3NwZWNpYWxTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMFwxXDZcMVw0XDFcM1wxXHVmZmZmXDFcNVw2XHVmZmZmXDFcMVwxMlx1ZmZmZlwxXDJcMiIrCisgICAgICAgICJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIzMV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyXDFcM1wxXDRcNjBcdWZmZmZcMVw3XDI2XHVmZmZmXDFcMVwxXHVmZmZmXDFcNlwxMzVcdWZmZmYiKworICAgICAgICAgICAgIlwxXDUiLAorICAgICAgICAgICAgIlwxXDExIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiXDFcMTNcMVwxNFwxXDE1IiwKKyAgICAgICAgICAgICJcMVx1ZmZmZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDNcdWZmZmZcMVwzMFw3XHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDEiKworICAgICAgICAgICAgIlwyNVwxXDI2IiwKKyAgICAgICAgICAgICJcMVwyN1wzXHVmZmZmXDFcMzBcN1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxIisKKyAgICAgICAgICAgICJcMjVcMVwyNiIsCisgICAgICAgICAgICAiXDFcdWZmZmYiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzEiLAorICAgICAgICAgICAgIlwxXDMyXDFcMzMiLAorICAgICAgICAgICAgIlwxXHVmZmZmIiwKKyAgICAgICAgICAgICJcMVwyN1wxM1x1ZmZmZlwxXDE3XDFcMjBcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcMjYiLAorICAgICAgICAgICAgIlwxXDI3XDEzXHVmZmZmXDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMxX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzFfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMxX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjMxX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzMV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIzMV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMzFfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMxX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzFfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMzFfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMzFfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMzFfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjMxX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzFfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjMxIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjMxKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjMxOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMzFfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMzFfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMzFfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMzFfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMzFfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjMxX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMzFfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzOTY1MToyOiAoIHJ1bGVfX0ZvbnRfX1Vub3JkZXJlZEdyb3VwX18zICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzFfMiA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzFfMiA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMV8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjMxXzE0ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIzMV8xNCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDApICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMV8xNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzMV8yNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzFfMjUgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzNfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAzKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzFfMjUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzFfNSA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzFfNSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDIpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMV81KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjMxXzQgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MjMxXzQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN5bnByZWQzMzNfSW50ZXJuYWxSZXBvcnREU0woKSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXgyMzFfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzMV83ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIzMV83ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzeW5wcmVkMzMzX0ludGVybmFsUmVwb3J0RFNMKCkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMykgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSkgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjMxXzcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzFfMyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzFfMyA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3lucHJlZDMzM19JbnRlcm5hbFJlcG9ydERTTCgpICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDIzMV8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIC0xO30KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMzEsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzJfZW90UyA9CisgICAgICAgICJcMjNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMyX2VvZlMgPQorICAgICAgICAiXDIzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzMl9taW5TID0KKyAgICAgICAgIlwxXDE3M1wyMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzJfbWF4UyA9CisgICAgICAgICJcMVx1MDBhNlwyMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzJfYWNjZXB0UyA9CisgICAgICAgICJcMVx1ZmZmZlwyMVwxXDFcMiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzJfc3BlY2lhbFMgPQorICAgICAgICAiXDFcMFwyMlx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjMyX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxXDIyXDdcdWZmZmZcMVwyMlwxNlx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDFcMVwzXDFcdWZmZmZcMVw0IisKKyAgICAgICAgICAgICJcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDFcMTJcMVwxM1wxXDE0XDFcMTVcMVwxNlwxXDE3XDFcMjBcMSIrCisgICAgICAgICAgICAiXDIxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzJfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMyX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIzMl9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzJfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMzJfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjMyX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjMyX21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzMl9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzJfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMyX2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIzMl9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMyX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTIzMl90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTIzMl90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIzMl90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyMzJfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzMl90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEyMzIgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMzIoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyMzI7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTIzMl9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIzMl9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTIzMl9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTIzMl9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIzMl9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEyMzJfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIzMl90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjM5Njg0OjI6ICggcnVsZV9fU3R5bGVfX1Vub3JkZXJlZEdyb3VwXzRfXzAgKT8iOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIzMl8wID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBMQTIzMl8wID09MTUwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDApICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMyXzAgPT0xNDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzJfMCA9PTE1MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAyKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDMpICkge3MgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMyXzAgPT0xNTQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCkgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzJfMCA9PTE1NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA1KSApIHtzID0gNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTU2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpICkge3MgPSA3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMyXzAgPT0xNTcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNykgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzJfMCA9PTE1OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA4KSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTU5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTYwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEwKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzJfMCA9PTE2MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMSkgKSB7cyA9IDEyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMyXzAgPT0xNjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTIpICkge3MgPSAxMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTYzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEzKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzJfMCA9PTE2NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNCkgKSB7cyA9IDE1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMyXzAgPT0xNjUgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTUpICkge3MgPSAxNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzMl8wID09MTY2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE2KSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjMyXzA9PTEyM3x8TEEyMzJfMD09MTMxKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjMyXzApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIzMiwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzM19lb3RTID0KKyAgICAgICAgIlwyMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzNfZW9mUyA9CisgICAgICAgICJcMjJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMzX21pblMgPQorICAgICAgICAiXDFcdTAwOTJcMjFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMzX21heFMgPQorICAgICAgICAiXDFcdTAwYTZcMjFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjMzX2FjY2VwdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwxXDFcMlwxXDNcMVw0XDFcNVwxXDZcMVw3XDFcMTBcMVwxMVwxXDEyXDFcMTNcMVwxNFwxIisKKyAgICAgICAgIlwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzM19zcGVjaWFsUyA9CisgICAgICAgICJcMVwwXDIxXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyMzNfdHJhbnNpdGlvblMgPSB7CisgICAgICAgICAgICAiXDFcMlwzXHVmZmZmXDFcMVwxXDNcMVx1ZmZmZlwxXDRcMVw1XDFcNlwxXDdcMVwxMFwxXDExXDFcMTIiKworICAgICAgICAgICAgIlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMzX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzM19lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzNfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjMzX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjMzX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzM19taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIzM19tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMzNfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjMzX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzM19hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzNfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzM19zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMzNfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMzNfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMzNfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjMzX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzNfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjMzIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjMzKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjMzOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMzNfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMzNfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMzNfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMzNfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMzNfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjMzX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMzNfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIzOTcwMDozOiAoICh7Li4ufT8gPT4gKCAoICggcnVsZV9fU3R5bGVfX0dyb3VwXzRfMF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xX18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX1N0eWxlX19Hcm91cF80XzJfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fU3R5bGVfX0dyb3VwXzRfM19fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF80X18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX1N0eWxlX19Hcm91cF80XzVfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fU3R5bGVfX0dyb3VwXzRfNl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF83X18wICkgKSApICkgfCAoey4uLn0/ID0+ICggKCAoIHJ1bGVfX1N0eWxlX19Hcm91cF80XzhfXzAgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoICggcnVsZV9fU3R5bGVfX0dyb3VwXzRfOV9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMV9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xMl9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xM19fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNF9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNV9fMCApICkgKSApIHwgKHsuLi59PyA9PiAoICggKCBydWxlX19TdHlsZV9fR3JvdXBfNF8xNl9fMCApICkgKSApICkiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIzM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIzM18wID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBMQTIzM18wID09MTUwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDApICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMzXzAgPT0xNDYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMSkgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzNfMCA9PTE1MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAyKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDMpICkge3MgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMzXzAgPT0xNTQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCkgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzNfMCA9PTE1NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA1KSApIHtzID0gNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTU2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpICkge3MgPSA3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMzXzAgPT0xNTcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNykgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzNfMCA9PTE1OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA4KSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTU5ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTYwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEwKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzNfMCA9PTE2MSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMSkgKSB7cyA9IDEyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMzXzAgPT0xNjIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTIpICkge3MgPSAxMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTYzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEzKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzNfMCA9PTE2NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNCkgKSB7cyA9IDE1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjMzXzAgPT0xNjUgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTUpICkge3MgPSAxNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzM18wID09MTY2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE2KSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjMzXzApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIzMywgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzNF9lb3RTID0KKyAgICAgICAgIlwyM1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzRfZW9mUyA9CisgICAgICAgICJcMVwyMlwyMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzRfbWluUyA9CisgICAgICAgICJcMVwxNzNcMjJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM0X21heFMgPQorICAgICAgICAiXDFcdTAwYTZcMjJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM0X2FjY2VwdFMgPQorICAgICAgICAiXDFcdWZmZmZcMjFcMVwxXDIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM0X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcMjJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIzNF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyMlw3XHVmZmZmXDFcMjJcMTZcdWZmZmZcMVwyXDNcdWZmZmZcMVwxXDFcM1wxXHVmZmZmXDFcNCIrCisgICAgICAgICAgICAiXDFcNVwxXDZcMVw3XDFcMTBcMVwxMVwxXDEyXDFcMTNcMVwxNFwxXDE1XDFcMTZcMVwxN1wxXDIwXDEiKworICAgICAgICAgICAgIlwyMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjM0X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzRfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjM0X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjM0X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzNF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIzNF9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMzRfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjM0X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNF9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzRfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMzRfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMzRfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMzRfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjM0X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzRfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjM0IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjM0KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjM0OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMzRfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMzRfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMzRfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMzRfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMzRfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjM0X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMzRfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI0MDAwNjoyOiAoIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18xICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMzRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyMzRfMCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTEEyMzRfMCA9PTE1MCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAwKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzNF8wID09MTQ2ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjM0XzAgPT0xNTEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMikgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE1MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAzKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzNF8wID09MTU0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDQpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjM0XzAgPT0xNTUgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNSkgKSB7cyA9IDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE1NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA2KSApIHtzID0gNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzNF8wID09MTU3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDcpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjM0XzAgPT0xNTggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgOCkgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE1OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA5KSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE2MCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMCkgKSB7cyA9IDExO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjM0XzAgPT0xNjEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTEpICkge3MgPSAxMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzNF8wID09MTYyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEyKSApIHtzID0gMTM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE2MyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMykgKSB7cyA9IDE0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjM0XzAgPT0xNjQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTQpICkge3MgPSAxNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzNF8wID09MTY1ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE1KSApIHtzID0gMTY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyMzRfMCA9PTE2NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNikgKSB7cyA9IDE3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIzNF8wPT1FT0Z8fExBMjM0XzA9PTEyM3x8TEEyMzRfMD09MTMxKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4MjM0XzApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIzNCwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIzNV9lb3RTID0KKyAgICAgICAgIlwyM1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzVfZW9mUyA9CisgICAgICAgICJcMVwyMlwyMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMzVfbWluUyA9CisgICAgICAgICJcMVwxNzNcMjJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM1X21heFMgPQorICAgICAgICAiXDFcdTAwYTZcMjJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM1X2FjY2VwdFMgPQorICAgICAgICAiXDFcdWZmZmZcMjFcMVwxXDIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjM1X3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcMjJcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIzNV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMVwyMlw3XHVmZmZmXDFcMjJcMTZcdWZmZmZcMVwyXDNcdWZmZmZcMVwxXDFcM1wxXHVmZmZmXDFcNCIrCisgICAgICAgICAgICAiXDFcNVwxXDZcMVw3XDFcMTBcMVwxMVwxXDEyXDFcMTNcMVwxNFwxXDE1XDFcMTZcMVwxN1wxXDIwXDEiKworICAgICAgICAgICAgIlwyMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjM1X2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzVfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjM1X2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjM1X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIzNV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIzNV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMzVfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjM1X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMzVfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIzNV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMzVfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMzVfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMzVfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjM1X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMzVfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjM1IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjM1KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjM1OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMzVfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMzVfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMzVfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMzVfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMzVfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjM1X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMzVfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICI0MDAxOToyOiAoIHJ1bGVfX1N0eWxlX19Vbm9yZGVyZWRHcm91cF80X18yICk/IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9pbnRlcm5hbC9SZXBvcnREU0xBY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvaW50ZXJuYWwvUmVwb3J0RFNMQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5N2U0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvaW50ZXJuYWwvUmVwb3J0RFNMQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLlNoYXJlZFN0YXRlTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnV0aWwuTW9kdWxlczI7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZC4gQ3VzdG9taXphdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIGEgbmV3bHkKKyAqIGludHJvZHVjZWQgc3ViY2xhc3MuIAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9SRVBPUlREU0xfUkVQT1JURFNMID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUmVwb3J0RFNMQWN0aXZhdG9yLmNsYXNzKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBSZXBvcnREU0xBY3RpdmF0b3IgSU5TVEFOQ0U7CisJCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbmplY3Rvcj4gaW5qZWN0b3JzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKE1hcHMuPFN0cmluZywgSW5qZWN0b3I+IG5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDEpKTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJSU5TVEFOQ0UgPSB0aGlzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluamVjdG9ycy5jbGVhcigpOworCQlJTlNUQU5DRSA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgUmVwb3J0RFNMQWN0aXZhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCXB1YmxpYyBJbmplY3RvciBnZXRJbmplY3RvcihTdHJpbmcgbGFuZ3VhZ2UpIHsKKwkJc3luY2hyb25pemVkIChpbmplY3RvcnMpIHsKKwkJCUluamVjdG9yIGluamVjdG9yID0gaW5qZWN0b3JzLmdldChsYW5ndWFnZSk7CisJCQlpZiAoaW5qZWN0b3IgPT0gbnVsbCkgeworCQkJCWluamVjdG9ycy5wdXQobGFuZ3VhZ2UsIGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3IobGFuZ3VhZ2UpKTsKKwkJCX0KKwkJCXJldHVybiBpbmplY3RvcjsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSW5qZWN0b3IgY3JlYXRlSW5qZWN0b3IoU3RyaW5nIGxhbmd1YWdlKSB7CisJCXRyeSB7CisJCQlNb2R1bGUgcnVudGltZU1vZHVsZSA9IGdldFJ1bnRpbWVNb2R1bGUobGFuZ3VhZ2UpOworCQkJTW9kdWxlIHNoYXJlZFN0YXRlTW9kdWxlID0gZ2V0U2hhcmVkU3RhdGVNb2R1bGUoKTsKKwkJCU1vZHVsZSB1aU1vZHVsZSA9IGdldFVpTW9kdWxlKGxhbmd1YWdlKTsKKwkJCU1vZHVsZSBtZXJnZWRNb2R1bGUgPSBNb2R1bGVzMi5taXhpbihydW50aW1lTW9kdWxlLCBzaGFyZWRTdGF0ZU1vZHVsZSwgdWlNb2R1bGUpOworCQkJcmV0dXJuIEd1aWNlLmNyZWF0ZUluamVjdG9yKG1lcmdlZE1vZHVsZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgaW5qZWN0b3IgZm9yICIgKyBsYW5ndWFnZSk7CisJCQlsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgaW5qZWN0b3IgZm9yICIgKyBsYW5ndWFnZSwgZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFJ1bnRpbWVNb2R1bGUoU3RyaW5nIGdyYW1tYXIpIHsKKwkJaWYgKE9SR19FQ0xJUFNFX09TQlBfWFRFWFRfUkVQT1JURFNMX1JFUE9SVERTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUnVudGltZU1vZHVsZSgpOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdyYW1tYXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFVpTW9kdWxlKFN0cmluZyBncmFtbWFyKSB7CisJCWlmIChPUkdfRUNMSVBTRV9PU0JQX1hURVhUX1JFUE9SVERTTF9SRVBPUlREU0wuZXF1YWxzKGdyYW1tYXIpKSB7CisJCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTFVpTW9kdWxlKHRoaXMpOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdyYW1tYXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFNoYXJlZFN0YXRlTW9kdWxlKCkgeworCQlyZXR1cm4gbmV3IFNoYXJlZFN0YXRlTW9kdWxlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL1JlcG9ydERTTEVPYmplY3RIb3Zlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL1JlcG9ydERTTEVPYmplY3RIb3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvUmVwb3J0RFNMRU9iamVjdEhvdmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRU9iamVjdEhvdmVyOworCisKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xFT2JqZWN0SG92ZXIgZXh0ZW5kcyBCYXNpY0RTTEVPYmplY3RIb3ZlciB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUVPYmplY3RIb3ZlclByb3ZpZGVyIGdldEhvdmVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBSZXBvcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlci5pbnN0YW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFiMjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL1JlcG9ydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIFJlcG9ydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBleHRlbmRzIEJhc2ljRFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyIHsKKworCXByaXZhdGUgc3RhdGljIFJlcG9ydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBJTlNUQU5DRTsKKworCXB1YmxpYyBzdGF0aWMgUmVwb3J0RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCXB1YmxpYyBSZXBvcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJCUlOU1RBTkNFID0gdGhpczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5pbnN0YW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL1JlcG9ydERTTEVPYmplY3RIb3ZlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYWZjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlclByb3ZpZGVyOworCisKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlciBleHRlbmRzIEJhc2ljRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgUmVwb3J0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgSU5TVEFOQ0U7CisJCisJcHVibGljIHN0YXRpYyBSZXBvcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwlwdWJsaWMgUmVwb3J0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJCUlOU1RBTkNFID0gdGhpczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBnZXREb2N1bWVudGF0aW9uSG92ZXJQcm92aWRlcigpIHsKKwkJcmV0dXJuIFJlcG9ydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5pbnN0YW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTljYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmNvbnN0YW50cy5HZW5lcmF0b3JDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yOworCisKKworLyoqCisgKiBEb2N1bWVudGF0aW9uIFRyYW5zbGF0b3IgZm9yIFJlcG9ydERTTAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBleHRlbmRzIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgeworCQorCXByaXZhdGUgc3RhdGljIFJlcG9ydERTTFVpRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvcigpOworCisJLyoqCisJICogQHJldHVybiB0aGUgb25lIGFuZCBvbmx5IHRyYW5zbGF0b3IgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShHZW5lcmF0b3JDb25zdGFudHMuSTE4Tl9SRVNPVVJDRV9GVUxMX0JVTkRMRV9OQU1FLCBnZXRMb2NhbGUoKSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvUmVwb3J0RFNMVWlNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9SZXBvcnREU0xVaU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDkxYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvUmVwb3J0RFNMVWlNb2R1bGUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhvdmVyLklFT2JqZWN0SG92ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhvdmVyLklFT2JqZWN0SG92ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMVWlNb2R1bGVIZWxwZXI7CisKKy8qKgorICogVXNlIHRoaXMgY2xhc3MgdG8gcmVnaXN0ZXIgY29tcG9uZW50cyB0byBiZSB1c2VkIHdpdGhpbiB0aGUgSURFLgorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMVWlNb2R1bGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5BYnN0cmFjdFJlcG9ydERTTFVpTW9kdWxlIHsKKwkKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVwb3J0RFNMVWlNb2R1bGUuY2xhc3MpOworCQorCXB1YmxpYyBSZXBvcnREU0xVaU1vZHVsZShBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbikgeworCQlzdXBlcihwbHVnaW4pOworCQlCYXNpY0RTTFVpTW9kdWxlSGVscGVyLnVuaXRUZXN0VGVtcGxhdGVzKHBsdWdpbiwgTE9HR0VSKTsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElFT2JqZWN0SG92ZXI+IGJpbmRJRU9iamVjdEhvdmVyKCkgeworICAgICAgICByZXR1cm4gUmVwb3J0RFNMRU9iamVjdEhvdmVyLmNsYXNzOworICAgIH0KKworCUBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUVPYmplY3RIb3ZlclByb3ZpZGVyPiBiaW5kSUVPYmplY3RIb3ZlclByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gUmVwb3J0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuY2xhc3M7CisgICAgfQorCSAKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI+IGJpbmRJRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gUmVwb3J0RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmNsYXNzOworICAgIH0KKyAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L1JlcG9ydERTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9SZXBvcnREU0xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTI0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9SZXBvcnREU0xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsMzEzIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdAorCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuY29udGVudGFzc2lzdC5CYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RW50aXR5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkNvbG9yVXRpbGl0aWVzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuUmVwb3J0RFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQXNzaWdubWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LktleXdvcmQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi51aS5jb250ZW50YXNzaXN0LlRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlJlcGxhY2VtZW50VGV4dEFwcGxpZXIKKworY2xhc3MgQ29sb3JUZXh0QXBwbGllciBleHRlbmRzIFJlcGxhY2VtZW50VGV4dEFwcGxpZXIgeworCXZhciBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0CisKKwlkZWYgc2V0Q29udGV4dChDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQKKwl9CisKKwkvLyB0aGlzIHdpbGwgaW5qZWN0IGEgZmlsZSBkaWFsb2cgd2hlbiBzZWxlY3RpbmcgdGhlIGZpbGUgcGlja2VyIHByb3Bvc2FsIAorCW92ZXJyaWRlIGdldEFjdHVhbFJlcGxhY2VtZW50U3RyaW5nKENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgeworCQl2YXIgZGlzcGxheSA9IGNvbnRleHQuZ2V0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmdldERpc3BsYXkoKTsKKwkJdmFyIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOworCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CisJCXZhciBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7CisJCWlmICgoY29udGV4dC5jdXJyZW50TW9kZWwgYXMgQ29sb3IpLmNvbG9yIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQl0cnkgeworCQkJCXZhciBhd3RDb2xvciA9IENvbG9yVXRpbGl0aWVzLmNvbnZlcnRUb0F3dENvbG9yKGNvbnRleHQuY3VycmVudE1vZGVsIGFzIENvbG9yKTsKKwkJCQljb2xvckRpYWxvZy5zZXRSR0IobmV3IFJHQihhd3RDb2xvci5yZWQsIGF3dENvbG9yLmdyZWVuLCBhd3RDb2xvci5ibHVlKSk7CisJCQl9IGZpbmFsbHkgeworCQkJfQorCQl9CisJCXZhciBuZXdDb2xvciA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKKwkJaWYgKG5ld0NvbG9yICE9IG51bGwpIHsKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCJcIiMlMDJ4JTAyeCUwMnhcIiIsIG5ld0NvbG9yLnJlZCwgbmV3Q29sb3IuZ3JlZW4sIG5ld0NvbG9yLmJsdWUpOworCQl9CisJfQorfQorCisvKioKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNjb250ZW50QXNzaXN0IG9uIGhvdyB0byBjdXN0b21pemUgY29udGVudCBhc3Npc3RhbnQKKyAqLworY2xhc3MgUmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlciB7CisKKwlASW5qZWN0IFRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIgcHJvdmlkZXIKKwlASW5qZWN0IEJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlcgorCisJb3ZlcnJpZGUgdm9pZCBjb21wbGV0ZUNvbG9yX0NvbG9yKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXZhciBjb2xvciA9IGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiU2VsZWN0IGNvbG9yLi4uIiwgY29udGV4dCkgYXMgQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsCisJCWlmIChjb2xvciAhPSBudWxsKSB7CisJCQl2YXIgYXBwbGllciA9IG5ldyBDb2xvclRleHRBcHBsaWVyKCkKKwkJCWFwcGxpZXIuc2V0Q29udGV4dChjb250ZXh0KQorCQkJY29sb3Iuc2V0VGV4dEFwcGxpZXIgPSBhcHBsaWVyCisJCX0KKwkJYWNjZXB0b3IuYWNjZXB0KGNvbG9yKQorCX0KKworCS8qKgorCSAqIFRoaXMgb3ZlcnJpZGUgd2lsbCBlbmFibGUgMSBsZW5ndGggbm9uIGxldHRlciBjaGFyYWN0ZXJzIGFzIGtleXdvcmQuCisJICovCisJb3ZlcnJpZGUgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXl3b3JkV29ydGh5VG9Qcm9wb3NlKEtleXdvcmQga2V5d29yZCkgeworCQl0cnVlCisJfQorCisJZGVmIGdldENvbnRhaW5pbmdEYXRhbWFydFRhYmxlKEVPYmplY3QgbykgeworCQl2YXIgcmVzdWx0ID0gbworCQl3aGlsZSAoIShyZXN1bHQgaW5zdGFuY2VvZiBEYXRhbWFydFRhYmxlKSAmJiAocmVzdWx0LmVDb250YWluZXIgIT0gbnVsbCkpIHsKKwkJCXJlc3VsdCA9IHJlc3VsdC5lQ29udGFpbmVyCisJCX0KKwkJcmV0dXJuIHJlc3VsdCBhcyBEYXRhbWFydFRhYmxlCisJfQorCisJb3ZlcnJpZGUgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwgU3RyaW5nIHByZWZpeCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworCQlpZiAoIXN1cGVyLmlzVmFsaWRQcm9wb3NhbChwcm9wb3NhbCwgcHJlZml4LCBjb250ZXh0KSkgeworCQkJcmV0dXJuIGZhbHNlCisJCX0gZWxzZSB7CisKKwkJCS8vCQkJdmFyIGN1cnJlbnRNb2RlbCA9IGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisJCQkvLwkJaWYgKGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCkgaW5zdGFuY2VvZiBEYXRhbWFydCkgeworCQkJLy8JCQlyZXR1cm4gaXNEYXRhbWFydFZhbGlkUHJvcG9zYWwoY29udGV4dCwgcHJvcG9zYWwpCisJCQkvLwkJfQorCQkJLy8JCQlzd2l0Y2ggKGN1cnJlbnRNb2RlbCkgeworCQkJLy8JCQkJQ0NUYWJsZVByb3BlcnR5OiAJeworCQkJLy8JCQkJCXZhciBzb3VyY2UgPSBnZXRDb250YWluaW5nRGF0YW1hcnRUYWJsZShjdXJyZW50TW9kZWwpLmRhdGFtYXJ0UmVmLnNvdXJjZQorCQkJLy8JCQkJCXN3aXRjaCAoc291cmNlKSB7CisJCQkvLwkJCQkJCUNDRGF0YW1hcnRFbnRpdHk6IAlyZXR1cm4gZGF0YW1hcnRFbnRpdHlDb250YWluc1Byb3BlcnR5KHNvdXJjZSwgcHJvcG9zYWwpCisJCQkvLwkJCQkJCWRlZmF1bHQ6CQkJcmV0dXJuIHRydWUKKwkJCS8vCQkJCQl9CisJCQkvLwkJCQl9CisJCQkvLwkJCQlkZWZhdWx0OiAJCQlyZXR1cm4gdHJ1ZSAvL3N1cGVyLmlzVmFsaWRQcm9wb3NhbChwcm9wb3NhbCwgcHJlZml4LCBjb250ZXh0KQorCQkJLy8JCQl9CisJCQlyZXR1cm4gdHJ1ZQorCQl9CisJfQorCisJZGVmIHByb3RlY3RlZCBib29sZWFuIGRhdGFtYXJ0RW50aXR5Q29udGFpbnNQcm9wZXJ0eShEYXRhbWFydEVudGl0eSBlbnRpdHksIFN0cmluZyBwcm9wb3NhbCkgeworCQlmb3IgKG5hdmlnYXRpb24gOiBlbnRpdHkubmF2aWdhdGlvbnMpIHsKKwkJCWlmIChkYXRhbWFydEVudGl0eUNvbnRhaW5zUHJvcGVydHkobmF2aWdhdGlvbi5kYXRhbWFydEVudGl0eSwgcHJvcG9zYWwpKSB7CisJCQkJcmV0dXJuIHRydWUKKwkJCX0KKwkJfQorCQlmb3IgKHByb3BlcnR5IDogZW50aXR5LnByb3BlcnRpZXMpIHsKKwkJCS8vCQkJdmFsIGF0dHJpYnV0ZSA9IHByb3BlcnR5LnByb3BlcnR5UmVmIGFzIExFbnRpdHlBdHRyaWJ1dGUKKwkJCS8vCQkJaWYJKGF0dHJpYnV0ZS5uYW1lLmVxdWFscyhwcm9wb3NhbCkpIHsKKwkJCS8vCQkJCXJldHVybiB0cnVlCisJCQkvLwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2UKKwl9CisKKwkvLwlkZWYgaXNEYXRhbWFydFZhbGlkUHJvcG9zYWwoQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgU3RyaW5nIHByb3Bvc2FsKSB7CisJLy8JCXZhciBlT2JqID0gY29udGV4dC5jdXJyZW50TW9kZWwKKwkvLwkJd2hpbGUgKCEoZU9iaiBpbnN0YW5jZW9mIERhdGFtYXJ0KSkgeworCS8vCQkJZU9iaiA9IGVPYmouZUNvbnRhaW5lcgorCS8vCQl9CisJLy8JCQorCS8vCQlyZXR1cm4gdHJ1ZQorCS8vCX0KKwkvKioKKwkgKiBAc2VlIEJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlciNnZXRLZXl3b3JkRGlzcGxheVN0cmluZyhLZXl3b3JkLCBCYXNpY0RTTFVpVHJhbnNsYXRvcikKKwkgKiBAcGFyYW0ga2V5d29yZCB0aGUga2V5d29yZCB0byBnZXQgdGhlIGRpc3BsYXllZCBzdHJpbmcgZm9yCisJICogQHJldHVybiB0aGUgZGlzcGxheWVkIHN0cmluZworCSAqLworCW92ZXJyaWRlIHByb3RlY3RlZCBTdHlsZWRTdHJpbmcgZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoS2V5d29yZCBrZXl3b3JkKSB7CisJCXJldHVybiBCYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIuZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoa2V5d29yZCwKKwkJCVJlcG9ydERTTFVpRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuaW5zdGFuY2UoKSkKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9RdWFsaWZpZWROYW1lKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKKwl9CisKKwlvdmVycmlkZSBjb21wbGV0ZV9VbnNpZ25lZE51bWJlcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVySGVscGVyLmNyZWF0ZU51bWJlclByb3Bvc2FsKGNvbnRleHQsIGFjY2VwdG9yLCBydWxlQ2FsbCwgdGhpcykKKwl9CisKKwlvdmVycmlkZSBjb21wbGV0ZV9TaWduZWROdW1iZXIoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlckhlbHBlci5jcmVhdGVOdW1iZXJQcm9wb3NhbChjb250ZXh0LCBhY2NlcHRvciwgcnVsZUNhbGwsIHRoaXMpCisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlbGVnYXRlcyB0byBUZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyIC0tLS0tLS0tLS0tLS0tLS0tCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVfSU5UKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfSU5UKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVfSUQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCisJCUlDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9JRChtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1RSQU5TTEFUQUJMRVNUUklORyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVTdHJpbmdMb29rdXBfTG9va3VwVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRQYWNrYWdlX0V4dGVybmFsQ3NzVVJJKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSUJ1bmRsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9FeHRlcm5hbENzc1VSSShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9FeHRlcm5hbENzc1VSSUJ1bmRsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZUZvbnRfRmFtaWx5KEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlVW9tb0Zvcm1hdF9VaV9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlTnVtYmVyRm9ybWF0X1VpX3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVDdXJyZW5jeUZvcm1hdF9VaV9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZUZvcm1hdF9VaV9wYXR0ZXJuKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZVRpbWVGb3JtYXRfVWlfcGF0dGVybihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVRpbWVGb3JtYXRfVWlfcGF0dGVybihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVVvbW9Gb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVOdW1iZXJGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVDdXJyZW5jeUZvcm1hdF9SZXBvcnRfcGF0dGVybihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVEYXRlVGltZUZvcm1hdF9SZXBvcnRfcGF0dGVybihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVRpbWVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnREZXNpZ25GaWxlX05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUZvcm1hdHRlcl9Gb3JtYXQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUltYWdlX0ltYWdlUGF0aFBhdHRlcm4oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUltYWdlX1Jlc2l6ZVN0cmluZyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlSWNvbl9JY29uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlSW1hZ2VfRmlsZW5hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpIGFzIFJ1bGVDYWxsKSwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvbGFiZWxpbmcvUmVwb3J0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2xhYmVsaW5nL1JlcG9ydERTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGEyODBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2xhYmVsaW5nL1JlcG9ydERTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDM4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmxhYmVsaW5nCisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklFT2JqZWN0RGVzY3JpcHRpb24KKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworY2xhc3MgUmVwb3J0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkubGFiZWwuRGVmYXVsdERlc2NyaXB0aW9uTGFiZWxQcm92aWRlciB7CisKKwkvLyBMYWJlbHMgYW5kIGljb25zIGNhbiBiZSBjb21wdXRlZCBsaWtlIHRoaXM6CisJCisvLwlvdmVycmlkZSB0ZXh0KElFT2JqZWN0RGVzY3JpcHRpb24gZWxlKSB7CisvLwkJZWxlLm5hbWUudG9TdHJpbmcKKy8vCX0KKy8vCSAKKy8vCW92ZXJyaWRlIGltYWdlKElFT2JqZWN0RGVzY3JpcHRpb24gZWxlKSB7CisvLwkJZWxlLkVDbGFzcy5uYW1lICsgJy5naWYnCisvLwl9CSAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9sYWJlbGluZy9SZXBvcnREU0xMYWJlbFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2xhYmVsaW5nL1JlcG9ydERTTExhYmVsUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMTM5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9sYWJlbGluZy9SZXBvcnREU0xMYWJlbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsMzk5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmxhYmVsaW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcAoraW1wb3J0IGphdmEudXRpbC5NYXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Gb250RGVzY3JpcHRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmcKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmxhYmVsaW5nLkJhc2ljRFNMTGFiZWxQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5MYWJlbAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZURldGFpbAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlcworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXRzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJTdWJUaXRsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQ2VsbENvbG9yCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5SW50ZXJ2YWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUludGVydmFsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVMb29rdXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckludGVydmFsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVHJlbmQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEVsZW1lbnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGl0bGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vb21vRm9ybWF0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW0uQUNvbnRhaW5lckl0ZW0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5sYWJlbC5TdHlsZXJGYWN0b3J5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkNvbG9yVXRpbGl0aWVzCisKKy8qKgorICogUHJvdmlkZXMgbGFiZWxzIGZvciBhIEVPYmplY3RzLgorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNsYWJlbFByb3ZpZGVyCisgKi8KK2NsYXNzIFJlcG9ydERTTExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNpY0RTTExhYmVsUHJvdmlkZXIgeworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZT4gZkNhY2hlZEltYWdlcworCisJLyoqCisJICogQHBhcmFtIHN3dENvbG9yICAgU1dUIGNvbG9yCisJICogQHBhcmFtIHNpemUgCQkgb3V0bGluZUltZ1NpemUgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UKKwkgKiBAcmV0dXJuIGEgLSBjYWNoZWQgLSBTV1QgaW1hZ2Ugb2JqZWN0CisJICovCisJZGVmIHB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZ2V0Q29sb3JJbWFnZShvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3Igc3d0Q29sb3IsIG91dGxpbmVJbWdTaXplIHNpemUpIHsKKwkJcmV0dXJuIGdldENvbG9ySW1hZ2Uoc3d0Q29sb3IsIHNpemUuZ2V0V2lkdGgsIHNpemUuZ2V0SGVpZ2h0KQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBzd3RDb2xvciBTV1QgY29sb3IKKwkgKiBAcGFyYW0gd2lkdGggICAgb2YgdGhlIHJlY3Rhbmd1bGFyIGltYWdlCisJICogQHBhcmFtIGhlaWdodCAgIG9mIHRoZSByZWN0YW5ndWxhciBpbWFnZQorCSAqIEByZXR1cm4gYSAtIGNhY2hlZCAtIFNXVCByZWN0YW5ndWxhciBpbWFnZSBvYmplY3QKKwkgKi8KKwlkZWYgcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRDb2xvckltYWdlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBzd3RDb2xvciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisJCXRyeSB7CisJCQl2YXIgc3d0Q29sb3JOYW1lID0gJycnwqt3aWR0aMK7L8KraGVpZ2h0wrsvwqtzd3RDb2xvci5yZWTCuy/Cq3N3dENvbG9yLmdyZWVuwrsvwqtzd3RDb2xvci5ibHVlwrsnJycKKwkJCXZhciBpbWFnZSA9IGZDYWNoZWRJbWFnZXMuZ2V0KHN3dENvbG9yTmFtZSkKKwkJCWlmCShpbWFnZSA9PSBudWxsKSB7CisJCQkJLy92YXIgc3d0QmxhY2sgPSBuZXcgQ29sb3IobnVsbCwwLDAsMCkKKwkJCQlpbWFnZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UobnVsbCwgbmV3IFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSkKKwkJCQl2YXIgZ2MgPSBuZXcgR0MoaW1hZ2UpCisJCQkJZ2Muc2V0QmFja2dyb3VuZChzd3RDb2xvcikKKwkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDE2LCAxNikKKwkJCQkvL2djLmZpbGxPdmFsKDAsMCwxNSwxNSkKKwkJCQkvL2djLnNldEZvcmVncm91bmQoc3d0QmxhY2spCisJCQkJLy9nYy5kcmF3UmVjdGFuZ2xlKDAsMCwxNSwxNSkKKwkJCQlnYy5kaXNwb3NlCisJCQkJc3d0Q29sb3IuZGlzcG9zZQorCQkJCS8vc3d0QmxhY2suZGlzcG9zZQorCQkJCWZDYWNoZWRJbWFnZXMucHV0KHN3dENvbG9yTmFtZSwgaW1hZ2UpCisJCQl9CisJCQlyZXR1cm4gaW1hZ2UKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBnZXRFcnJvckltYWdlKCkKKwkJfQorCX0KKworCWRlZiBwcml2YXRlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRDb2xvcihTdHJpbmcgbmFtZSkgeworCQl2YXIgYXd0Rm9yZSA9IENvbG9yVXRpbGl0aWVzLmNvbnZlcnRUb0F3dENvbG9yKG5hbWUpCisJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIGF3dEZvcmUucmVkLCBhd3RGb3JlLmdyZWVuLCBhd3RGb3JlLmJsdWUpCisJfQorCisJZGVmIHByaXZhdGUgUkdCIGdldFJHQihTdHJpbmcgbmFtZSkgeworCQl2YXIgYXd0Rm9yZSA9IENvbG9yVXRpbGl0aWVzLmNvbnZlcnRUb0F3dENvbG9yKG5hbWUpCisJCXJldHVybiBuZXcgUkdCKGF3dEZvcmUucmVkLCBhd3RGb3JlLmdyZWVuLCBhd3RGb3JlLmJsdWUpCisJfQorCisJZGVmIHByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldENvbG9ySW1hZ2UoQ29sb3IgY29sb3IpIHsKKwkJdmFyIGNvbG9yTmFtZSA9IEFDb250YWluZXJJdGVtLmFwcGx5Q29sb3IoY29sb3IpCisJCXZhciBzd3RGb3JlID0gZ2V0Q29sb3IoY29sb3JOYW1lKQorCQlyZXR1cm4gZ2V0Q29sb3JJbWFnZShzd3RGb3JlIGFzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciwgb3V0bGluZUltZ1NpemUuU01BTEwpCisJfQorCisJQEluamVjdAorCW5ldyhBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGUpIHsKKwkJc3VwZXIoZGVsZWdhdGUpOworCQlmQ2FjaGVkSW1hZ2VzID0gbmV3IEhhc2hNYXAKKwl9CisKKwlkZWYgcHJpdmF0ZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBnZXRGb250KEZvbnQgbykgeworCQl2YXIgZmFtaWx5ID0gbnVsbCBhcyBTdHJpbmcKKwkJdmFyIHNpemUgPSAwCisJCXZhciBpdGFsaWMgPSAtMQorCQl2YXIgYm9sZCA9IDAKKwkJdmFyIHN0ZXAgPSBvCisJCXdoaWxlIChzdGVwICE9IG51bGwpIHsKKwkJCWlmCShmYW1pbHkgPT0gbnVsbCkgeworCQkJCWlmCShzdGVwLmZhbWlseSAhPSBudWxsKSB7CisJCQkJCXZhciBmID0gc3RlcC5mYW1pbHkKKwkJCQkJc3dpdGNoIChmKSB7CisJCQkJCQlCdWlsZEluRm9udEZhbWlseTogZmFtaWx5ID0gZi5jdXN0b20uZ2V0TmFtZSgpCisJCQkJCQlDdXN0b21Gb250RmFtaWx5OiAgZmFtaWx5ID0gZi5jdXN0b20KKwkJCQkJfQorCQkJCX0KKwkJCQlpZgkoKGJvbGQgPT0gMCkgJiYgc3RlcC5ib2xkKSB7CisJCQkJCWJvbGQgPSBTV1QuQk9MRAorCQkJCX0KKwkJCQlpZgkoaXRhbGljIDwgMCkgeworCQkJCQlzd2l0Y2ggKHN0ZXAuc3R5bGUpIHsKKwkJCQkJCWNhc2UgRm9udFN0eWxlLk5PUk1BTDoJaXRhbGljID0gMAorCQkJCQkJY2FzZSBGb250U3R5bGUuSVRBTElDOglpdGFsaWMgPSBTV1QuSVRBTElDCisJCQkJCQljYXNlIEZvbnRTdHlsZS5PQkxJUVVFOglpdGFsaWMgPSBTV1QuSVRBTElDCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzdGVwID0gc3RlcC5leHRlbmRzCisJCX0KKwkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChudWxsLCBmYW1pbHksIHNpemUsIGl0YWxpYytib2xkKQorCX0KKworCS8vIGh0dHA6Ly9oZWxwLmVjbGlwc2Uub3JnL2luZGlnby9pbmRleC5qc3A/dG9waWM9JTJGb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdiUyRnJlZmVyZW5jZSUyRmFwaSUyRm9yZyUyRmVjbGlwc2UlMkZqZmFjZSUyRnJlc291cmNlJTJGRm9udERlc2NyaXB0b3IuaHRtbAorCWRlZiBwdWJsaWMgU3R5bGVkU3RyaW5nIGdldFN0eWxlZFRleHQoRm9udCBvKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFN0eWxlZFN0cmluZygKKwkJCQlnZW5lcmF0ZVRleHQgKG8sIG51bGwpLAorCQkJCShuZXcgU3R5bGVyRmFjdG9yeSkuY3JlYXRlU3R5bGVyKEZvbnREZXNjcmlwdG9yLmNyZWF0ZUZyb20oZ2V0Rm9udChvKSksIG51bGwsIG51bGwpCisJCQkpCisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IFN0eWxlZFN0cmluZyhnZW5lcmF0ZVRleHQgKG8sIG51bGwpKQorCQl9CisJfQorCisJZGVmIHByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgZ2V0Rm9udChTdHlsZSBvKSB7CisJCXZhciBzdGVwID0gbworCQl3aGlsZSAoc3RlcCAhPSBudWxsKSB7CisJCQlpZgkoc3RlcC5mb250ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZ2V0Rm9udChzdGVwLmZvbnQpCisJCQl9CisJCQlzdGVwID0gc3RlcC5leHRlbmRzCisJCX0KKwl9CisKKwlkZWYgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9yZUNvbG9yKFN0eWxlIG8pIHsKKwkJdmFyIHN0ZXAgPSBvCisJCXdoaWxlIChzdGVwICE9IG51bGwpIHsKKwkJCWlmCShzdGVwLnRleHRjb2xvciAhPSBudWxsKSB7CisJCQkJcmV0dXJuIEFDb250YWluZXJJdGVtLmFwcGx5Q29sb3Ioc3RlcC50ZXh0Y29sb3IpCisJCQl9CisJCQlzdGVwID0gc3RlcC5leHRlbmRzCisJCX0KKwkJbnVsbAorCX0KKworCWRlZiBwcml2YXRlIFN0cmluZyBnZXRCYWNrQ29sb3IoU3R5bGUgbykgeworCQl2YXIgc3RlcCA9IG8KKwkJd2hpbGUgKHN0ZXAgIT0gbnVsbCkgeworCQkJaWYJKHN0ZXAuYmFja2dyb3VuZGNvbG9yICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gQUNvbnRhaW5lckl0ZW0uYXBwbHlDb2xvcihzdGVwLmJhY2tncm91bmRjb2xvcikKKwkJCX0KKwkJCXN0ZXAgPSBzdGVwLmV4dGVuZHMKKwkJfQorCQludWxsCisJfQorCisJZGVmIHByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyQ29sb3IoU3RyaW5nIGNvbG9yKSB7CisJCWlmCShjb2xvciAhPSBudWxsKSB7CisJCQl2YXIgbmFtZSA9ICJyZXBvcnRkc2xfIi5jb25jYXQoY29sb3IpCisJCQl2YXIgY29sb3JSZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKTsKKwkJCWlmCShjb2xvclJlZ2lzdHJ5LmdldChuYW1lKSA9PSBudWxsKSB7CisJCQkJY29sb3JSZWdpc3RyeS5wdXQobmFtZSwgZ2V0UkdCKGNvbG9yKSkKKwkJCX0KKwkJCXJldHVybiBuYW1lCisJCX0KKwkJcmV0dXJuIGNvbG9yCisJfQorCisJLy8gaHR0cDovL2hlbHAuZWNsaXBzZS5vcmcvaW5kaWdvL2luZGV4LmpzcD90b3BpYz0lMkZvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2JTJGcmVmZXJlbmNlJTJGYXBpJTJGb3JnJTJGZWNsaXBzZSUyRmpmYWNlJTJGcmVzb3VyY2UlMkZGb250RGVzY3JpcHRvci5odG1sCisJZGVmIHB1YmxpYyBTdHlsZWRTdHJpbmcgZ2V0U3R5bGVkVGV4dChTdHlsZSBvKSB7CisJCXRyeSB7CisJCQl2YXIgZm9udCA9IGdldEZvbnQobykKKwkJCXZhciBmb3JlID0gcmVnaXN0ZXJDb2xvcihnZXRGb3JlQ29sb3IobykpCisJCQl2YXIgYmFjayA9IHJlZ2lzdGVyQ29sb3IoZ2V0QmFja0NvbG9yKG8pKQorCQkJaWYJKGZvbnQgPT0gbnVsbCkgeworCQkJCWlmIChmb3JlID09IG51bGwgJiYgYmFjayA9PSBudWxsKSB7CisJCQkJCXJldHVybiBuZXcgU3R5bGVkU3RyaW5nKGdlbmVyYXRlVGV4dCAobywgbnVsbCkpCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gbmV3IFN0eWxlZFN0cmluZygKKwkJCQkJCWdlbmVyYXRlVGV4dCAobywgbnVsbCksCisJCQkJCQkobmV3IFN0eWxlckZhY3RvcnkpLmNyZWF0ZVN0eWxlcihmb3JlLCBiYWNrKQorCQkJCQkpCisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJcmV0dXJuIG5ldyBTdHlsZWRTdHJpbmcoCisJCQkJCWdlbmVyYXRlVGV4dCAobywgbnVsbCksCisJCQkJCShuZXcgU3R5bGVyRmFjdG9yeSkuY3JlYXRlU3R5bGVyKAorCQkJCQkJRm9udERlc2NyaXB0b3IuY3JlYXRlRnJvbShmb250KSwKKwkJCQkJCWZvcmUsIGJhY2sKKwkJCQkJKQorCQkJCSkKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBuZXcgU3R5bGVkU3RyaW5nKGdlbmVyYXRlVGV4dCAobywgbnVsbCkpCisJCX0KKwl9CisKKwlvdmVycmlkZSB0ZXh0IChPYmplY3QgbykgeworCQlzd2l0Y2ggKG8pIHsKKwkJCVJlcG9ydFBhY2thZ2UJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdyZXBvcnQgcGFja2FnZScgICAgICkKKwkJCVBhZ2VUZW1wbGF0ZXMJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdwYWdlIHRlbXBsYXRlcycgICAgICkKKwkJCVNvbWVGb3JtYXRzCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2Zvcm1hdHRlcnMnICAgICAgICAgKQorCQkJQ29sb3JzCQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdjb2xvcnMnICAgICAgICAgICAgICkKKwkJCUZvbnRzCQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdmb250cycgICAgICAgICAgICAgICkKKwkJCVN0eWxlcwkJCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnc3R5bGVzJyAgICAgICAgICAgICApCisJCQlNZWRpYXMJCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ21lZGlhcycgICAgICAgICAgICAgKQorCQkJUGFnZVRlbXBsYXRlCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAncGFnZSB0ZW1wbGF0ZScgICAgICAsIG8ubmFtZSApCisJCQlSZXBvcnREZXNpZ25GaWxlCQkJOiBnZW5lcmF0ZVRleHQoIG8sICd2aWEgZGVzaWduIGZpbGUnICAgICwgby5uYW1lICkKKwkJCVJlcG9ydERlc2lnblRlbXBsYXRlCQk6IGdlbmVyYXRlVGV4dCggbywgJ3ZpYSBkZXNjcmlwdGlvbicgICAgKQorCQkJUGFnZUhlYWRlcgkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdwYWdlIGhlYWRlcicgICAgICAgICkKKwkJCVBhZ2VEZXRhaWwJCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAncGFnZSBkZXRhaWwnICAgICAgICApCisJCQlQYWdlRm9vdGVyCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3BhZ2UgZm9vdGVyJyAgICAgICAgKQorCQkJQ29sb3IJCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgbnVsbCApCisJCQlGb250CQkJCQkJOiBnZXRTdHlsZWRUZXh0KCBvICkKKwkJCU1lZGlhCQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sIG51bGwgKQorCQkJU3R5bGUJCQkJCQk6IGdldFN0eWxlZFRleHQoIG8gKQorCQkJUmVwb3J0CQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdyZXBvcnQnLCBvLm5hbWUgICAgICkKKwkJCURhdGFtYXJ0RGVmaW5pdGlvbgkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnZGF0YW1hcnQnICAgICAgICAgICApCisJCQlEYXRhbWFydFRhYmxlCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnZGF0YW1hcnQnICAgICAgICAgICApCisJCQlEYXRhbWFydFRhYmxlR3JvdXAJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3RhYmxlIGdyb3VwJyAgICAgICAgKQorCQkJRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCTogZ2VuZXJhdGVUZXh0KCBvLCAndGFibGUgZ3JvdXAgaGVhZGVyJyAsIG8uc3R5bGUubmFtZSApCisJCQlEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIJOiBnZW5lcmF0ZVRleHQoIG8sICd0YWJsZSBncm91cCBmb290ZXInICwgby5zdHlsZS5uYW1lICkKKwkJCURhdGFtYXJ0VGFibGVEZXRhaWwJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3RhYmxlIGRldGFpbCcgICAgICAgLCBvLnN0eWxlLm5hbWUgKQorCQkJRGF0YW1hcnRUYWJsZVByb3BlcnR5CQk6IGdlbmVyYXRlVGV4dCggbywgJ3RhYmxlIHByb3BlcnR5JyAgICAgKQorCQkJVGFibGVQcm9wZXJ0eQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3Byb3BlcnR5JyAgICAgICAgICAgLCBvLnZhbHVlUmVmLnByb3BlcnR5UmVmLm5hbWUgKQorCQkJVGFibGVBZ2dyZWdhdGlvbgkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnYWdncmVnYXRpb24nICAgICAgICApCisJCQlVb21vRm9ybWF0CQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ251bWJlciAmIHVuaXQ6ICcuY29uY2F0KCBvLnJlcG9ydF9wYXR0ZXJuICksIG8ubmFtZSApCisJCQlOdW1iZXJGb3JtYXQJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICAgICAgICAnbnVtYmVyOiAnLmNvbmNhdCggby5yZXBvcnRfcGF0dGVybiApLCBvLm5hbWUgKQorCQkJQ3VycmVuY3lGb3JtYXQJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICAgICAgJ2N1cnJlbmN5OiAnLmNvbmNhdCggby5yZXBvcnRfcGF0dGVybiApLCBvLm5hbWUgKQorCQkJRGF0ZUZvcm1hdAkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICAgICAgICAgICdkYXRlOiAnLmNvbmNhdCggby5yZXBvcnRfcGF0dGVybiApLCBvLm5hbWUgKQorCQkJRGF0ZVRpbWVGb3JtYXQJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICAgJ2RhdGUgJiB0aW1lOiAnLmNvbmNhdCggby5yZXBvcnRfcGF0dGVybiApLCBvLm5hbWUgKQorCQkJVGltZUZvcm1hdAkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICAgICAgICAgICd0aW1lOiAnLmNvbmNhdCggby5yZXBvcnRfcGF0dGVybiApLCBvLm5hbWUgKQorCQkJVGFibGVOdW1iZXJJbnRlcnZhbAkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnbnVtYmVyIGludGVydmFsJyAgICApCisJCQlUYWJsZURhdGVEYXlJbnRlcnZhbAkJOiBnZW5lcmF0ZVRleHQoIG8sICdkYXkgaW50ZXJ2YWwnICAgICAgICkKKwkJCVRhYmxlTnVtYmVyTG9va3VwCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdudW1iZXIgbG9va3VwJyAgICAgICkKKwkJCVRhYmxlU3RyaW5nTG9va3VwCQkJOiBnZW5lcmF0ZVRleHQoIG8sICd0ZXh0IGxvb2t1cCcgICAgICAgICkKKwkJCVRhYmxlRGF0ZURheUxvb2t1cAkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnZGF5IGxvb2t1cCcgICAgICAgICApCisJCQlUYWJsZVRleHRDb2xvcgkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3RleHQgY29sb3InICAgICAgICAgLCBvLmNvbG9yLmNvbG9yICkKKwkJCVRhYmxlQ2VsbENvbG9yCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnYmFja2dyb3VuZCBjb2xvcicgICAsIG8uY29sb3IuY29sb3IgKQorCQkJVGFibGVJY29uCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2ljb24nICAgICAgICAgICAgICAgLCBvLmljb24gKQorCQkJVGFibGVUcmVuZAkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICd0cmVuZCBpY29uJyAgICAgICAgICkKKwkJCUdyaWQJCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2dyaWQnICAgICAgICAgICAgICAgKQorCQkJR3JpZFJvdwkJCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAncm93JyAgICAgICAgICAgICAgICApCisJCQlHcmlkQ2VsbAkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICdjZWxsJyAgICAgICAgICAgICAgICkKKwkJCVRpdGxlCQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICd0aXRsZScgICAgICAgICAgICAgICwgby50ZXh0ICkKKwkJCVN1YlRpdGxlCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ3N1YnRpdGxlJyAgICAgICAgICAgLCBvLnRleHQgKQorCQkJU3ViU3ViVGl0bGUJCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnc3Vic3VidGlsZScgICAgICAgICAsIG8udGV4dCApCisJCQlMYWJlbAkJCQkJCTogZ2VuZXJhdGVUZXh0KCBvLCAnbGFiZWwnICAgICAgICAgICAgICAsIG8udGV4dCApCisJCQlUZXh0CQkJCQkJOiBnZW5lcmF0ZVRleHQoIG8sICd0ZXh0JyAgICAgICAgICAgICAgICkKKwkJCUF1dG9UZXh0CQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2F1dG8gdGV4dCcgICAgICAgICAgLCBvLnR5cGUudG9TdHJpbmcgKQorCQkJSW1hZ2UJCQkJCQk6IGdlbmVyYXRlVGV4dCggbywgJ2ltYWdlJyAgICAgICAgICAgICAgKQorCQkJZGVmYXVsdCAJCQkJCTogc3VwZXIudGV4dCggbyApCisJCX0KKwl9CisKKwlvdmVycmlkZSBpbWFnZSAoT2JqZWN0IG8pIHsKKwkJc3dpdGNoIChvKSB7CisJCQlSZXBvcnRNb2RlbAkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnbW9kZWwucG5nJyAgICAgICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJUmVwb3J0UGFja2FnZQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdwYWNrYWdlLmdpZicgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlQYWdlVGVtcGxhdGVzCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ21hc3Rlcl9wYWdlLmdpZicgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVNvbWVGb3JtYXRzCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdmb3JtYXRidWlsZGVyLmdpZicgICAgICAgICAgLCBjbGFzcyApCisJCQlDb2xvcnMJCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdjb2xvci5naWYnICAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlGb250cwkJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2ZvbnQuZ2lmJyAgICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVN0eWxlcwkJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ3N0eWxlLmdpZicgICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCU1lZGlhcwkJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ21hc3Rlcl9wYWdlLmdpZicgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVBhZ2VUZW1wbGF0ZQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdtYXN0ZXJfcGFnZS5naWYnICAgICAgICAgICAgLCBjbGFzcyApCisJCQlSZXBvcnREZXNpZ25GaWxlCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZicgICwgY2xhc3MgKQorCQkJUmVwb3J0RGVzaWduVGVtcGxhdGUJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2FwaV90b29scy5naWYnICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVBhZ2VIZWFkZXIJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2hlYWRlci5naWYnICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVBhZ2VEZXRhaWwJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2RldGFpbHMuZ2lmJyAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVBhZ2VGb290ZXIJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2Zvb3Rlci5naWYnICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCUNvbG9yCQkJCQkJOiBnZXRDb2xvckltYWdlKG8pCisJCQlGb250OgkJCQkJCXRyeSB7CisJCQkJCQkJCQkJCWdldEZvbnQobyk7IGdldEludGVybmFsSW1hZ2UoJ2ZvbnQuZ2lmJyxjbGFzcykKKwkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCQkJCQlnZXRFcnJvckltYWdlKCkKKwkJCQkJCQkJCQl9CisJCQlNZWRpYQkJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ21hc3Rlcl9wYWdlLmdpZicgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVN0eWxlCQkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnc3R5bGUuZ2lmJyAgICAgICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJUmVwb3J0CQkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX3JlcG9ydC5naWYnICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJRGF0YW1hcnREZWZpbml0aW9uCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnZHNsX2RhdGFtYXJ0LnBuZycgICAgICAgICAgICwgY2xhc3MgKQorCQkJRGF0YW1hcnRUYWJsZQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdkc2xfZGF0YW1hcnQucG5nJyAgICAgICAgICAgLCBjbGFzcyApCisJCQlEYXRhbWFydFRhYmxlR3JvdXAJCQk6IGdldEludGVybmFsSW1hZ2UoICdncm91cC5naWYnICAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIJOiBnZXRJbnRlcm5hbEltYWdlKCAnZ3JvdXBfaGVhZGVyLmdpZicgICAgICAgICAgICwgY2xhc3MgKQorCQkJRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2dyb3VwX2Zvb3Rlci5naWYnICAgICAgICAgICAsIGNsYXNzICkKKwkJCURhdGFtYXJ0VGFibGVEZXRhaWwJCQk6IGdldEludGVybmFsSW1hZ2UoICdkZXRhaWwtYXJlYS5naWYnICAgICAgICAgICAgLCBjbGFzcyApCisJCQlEYXRhbWFydFRhYmxlUHJvcGVydHkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ3Byb3BlcnRpZXMucG5nJyAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVRhYmxlUHJvcGVydHkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAncHJvcGVydGllcy5wbmcnICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJVGFibGVBZ2dyZWdhdGlvbgkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2FnZ3JlZ2F0ZS5wbmcnICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVVvbW9Gb3JtYXQJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2xlbmd0aF9tZWFzdXJlLTE2eDE2LnBuZycgICAsIGNsYXNzICkKKwkJCU51bWJlckZvcm1hdAkJCQk6IGdldEludGVybmFsSW1hZ2UoICdmb3JtYXRidWlsZGVyLmdpZicgICAgICAgICAgLCBjbGFzcyApCisJCQlDdXJyZW5jeUZvcm1hdAkJCQk6IGdldEludGVybmFsSW1hZ2UoICdjdXJyZW5jeV9ldXJvLnBuZycgICAgICAgICAgLCBjbGFzcyApCisJCQlEYXRlRm9ybWF0CQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdjYWxlbmRhci1zbWFsbC5naWYnICAgICAgICAgLCBjbGFzcyApCisJCQlEYXRlVGltZUZvcm1hdAkJCQk6IGdldEludGVybmFsSW1hZ2UoICdkYXRldGltZS5naWYnICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlUaW1lRm9ybWF0CQkJCQk6IGdldEludGVybmFsSW1hZ2UoICd0aW1lLmdpZicgICAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlUYWJsZUludGVydmFsCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmJyAsIGNsYXNzICkKKwkJCVRhYmxlTG9va3VwCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdlbnVtX2FsdF9vYmouZ2lmJyAgICAgICAgICAgLCBjbGFzcyApCisJCQlUYWJsZVRleHRDb2xvcgkJCQk6IGdldEludGVybmFsSW1hZ2UoICdmb250X2NvbG9yLmdpZicgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlUYWJsZUNlbGxDb2xvcgkJCQk6IGdldEludGVybmFsSW1hZ2UoICdmb3JlZ3JvdW5kX2ZpbGxfY29sb3IucG5nJyAgLCBjbGFzcyApCisJCQlUYWJsZUljb24JCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2ltZy5wbmcnICAgICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVRhYmxlVHJlbmQJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ3RyZW5kX3Jpc2luZy5wbmcnICAgICAgICAgICAsIGNsYXNzICkKKwkJCUdyaWQJCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdncmlkbGF5b3V0X29iai5naWYnICAgICAgICAgLCBjbGFzcyApCisJCQlHcmlkUm93CQkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAncm93LmdpZicgICAgICAgICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJR3JpZENlbGwJCQkJCTogZ2V0SW50ZXJuYWxJbWFnZSggJ2NlbGwuZ2lmJyAgICAgICAgICAgICAgICAgICAsIGNsYXNzICkKKwkJCVRleHRFbGVtZW50CQkJCQk6IGdldEludGVybmFsSW1hZ2UoICd0ZXh0LmdpZicgICAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlBdXRvVGV4dAkJCQkJOiBnZXRJbnRlcm5hbEltYWdlKCAnYXV0b3RleHQuZ2lmJyAgICAgICAgICAgICAgICwgY2xhc3MgKQorCQkJSW1hZ2UJCQkJCQk6IGdldEludGVybmFsSW1hZ2UoICdpbWcucG5nJyAgICAgICAgICAgICAgICAgICAgLCBjbGFzcyApCisJCQlkZWZhdWx0CQkJCQkJOiBudWxsCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvb3V0bGluZS9SZXBvcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL291dGxpbmUvUmVwb3J0RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IyN2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL291dGxpbmUvUmVwb3J0RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDI3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLm91dGxpbmUKKworLyoqCisgKiBDdXN0b21pemF0aW9uIG9mIHRoZSBkZWZhdWx0IG91dGxpbmUgc3RydWN0dXJlLgorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK2NsYXNzIFJlcG9ydERTTE91dGxpbmVUcmVlUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyIHsKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9xdWlja2ZpeC9SZXBvcnREU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL3F1aWNrZml4L1JlcG9ydERTTFF1aWNrZml4UHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmMzM4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9xdWlja2ZpeC9SZXBvcnREU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkucXVpY2tmaXgKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4LkZpeAorLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lklzc3VlUmVzb2x1dGlvbkFjY2VwdG9yCisvL2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLklzc3VlCisKKy8qKgorICogQ3VzdG9tIHF1aWNrZml4ZXMuCisgKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3F1aWNrZml4ZXMKKyAqLworY2xhc3MgUmVwb3J0RFNMUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5EZWZhdWx0UXVpY2tmaXhQcm92aWRlciB7CisKKy8vCUBGaXgoTXlEc2xWYWxpZGF0b3I6OklOVkFMSURfTkFNRSkKKy8vCWRlZiBjYXBpdGFsaXplTmFtZShJc3N1ZSBpc3N1ZSwgSXNzdWVSZXNvbHV0aW9uQWNjZXB0b3IgYWNjZXB0b3IpIHsKKy8vCQlhY2NlcHRvci5hY2NlcHQoaXNzdWUsICdDYXBpdGFsaXplIG5hbWUnLCAnQ2FwaXRhbGl6ZSB0aGUgbmFtZS4nLCAndXBjYXNlLnBuZycpIFsKKy8vCQkJY29udGV4dCB8CisvLwkJCXZhbCB4dGV4dERvY3VtZW50ID0gY29udGV4dC54dGV4dERvY3VtZW50CisvLwkJCXZhbCBmaXJzdExldHRlciA9IHh0ZXh0RG9jdW1lbnQuZ2V0KGlzc3VlLm9mZnNldCwgMSkKKy8vCQkJeHRleHREb2N1bWVudC5yZXBsYWNlKGlzc3VlLm9mZnNldCwgMSwgZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UpCisvLwkJXQorLy8JfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvdGVtcGxhdGVzL3RlbXBsYXRlcy54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS90ZW1wbGF0ZXMvdGVtcGxhdGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDFjM2NlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkvdGVtcGxhdGVzL3RlbXBsYXRlcy54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHRlbXBsYXRlcz4KKzx0ZW1wbGF0ZSBpZD0iZGUub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMLkNDUmVwb3J0LjEiIGF1dG9pbnNlcnQ9InRydWUiIGNvbnRleHQ9ImRlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTC5DQ1JlcG9ydCIgZGVsZXRlZD0iZmFsc2UiIGRlc2NyaXB0aW9uPSJnZW5lcmF0ZSByZXBvcnQgZm9yIGEgZGF0YW1hcnQgd2l0aCBhbGwgYXZhaWxhYmxlIHByb3BlcnRpZXMiIGVuYWJsZWQ9InRydWUiIG5hbWU9ImNvbXBsZXRlIHJlcG9ydCBmb3IgZGF0YW1hcnQiPgorICAgIHJlcG9ydCBBdXRvUmVwb3J0JHtzb3VyY2V9IGRlc2NyaWJlZCBieSAiJHtzb3VyY2V9IiB7JiMxMzsKKyAgICAgICAgZGF0YW1hcnQgJHtzb3VyY2V9JiMxMzsKKyAgICAgICAgcmVuZGVyaW5nIGh0bWwmIzEzOworICAgICAgICBwYWdldGVtcGxhdGUgQTRfUG9ydHJhaXQmIzEzOworICAgICAgICBtZWRpYSBzbWFsbCYjMTM7CisgICAgICAgIHRlbXBsYXRlIHsmIzEzOworICAgICAgICAgICAgaGVhZGVyIHsmIzEzOworICAgICAgICAgICAgICAgIHNob3dPbkZpcnN0JiMxMzsKKyAgICAgICAgICAgICAgICBoZWlnaHQgMTAgbW0mIzEzOworICAgICAgICAgICAgICAgIGxhYmVsICIke3NvdXJjZX0gUmVwb3J0IiYjMTM7CisgICAgICAgICAgICB9JiMxMzsKKyAgICAgICAgICAgIGRldGFpbCB7JiMxMzsKKyAgICAgICAgICAgICAgICB0YWJsZSBzdHlsZSBib290c3RyYXAgeyYjMTM7CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGhlYWRlciBzdHlsZSBncm91cGluZ18xX2hlYWRlciYjMTM7CisgICAgICAgICAgICAgICAgICAgIGRldGFpbHMgc3R5bGUgZGVmYXVsdHJvdyBhbGwmIzEzOworICAgICAgICAgICAgICAgIH0mIzEzOworICAgICAgICAgICAgfSYjMTM7CisgICAgICAgIH0mIzEzOworICAgIH0mIzEzOworPC90ZW1wbGF0ZT4KKzwvdGVtcGxhdGVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L0NvbG9yVGV4dEFwcGxpZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9jb250ZW50YXNzaXN0L0NvbG9yVGV4dEFwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFmN2FlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvQ29sb3JUZXh0QXBwbGllci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uQ29sb3JVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlJlcGxhY2VtZW50VGV4dEFwcGxpZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENvbG9yVGV4dEFwcGxpZXIgZXh0ZW5kcyBSZXBsYWNlbWVudFRleHRBcHBsaWVyIHsKKyAgcHJpdmF0ZSBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0OworICAKKyAgcHVibGljIENvbnRlbnRBc3Npc3RDb250ZXh0IHNldENvbnRleHQoZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFJlcGxhY2VtZW50U3RyaW5nKGZpbmFsIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgeworICAgIElUZXh0Vmlld2VyIF92aWV3ZXIgPSB0aGlzLmNvbnRleHQuZ2V0Vmlld2VyKCk7CisgICAgU3R5bGVkVGV4dCBfdGV4dFdpZGdldCA9IF92aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOworICAgIERpc3BsYXkgZGlzcGxheSA9IF90ZXh0V2lkZ2V0LmdldERpc3BsYXkoKTsKKyAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKKyAgICBGaWxsTGF5b3V0IF9maWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKKyAgICBzaGVsbC5zZXRMYXlvdXQoX2ZpbGxMYXlvdXQpOworICAgIENvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKKyAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWwgPSB0aGlzLmNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisgICAgU3RyaW5nIF9jb2xvciA9ICgoQ29sb3IpIF9jdXJyZW50TW9kZWwpLmdldENvbG9yKCk7CisgICAgaWYgKChfY29sb3IgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICB0cnkgeworICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfMSA9IHRoaXMuY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKTsKKyAgICAgICAgamF2YS5hd3QuQ29sb3IgYXd0Q29sb3IgPSBDb2xvclV0aWxpdGllcy5jb252ZXJ0VG9Bd3RDb2xvcigoKENvbG9yKSBfY3VycmVudE1vZGVsXzEpKTsKKyAgICAgICAgaW50IF9yZWQgPSBhd3RDb2xvci5nZXRSZWQoKTsKKyAgICAgICAgaW50IF9ncmVlbiA9IGF3dENvbG9yLmdldEdyZWVuKCk7CisgICAgICAgIGludCBfYmx1ZSA9IGF3dENvbG9yLmdldEJsdWUoKTsKKyAgICAgICAgUkdCIF9yR0IgPSBuZXcgUkdCKF9yZWQsIF9ncmVlbiwgX2JsdWUpOworICAgICAgICBjb2xvckRpYWxvZy5zZXRSR0IoX3JHQik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgfQorICAgIH0KKyAgICBSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKG5ld0NvbG9yLCBudWxsKSk7CisgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJcIiMlMDJ4JTAyeCUwMnhcIiIsIEludGVnZXIudmFsdWVPZihuZXdDb2xvci5yZWQpLCBJbnRlZ2VyLnZhbHVlT2YobmV3Q29sb3IuZ3JlZW4pLCBJbnRlZ2VyLnZhbHVlT2YobmV3Q29sb3IuYmx1ZSkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvUmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2NvbnRlbnRhc3Npc3QvUmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWFhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvY29udGVudGFzc2lzdC9SZXBvcnREU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5jb250ZW50YXNzaXN0LkJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnROYXZpZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLlJlcG9ydERTTFVpRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5BYnN0cmFjdFJlcG9ydERTTFByb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkuY29udGVudGFzc2lzdC5Db2xvclRleHRBcHBsaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFic3RyYWN0RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5Bc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LktleXdvcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuUnVsZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnVpLmNvbnRlbnRhc3Npc3QuVGVybWluYWxzUHJvcG9zYWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdENvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yOworCisvKioKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNjb250ZW50QXNzaXN0IG9uIGhvdyB0byBjdXN0b21pemUgY29udGVudCBhc3Npc3RhbnQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UmVwb3J0RFNMUHJvcG9zYWxQcm92aWRlciB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBUZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyIHByb3ZpZGVyOworICAKKyAgQEluamVjdAorICBwcml2YXRlIEJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlcjsKKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlQ29sb3JfQ29sb3IoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBJQ29tcGxldGlvblByb3Bvc2FsIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiU2VsZWN0IGNvbG9yLi4uIiwgY29udGV4dCk7CisgICAgQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsIGNvbG9yID0gKChDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwpIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwpOworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChjb2xvciwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBDb2xvclRleHRBcHBsaWVyIGFwcGxpZXIgPSBuZXcgQ29sb3JUZXh0QXBwbGllcigpOworICAgICAgYXBwbGllci5zZXRDb250ZXh0KGNvbnRleHQpOworICAgICAgY29sb3Iuc2V0VGV4dEFwcGxpZXIoYXBwbGllcik7CisgICAgfQorICAgIGFjY2VwdG9yLmFjY2VwdChjb2xvcik7CisgIH0KKyAgCisgIC8qKgorICAgKiBUaGlzIG92ZXJyaWRlIHdpbGwgZW5hYmxlIDEgbGVuZ3RoIG5vbiBsZXR0ZXIgY2hhcmFjdGVycyBhcyBrZXl3b3JkLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXl3b3JkV29ydGh5VG9Qcm9wb3NlKGZpbmFsIEtleXdvcmQga2V5d29yZCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBwdWJsaWMgRGF0YW1hcnRUYWJsZSBnZXRDb250YWluaW5nRGF0YW1hcnRUYWJsZShmaW5hbCBFT2JqZWN0IG8pIHsKKyAgICBFT2JqZWN0IHJlc3VsdCA9IG87CisgICAgd2hpbGUgKCgoIShyZXN1bHQgaW5zdGFuY2VvZiBEYXRhbWFydFRhYmxlKSkgJiYgKCFPYmplY3RzLmVxdWFsKHJlc3VsdC5lQ29udGFpbmVyKCksIG51bGwpKSkpIHsKKyAgICAgIEVPYmplY3QgX2VDb250YWluZXIgPSByZXN1bHQuZUNvbnRhaW5lcigpOworICAgICAgcmVzdWx0ID0gX2VDb250YWluZXI7CisgICAgfQorICAgIHJldHVybiAoKERhdGFtYXJ0VGFibGUpIHJlc3VsdCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wb3NhbChmaW5hbCBTdHJpbmcgcHJvcG9zYWwsIGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICBib29sZWFuIF9pc1ZhbGlkUHJvcG9zYWwgPSBzdXBlci5pc1ZhbGlkUHJvcG9zYWwocHJvcG9zYWwsIHByZWZpeCwgY29udGV4dCk7CisgICAgYm9vbGVhbiBfbm90ID0gKCFfaXNWYWxpZFByb3Bvc2FsKTsKKyAgICBpZiAoX25vdCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgCisgIHByb3RlY3RlZCBib29sZWFuIGRhdGFtYXJ0RW50aXR5Q29udGFpbnNQcm9wZXJ0eShmaW5hbCBEYXRhbWFydEVudGl0eSBlbnRpdHksIGZpbmFsIFN0cmluZyBwcm9wb3NhbCkgeworICAgIEVMaXN0PERhdGFtYXJ0TmF2aWdhdGlvbj4gX25hdmlnYXRpb25zID0gZW50aXR5LmdldE5hdmlnYXRpb25zKCk7CisgICAgZm9yIChmaW5hbCBEYXRhbWFydE5hdmlnYXRpb24gbmF2aWdhdGlvbiA6IF9uYXZpZ2F0aW9ucykgeworICAgICAgRGF0YW1hcnRFbnRpdHkgX2RhdGFtYXJ0RW50aXR5ID0gbmF2aWdhdGlvbi5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgYm9vbGVhbiBfZGF0YW1hcnRFbnRpdHlDb250YWluc1Byb3BlcnR5ID0gdGhpcy5kYXRhbWFydEVudGl0eUNvbnRhaW5zUHJvcGVydHkoX2RhdGFtYXJ0RW50aXR5LCBwcm9wb3NhbCk7CisgICAgICBpZiAoX2RhdGFtYXJ0RW50aXR5Q29udGFpbnNQcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgRUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4gX3Byb3BlcnRpZXMgPSBlbnRpdHkuZ2V0UHJvcGVydGllcygpOworICAgIGZvciAoZmluYWwgRGF0YW1hcnRQcm9wZXJ0eSBwcm9wZXJ0eSA6IF9wcm9wZXJ0aWVzKSB7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgLyoqCisgICAqIEBzZWUgQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyI2dldEtleXdvcmREaXNwbGF5U3RyaW5nKEtleXdvcmQsIEJhc2ljRFNMVWlUcmFuc2xhdG9yKQorICAgKiBAcGFyYW0ga2V5d29yZCB0aGUga2V5d29yZCB0byBnZXQgdGhlIGRpc3BsYXllZCBzdHJpbmcgZm9yCisgICAqIEByZXR1cm4gdGhlIGRpc3BsYXllZCBzdHJpbmcKKyAgICovCisgIHByb3RlY3RlZCBTdHlsZWRTdHJpbmcgZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoZmluYWwgS2V5d29yZCBrZXl3b3JkKSB7CisgICAgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBfaW5zdGFuY2UgPSBSZXBvcnREU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yLmluc3RhbmNlKCk7CisgICAgcmV0dXJuIEJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlci5nZXRLZXl3b3JkRGlzcGxheVN0cmluZyhrZXl3b3JkLCBfaW5zdGFuY2UpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZV9RdWFsaWZpZWROYW1lKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICB0aGlzLnByb3ZpZGVySGVscGVyLmNvbXBsZXRlX1BhY2thZ2VOYW1lKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IsIHRoaXMpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZV9SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICB0aGlzLnByb3ZpZGVySGVscGVyLmNvbXBsZXRlX1BhY2thZ2VOYW1lKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IsIHRoaXMpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZV9VbnNpZ25lZE51bWJlcihmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlckhlbHBlci5jcmVhdGVOdW1iZXJQcm9wb3NhbChjb250ZXh0LCBhY2NlcHRvciwgcnVsZUNhbGwsIHRoaXMpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZV9TaWduZWROdW1iZXIoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXJIZWxwZXIuY3JlYXRlTnVtYmVyUHJvcG9zYWwoY29udGV4dCwgYWNjZXB0b3IsIHJ1bGVDYWxsLCB0aGlzKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfSU5UKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX0lOVChtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfSUQoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfSUQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1RSQU5TTEFUQUJMRVNUUklORyhmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVTdHJpbmdMb29rdXBfTG9va3VwVmFsdWUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRQYWNrYWdlX0V4dGVybmFsQ3NzVVJJQnVuZGxlKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVJlcG9ydF9FeHRlcm5hbENzc1VSSShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnRfRXh0ZXJuYWxDc3NVUklCdW5kbGUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlRm9udF9GYW1pbHkoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlVW9tb0Zvcm1hdF9VaV9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZU51bWJlckZvcm1hdF9VaV9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZUN1cnJlbmN5Rm9ybWF0X1VpX3BhdHRlcm4oZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZUZvcm1hdF9VaV9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGVUaW1lRm9ybWF0X1VpX3BhdHRlcm4oZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlVGltZUZvcm1hdF9VaV9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVVvbW9Gb3JtYXRfUmVwb3J0X3BhdHRlcm4oZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlTnVtYmVyRm9ybWF0X1JlcG9ydF9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZUN1cnJlbmN5Rm9ybWF0X1JlcG9ydF9wYXR0ZXJuKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZURhdGVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlRGF0ZVRpbWVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlVGltZUZvcm1hdF9SZXBvcnRfcGF0dGVybihmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVSZXBvcnREZXNpZ25GaWxlX05hbWUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlVGFibGVGb3JtYXR0ZXJfRm9ybWF0KGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX1NUUklORyhtb2RlbCwgKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKSwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZVRhYmxlSW1hZ2VfSW1hZ2VQYXRoUGF0dGVybihmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUltYWdlX1Jlc2l6ZVN0cmluZyhmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVUYWJsZUljb25fSWNvbihmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVJbWFnZV9GaWxlbmFtZShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2xhYmVsaW5nL1JlcG9ydERTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL2xhYmVsaW5nL1JlcG9ydERTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTUxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvbGFiZWxpbmcvUmVwb3J0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkubGFiZWxpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5sYWJlbC5EZWZhdWx0RGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyOworCisvKioKKyAqIFByb3ZpZGVzIGxhYmVscyBmb3IgYSBJRU9iamVjdERlc2NyaXB0aW9ucyBhbmQgSVJlc291cmNlRGVzY3JpcHRpb25zLgorICogCisgKiBzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjbGFiZWxQcm92aWRlcgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0RGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9sYWJlbGluZy9SZXBvcnREU0xMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvbGFiZWxpbmcvUmVwb3J0RFNMTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDI4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvbGFiZWxpbmcvUmVwb3J0RFNMTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTExMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkubGFiZWxpbmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5sYWJlbGluZy5CYXNpY0RTTExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1c3RvbUZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRTdHlsZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZURldGFpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViU3ViVGl0bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViVGl0bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUNlbGxDb2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVGV4dENvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVHJlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkNvbG9yVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLkFDb250YWluZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5sYWJlbC5TdHlsZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeGNlcHRpb25zOworCisvKioKKyAqIFByb3ZpZGVzIGxhYmVscyBmb3IgYSBFT2JqZWN0cy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2ljRFNMTGFiZWxQcm92aWRlciB7CisgIHByaXZhdGUgTWFwPFN0cmluZywgSW1hZ2U+IGZDYWNoZWRJbWFnZXM7CisgIAorICAvKioKKyAgICogQHBhcmFtIHN3dENvbG9yICAgU1dUIGNvbG9yCisgICAqIEBwYXJhbSBzaXplIAkJIG91dGxpbmVJbWdTaXplIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlIGltYWdlCisgICAqIEByZXR1cm4gYSAtIGNhY2hlZCAtIFNXVCBpbWFnZSBvYmplY3QKKyAgICovCisgIHB1YmxpYyBJbWFnZSBnZXRDb2xvckltYWdlKGZpbmFsIENvbG9yIHN3dENvbG9yLCBmaW5hbCBCYXNpY0RTTExhYmVsUHJvdmlkZXIub3V0bGluZUltZ1NpemUgc2l6ZSkgeworICAgIGludCBfd2lkdGggPSBzaXplLmdldFdpZHRoKCk7CisgICAgaW50IF9oZWlnaHQgPSBzaXplLmdldEhlaWdodCgpOworICAgIHJldHVybiB0aGlzLmdldENvbG9ySW1hZ2Uoc3d0Q29sb3IsIF93aWR0aCwgX2hlaWdodCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBAcGFyYW0gc3d0Q29sb3IgU1dUIGNvbG9yCisgICAqIEBwYXJhbSB3aWR0aCAgICBvZiB0aGUgcmVjdGFuZ3VsYXIgaW1hZ2UKKyAgICogQHBhcmFtIGhlaWdodCAgIG9mIHRoZSByZWN0YW5ndWxhciBpbWFnZQorICAgKiBAcmV0dXJuIGEgLSBjYWNoZWQgLSBTV1QgcmVjdGFuZ3VsYXIgaW1hZ2Ugb2JqZWN0CisgICAqLworICBwdWJsaWMgSW1hZ2UgZ2V0Q29sb3JJbWFnZShmaW5hbCBDb2xvciBzd3RDb2xvciwgZmluYWwgaW50IHdpZHRoLCBmaW5hbCBpbnQgaGVpZ2h0KSB7CisgICAgdHJ5IHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKHdpZHRoLCAiIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8iKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChoZWlnaHQsICIiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiLyIpOworICAgICAgaW50IF9yZWQgPSBzd3RDb2xvci5nZXRSZWQoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfcmVkLCAiIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8iKTsKKyAgICAgIGludCBfZ3JlZW4gPSBzd3RDb2xvci5nZXRHcmVlbigpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9ncmVlbiwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIvIik7CisgICAgICBpbnQgX2JsdWUgPSBzd3RDb2xvci5nZXRCbHVlKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX2JsdWUsICIiKTsKKyAgICAgIFN0cmluZyBzd3RDb2xvck5hbWUgPSBfYnVpbGRlci50b1N0cmluZygpOworICAgICAgSW1hZ2UgaW1hZ2UgPSB0aGlzLmZDYWNoZWRJbWFnZXMuZ2V0KHN3dENvbG9yTmFtZSk7CisgICAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKGltYWdlLCBudWxsKTsKKyAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgIFJlY3RhbmdsZSBfcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgSW1hZ2UgX2ltYWdlID0gbmV3IEltYWdlKG51bGwsIF9yZWN0YW5nbGUpOworICAgICAgICBpbWFnZSA9IF9pbWFnZTsKKyAgICAgICAgR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOworICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKHN3dENvbG9yKTsKKyAgICAgICAgZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxNiwgMTYpOworICAgICAgICBnYy5kaXNwb3NlKCk7CisgICAgICAgIHN3dENvbG9yLmRpc3Bvc2UoKTsKKyAgICAgICAgdGhpcy5mQ2FjaGVkSW1hZ2VzLnB1dChzd3RDb2xvck5hbWUsIGltYWdlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgX3QpIHsKKyAgICAgIGlmIChfdCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgeworICAgICAgICBmaW5hbCBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pX3Q7CisgICAgICAgIHJldHVybiB0aGlzLmdldEVycm9ySW1hZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuc25lYWt5VGhyb3coX3QpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIGphdmEuYXd0LkNvbG9yIGF3dEZvcmUgPSBDb2xvclV0aWxpdGllcy5jb252ZXJ0VG9Bd3RDb2xvcihuYW1lKTsKKyAgICBpbnQgX3JlZCA9IGF3dEZvcmUuZ2V0UmVkKCk7CisgICAgaW50IF9ncmVlbiA9IGF3dEZvcmUuZ2V0R3JlZW4oKTsKKyAgICBpbnQgX2JsdWUgPSBhd3RGb3JlLmdldEJsdWUoKTsKKyAgICByZXR1cm4gbmV3IENvbG9yKG51bGwsIF9yZWQsIF9ncmVlbiwgX2JsdWUpOworICB9CisgIAorICBwcml2YXRlIFJHQiBnZXRSR0IoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICBqYXZhLmF3dC5Db2xvciBhd3RGb3JlID0gQ29sb3JVdGlsaXRpZXMuY29udmVydFRvQXd0Q29sb3IobmFtZSk7CisgICAgaW50IF9yZWQgPSBhd3RGb3JlLmdldFJlZCgpOworICAgIGludCBfZ3JlZW4gPSBhd3RGb3JlLmdldEdyZWVuKCk7CisgICAgaW50IF9ibHVlID0gYXd0Rm9yZS5nZXRCbHVlKCk7CisgICAgcmV0dXJuIG5ldyBSR0IoX3JlZCwgX2dyZWVuLCBfYmx1ZSk7CisgIH0KKyAgCisgIHByaXZhdGUgSW1hZ2UgZ2V0Q29sb3JJbWFnZShmaW5hbCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciBjb2xvcikgeworICAgIFN0cmluZyBjb2xvck5hbWUgPSBBQ29udGFpbmVySXRlbS5hcHBseUNvbG9yKGNvbG9yKTsKKyAgICBDb2xvciBzd3RGb3JlID0gdGhpcy5nZXRDb2xvcihjb2xvck5hbWUpOworICAgIHJldHVybiB0aGlzLmdldENvbG9ySW1hZ2UoKChDb2xvcikgc3d0Rm9yZSksIEJhc2ljRFNMTGFiZWxQcm92aWRlci5vdXRsaW5lSW1nU2l6ZS5TTUFMTCk7CisgIH0KKyAgCisgIEBJbmplY3QKKyAgcHVibGljIFJlcG9ydERTTExhYmVsUHJvdmlkZXIoZmluYWwgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGRlbGVnYXRlKSB7CisgICAgc3VwZXIoZGVsZWdhdGUpOworICAgIEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4gX2hhc2hNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOworICAgIHRoaXMuZkNhY2hlZEltYWdlcyA9IF9oYXNoTWFwOworICB9CisgIAorICBwcml2YXRlIEZvbnQgZ2V0Rm9udChmaW5hbCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250IG8pIHsKKyAgICBTdHJpbmcgZmFtaWx5ID0gKChTdHJpbmcpIG51bGwpOworICAgIGludCBzaXplID0gMDsKKyAgICBpbnQgaXRhbGljID0gKC0xKTsKKyAgICBpbnQgYm9sZCA9IDA7CisgICAgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCBzdGVwID0gbzsKKyAgICB3aGlsZSAoKCFPYmplY3RzLmVxdWFsKHN0ZXAsIG51bGwpKSkgeworICAgICAgeworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKGZhbWlseSwgbnVsbCk7CisgICAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgICAgRm9udEZhbWlseSBfZmFtaWx5ID0gc3RlcC5nZXRGYW1pbHkoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoX2ZhbWlseSwgbnVsbCkpOworICAgICAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgICAgICBGb250RmFtaWx5IGYgPSBzdGVwLmdldEZhbWlseSgpOworICAgICAgICAgICAgYm9vbGVhbiBfbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEJ1aWxkSW5Gb250RmFtaWx5KSB7CisgICAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICBCdWlsZEluRm9udEZhbWlseUVudW0gX2N1c3RvbSA9ICgoQnVpbGRJbkZvbnRGYW1pbHkpZikuZ2V0Q3VzdG9tKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lID0gX2N1c3RvbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgZmFtaWx5ID0gX25hbWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgICAgaWYgKGYgaW5zdGFuY2VvZiBDdXN0b21Gb250RmFtaWx5KSB7CisgICAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2N1c3RvbSA9ICgoQ3VzdG9tRm9udEZhbWlseSlmKS5nZXRDdXN0b20oKTsKKyAgICAgICAgICAgICAgICBmYW1pbHkgPSBfY3VzdG9tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgICAgIGlmICghKGJvbGQgPT0gMCkpIHsKKyAgICAgICAgICAgIF9hbmQgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiBfaXNCb2xkID0gc3RlcC5pc0JvbGQoKTsKKyAgICAgICAgICAgIF9hbmQgPSBfaXNCb2xkOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX2FuZCkgeworICAgICAgICAgICAgYm9sZCA9IFNXVC5CT0xEOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGl0YWxpYyA8IDApKSB7CisgICAgICAgICAgICBGb250U3R5bGVFbnVtIF9zdHlsZSA9IHN0ZXAuZ2V0U3R5bGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX21hdGNoZWRfMSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFfbWF0Y2hlZF8xKSB7CisgICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9zdHlsZSwgRm9udFN0eWxlLk5PUk1BTCkpIHsKKyAgICAgICAgICAgICAgICBfbWF0Y2hlZF8xPXRydWU7CisgICAgICAgICAgICAgICAgaXRhbGljID0gMDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFfbWF0Y2hlZF8xKSB7CisgICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9zdHlsZSwgRm9udFN0eWxlLklUQUxJQykpIHsKKyAgICAgICAgICAgICAgICBfbWF0Y2hlZF8xPXRydWU7CisgICAgICAgICAgICAgICAgaXRhbGljID0gU1dULklUQUxJQzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFfbWF0Y2hlZF8xKSB7CisgICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKF9zdHlsZSwgRm9udFN0eWxlLk9CTElRVUUpKSB7CisgICAgICAgICAgICAgICAgX21hdGNoZWRfMT10cnVlOworICAgICAgICAgICAgICAgIGl0YWxpYyA9IFNXVC5JVEFMSUM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCBfZXh0ZW5kcyA9IHN0ZXAuZ2V0RXh0ZW5kcygpOworICAgICAgICBzdGVwID0gX2V4dGVuZHM7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgRm9udChudWxsLCBmYW1pbHksIHNpemUsIChpdGFsaWMgKyBib2xkKSk7CisgIH0KKyAgCisgIHB1YmxpYyBTdHlsZWRTdHJpbmcgZ2V0U3R5bGVkVGV4dChmaW5hbCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250IG8pIHsKKyAgICB0cnkgeworICAgICAgU3RyaW5nIF9nZW5lcmF0ZVRleHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCBudWxsKTsKKyAgICAgIFN0eWxlckZhY3RvcnkgX3N0eWxlckZhY3RvcnkgPSBuZXcgU3R5bGVyRmFjdG9yeSgpOworICAgICAgRm9udCBfZm9udCA9IHRoaXMuZ2V0Rm9udChvKTsKKyAgICAgIEZvbnREZXNjcmlwdG9yIF9jcmVhdGVGcm9tID0gRm9udERlc2NyaXB0b3IuY3JlYXRlRnJvbShfZm9udCk7CisgICAgICBTdHlsZWRTdHJpbmcuU3R5bGVyIF9jcmVhdGVTdHlsZXIgPSBfc3R5bGVyRmFjdG9yeS5jcmVhdGVTdHlsZXIoX2NyZWF0ZUZyb20sIG51bGwsIG51bGwpOworICAgICAgcmV0dXJuIG5ldyBTdHlsZWRTdHJpbmcoX2dlbmVyYXRlVGV4dCwgX2NyZWF0ZVN0eWxlcik7CisgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICBpZiAoX3QgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKV90OworICAgICAgICBTdHJpbmcgX2dlbmVyYXRlVGV4dF8xID0gdGhpcy5nZW5lcmF0ZVRleHQobywgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXcgU3R5bGVkU3RyaW5nKF9nZW5lcmF0ZVRleHRfMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBFeGNlcHRpb25zLnNuZWFreVRocm93KF90KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgRm9udCBnZXRGb250KGZpbmFsIFN0eWxlIG8pIHsKKyAgICBTdHlsZSBzdGVwID0gbzsKKyAgICB3aGlsZSAoKCFPYmplY3RzLmVxdWFsKHN0ZXAsIG51bGwpKSkgeworICAgICAgeworICAgICAgICBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250IF9mb250ID0gc3RlcC5nZXRGb250KCk7CisgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfZm9udCwgbnVsbCkpOworICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQgX2ZvbnRfMSA9IHN0ZXAuZ2V0Rm9udCgpOworICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvbnQoX2ZvbnRfMSk7CisgICAgICAgIH0KKyAgICAgICAgU3R5bGUgX2V4dGVuZHMgPSBzdGVwLmdldEV4dGVuZHMoKTsKKyAgICAgICAgc3RlcCA9IF9leHRlbmRzOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9yZUNvbG9yKGZpbmFsIFN0eWxlIG8pIHsKKyAgICBPYmplY3QgX3hibG9ja2V4cHJlc3Npb24gPSBudWxsOworICAgIHsKKyAgICAgIFN0eWxlIHN0ZXAgPSBvOworICAgICAgd2hpbGUgKCghT2JqZWN0cy5lcXVhbChzdGVwLCBudWxsKSkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yIF90ZXh0Y29sb3IgPSBzdGVwLmdldFRleHRjb2xvcigpOworICAgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfdGV4dGNvbG9yLCBudWxsKSk7CisgICAgICAgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgICAgICAgIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yIF90ZXh0Y29sb3JfMSA9IHN0ZXAuZ2V0VGV4dGNvbG9yKCk7CisgICAgICAgICAgICByZXR1cm4gQUNvbnRhaW5lckl0ZW0uYXBwbHlDb2xvcihfdGV4dGNvbG9yXzEpOworICAgICAgICAgIH0KKyAgICAgICAgICBTdHlsZSBfZXh0ZW5kcyA9IHN0ZXAuZ2V0RXh0ZW5kcygpOworICAgICAgICAgIHN0ZXAgPSBfZXh0ZW5kczsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBudWxsOworICAgIH0KKyAgICByZXR1cm4gKChTdHJpbmcpX3hibG9ja2V4cHJlc3Npb24pOworICB9CisgIAorICBwcml2YXRlIFN0cmluZyBnZXRCYWNrQ29sb3IoZmluYWwgU3R5bGUgbykgeworICAgIE9iamVjdCBfeGJsb2NrZXhwcmVzc2lvbiA9IG51bGw7CisgICAgeworICAgICAgU3R5bGUgc3RlcCA9IG87CisgICAgICB3aGlsZSAoKCFPYmplY3RzLmVxdWFsKHN0ZXAsIG51bGwpKSkgeworICAgICAgICB7CisgICAgICAgICAgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IgX2JhY2tncm91bmRjb2xvciA9IHN0ZXAuZ2V0QmFja2dyb3VuZGNvbG9yKCk7CisgICAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9iYWNrZ3JvdW5kY29sb3IsIG51bGwpKTsKKyAgICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgICAgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IgX2JhY2tncm91bmRjb2xvcl8xID0gc3RlcC5nZXRCYWNrZ3JvdW5kY29sb3IoKTsKKyAgICAgICAgICAgIHJldHVybiBBQ29udGFpbmVySXRlbS5hcHBseUNvbG9yKF9iYWNrZ3JvdW5kY29sb3JfMSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN0eWxlIF9leHRlbmRzID0gc3RlcC5nZXRFeHRlbmRzKCk7CisgICAgICAgICAgc3RlcCA9IF9leHRlbmRzOworICAgICAgICB9CisgICAgICB9CisgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IG51bGw7CisgICAgfQorICAgIHJldHVybiAoKFN0cmluZylfeGJsb2NrZXhwcmVzc2lvbik7CisgIH0KKyAgCisgIHByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyQ29sb3IoZmluYWwgU3RyaW5nIGNvbG9yKSB7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKGNvbG9yLCBudWxsKSk7CisgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gInJlcG9ydGRzbF8iLmNvbmNhdChjb2xvcik7CisgICAgICBDb2xvclJlZ2lzdHJ5IGNvbG9yUmVnaXN0cnkgPSBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCk7CisgICAgICBDb2xvciBfZ2V0ID0gY29sb3JSZWdpc3RyeS5nZXQobmFtZSk7CisgICAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKF9nZXQsIG51bGwpOworICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgUkdCIF9yR0IgPSB0aGlzLmdldFJHQihjb2xvcik7CisgICAgICAgIGNvbG9yUmVnaXN0cnkucHV0KG5hbWUsIF9yR0IpOworICAgICAgfQorICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIHJldHVybiBjb2xvcjsKKyAgfQorICAKKyAgcHVibGljIFN0eWxlZFN0cmluZyBnZXRTdHlsZWRUZXh0KGZpbmFsIFN0eWxlIG8pIHsKKyAgICB0cnkgeworICAgICAgRm9udCBmb250ID0gdGhpcy5nZXRGb250KG8pOworICAgICAgU3RyaW5nIF9mb3JlQ29sb3IgPSB0aGlzLmdldEZvcmVDb2xvcihvKTsKKyAgICAgIFN0cmluZyBmb3JlID0gdGhpcy5yZWdpc3RlckNvbG9yKF9mb3JlQ29sb3IpOworICAgICAgU3RyaW5nIF9iYWNrQ29sb3IgPSB0aGlzLmdldEJhY2tDb2xvcihvKTsKKyAgICAgIFN0cmluZyBiYWNrID0gdGhpcy5yZWdpc3RlckNvbG9yKF9iYWNrQ29sb3IpOworICAgICAgYm9vbGVhbiBfZXF1YWxzID0gT2JqZWN0cy5lcXVhbChmb250LCBudWxsKTsKKyAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIF9lcXVhbHNfMSA9IE9iamVjdHMuZXF1YWwoZm9yZSwgbnVsbCk7CisgICAgICAgIGlmICghX2VxdWFsc18xKSB7CisgICAgICAgICAgX2FuZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc18yID0gT2JqZWN0cy5lcXVhbChiYWNrLCBudWxsKTsKKyAgICAgICAgICBfYW5kID0gX2VxdWFsc18yOworICAgICAgICB9CisgICAgICAgIGlmIChfYW5kKSB7CisgICAgICAgICAgU3RyaW5nIF9nZW5lcmF0ZVRleHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCBudWxsKTsKKyAgICAgICAgICByZXR1cm4gbmV3IFN0eWxlZFN0cmluZyhfZ2VuZXJhdGVUZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTdHJpbmcgX2dlbmVyYXRlVGV4dF8xID0gdGhpcy5nZW5lcmF0ZVRleHQobywgbnVsbCk7CisgICAgICAgICAgU3R5bGVyRmFjdG9yeSBfc3R5bGVyRmFjdG9yeSA9IG5ldyBTdHlsZXJGYWN0b3J5KCk7CisgICAgICAgICAgU3R5bGVkU3RyaW5nLlN0eWxlciBfY3JlYXRlU3R5bGVyID0gX3N0eWxlckZhY3RvcnkuY3JlYXRlU3R5bGVyKGZvcmUsIGJhY2spOworICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVkU3RyaW5nKF9nZW5lcmF0ZVRleHRfMSwgX2NyZWF0ZVN0eWxlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZyBfZ2VuZXJhdGVUZXh0XzIgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCBudWxsKTsKKyAgICAgICAgU3R5bGVyRmFjdG9yeSBfc3R5bGVyRmFjdG9yeV8xID0gbmV3IFN0eWxlckZhY3RvcnkoKTsKKyAgICAgICAgRm9udERlc2NyaXB0b3IgX2NyZWF0ZUZyb20gPSBGb250RGVzY3JpcHRvci5jcmVhdGVGcm9tKGZvbnQpOworICAgICAgICBTdHlsZWRTdHJpbmcuU3R5bGVyIF9jcmVhdGVTdHlsZXJfMSA9IF9zdHlsZXJGYWN0b3J5XzEuY3JlYXRlU3R5bGVyKF9jcmVhdGVGcm9tLCBmb3JlLCBiYWNrKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHlsZWRTdHJpbmcoX2dlbmVyYXRlVGV4dF8yLCBfY3JlYXRlU3R5bGVyXzEpOworICAgICAgfQorICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSBfdCkgeworICAgICAgaWYgKF90IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbilfdDsKKyAgICAgICAgU3RyaW5nIF9nZW5lcmF0ZVRleHRfMyA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sIG51bGwpOworICAgICAgICByZXR1cm4gbmV3IFN0eWxlZFN0cmluZyhfZ2VuZXJhdGVUZXh0XzMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfdCk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwdWJsaWMgT2JqZWN0IHRleHQoZmluYWwgT2JqZWN0IG8pIHsKKyAgICBPYmplY3QgX3N3aXRjaFJlc3VsdCA9IG51bGw7CisgICAgYm9vbGVhbiBfbWF0Y2hlZCA9IGZhbHNlOworICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUmVwb3J0UGFja2FnZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInJlcG9ydCBwYWNrYWdlIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGFnZVRlbXBsYXRlcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhZ2UgdGVtcGxhdGVzIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgU29tZUZvcm1hdHMpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJmb3JtYXR0ZXJzIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ29sb3JzKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiY29sb3JzIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRm9udHMpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJmb250cyIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0eWxlcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInN0eWxlcyIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgIm1lZGlhcyIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBhZ2VUZW1wbGF0ZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFBhZ2VUZW1wbGF0ZSlvKS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAicGFnZSB0ZW1wbGF0ZSIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25GaWxlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0cmluZyBfbmFtZSA9ICgoUmVwb3J0RGVzaWduRmlsZSlvKS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidmlhIGRlc2lnbiBmaWxlIiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlcG9ydERlc2lnblRlbXBsYXRlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidmlhIGRlc2NyaXB0aW9uIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGFnZUhlYWRlcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhZ2UgaGVhZGVyIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGFnZURldGFpbCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhZ2UgZGV0YWlsIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGFnZUZvb3RlcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInBhZ2UgZm9vdGVyIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sIG51bGwpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0U3R5bGVkVGV4dCgoKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQpbykpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCBudWxsKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHlsZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRTdHlsZWRUZXh0KCgoU3R5bGUpbykpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlcG9ydCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFJlcG9ydClvKS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAicmVwb3J0IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGFtYXJ0RGVmaW5pdGlvbikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImRhdGFtYXJ0Iik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImRhdGFtYXJ0Iik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZUdyb3VwKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGFibGUgZ3JvdXAiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3R5bGUgX3N0eWxlID0gKChEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpbykuZ2V0U3R5bGUoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3N0eWxlLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJ0YWJsZSBncm91cCBoZWFkZXIiLCBfbmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0eWxlIF9zdHlsZSA9ICgoRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKW8pLmdldFN0eWxlKCk7CisgICAgICAgIFN0cmluZyBfbmFtZSA9IF9zdHlsZS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGFibGUgZ3JvdXAgZm9vdGVyIiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGVEZXRhaWwpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3R5bGUgX3N0eWxlID0gKChEYXRhbWFydFRhYmxlRGV0YWlsKW8pLmdldFN0eWxlKCk7CisgICAgICAgIFN0cmluZyBfbmFtZSA9IF9zdHlsZS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGFibGUgZGV0YWlsIiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGVQcm9wZXJ0eSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInRhYmxlIHByb3BlcnR5Iik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVQcm9wZXJ0eSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBEYXRhbWFydFByb3BlcnR5IF92YWx1ZVJlZiA9ICgoVGFibGVQcm9wZXJ0eSlvKS5nZXRWYWx1ZVJlZigpOworICAgICAgICBMRW50aXR5QXR0cmlidXRlIF9wcm9wZXJ0eVJlZiA9IF92YWx1ZVJlZi5nZXRQcm9wZXJ0eVJlZigpOworICAgICAgICBTdHJpbmcgX25hbWUgPSBfcHJvcGVydHlSZWYuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInByb3BlcnR5IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYmxlQWdncmVnYXRpb24pIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJhZ2dyZWdhdGlvbiIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFVvbW9Gb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF9yZXBvcnRfcGF0dGVybiA9ICgoVW9tb0Zvcm1hdClvKS5nZXRSZXBvcnRfcGF0dGVybigpOworICAgICAgICBTdHJpbmcgX2NvbmNhdCA9ICJudW1iZXIgJiB1bml0OiAiLmNvbmNhdChfcmVwb3J0X3BhdHRlcm4pOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFVvbW9Gb3JtYXQpbykuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgX2NvbmNhdCwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bWJlckZvcm1hdCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX3JlcG9ydF9wYXR0ZXJuID0gKChOdW1iZXJGb3JtYXQpbykuZ2V0UmVwb3J0X3BhdHRlcm4oKTsKKyAgICAgICAgU3RyaW5nIF9jb25jYXQgPSAibnVtYmVyOiAiLmNvbmNhdChfcmVwb3J0X3BhdHRlcm4pOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKE51bWJlckZvcm1hdClvKS5nZXROYW1lKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCBfY29uY2F0LCBfbmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ3VycmVuY3lGb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF9yZXBvcnRfcGF0dGVybiA9ICgoQ3VycmVuY3lGb3JtYXQpbykuZ2V0UmVwb3J0X3BhdHRlcm4oKTsKKyAgICAgICAgU3RyaW5nIF9jb25jYXQgPSAiY3VycmVuY3k6ICIuY29uY2F0KF9yZXBvcnRfcGF0dGVybik7CisgICAgICAgIFN0cmluZyBfbmFtZSA9ICgoQ3VycmVuY3lGb3JtYXQpbykuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgX2NvbmNhdCwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGVGb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF9yZXBvcnRfcGF0dGVybiA9ICgoRGF0ZUZvcm1hdClvKS5nZXRSZXBvcnRfcGF0dGVybigpOworICAgICAgICBTdHJpbmcgX2NvbmNhdCA9ICJkYXRlOiAiLmNvbmNhdChfcmVwb3J0X3BhdHRlcm4pOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKERhdGVGb3JtYXQpbykuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgX2NvbmNhdCwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGVUaW1lRm9ybWF0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0cmluZyBfcmVwb3J0X3BhdHRlcm4gPSAoKERhdGVUaW1lRm9ybWF0KW8pLmdldFJlcG9ydF9wYXR0ZXJuKCk7CisgICAgICAgIFN0cmluZyBfY29uY2F0ID0gImRhdGUgJiB0aW1lOiAiLmNvbmNhdChfcmVwb3J0X3BhdHRlcm4pOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKERhdGVUaW1lRm9ybWF0KW8pLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sIF9jb25jYXQsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUaW1lRm9ybWF0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0cmluZyBfcmVwb3J0X3BhdHRlcm4gPSAoKFRpbWVGb3JtYXQpbykuZ2V0UmVwb3J0X3BhdHRlcm4oKTsKKyAgICAgICAgU3RyaW5nIF9jb25jYXQgPSAidGltZTogIi5jb25jYXQoX3JlcG9ydF9wYXR0ZXJuKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gKChUaW1lRm9ybWF0KW8pLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sIF9jb25jYXQsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZU51bWJlckludGVydmFsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAibnVtYmVyIGludGVydmFsIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVEYXRlRGF5SW50ZXJ2YWwpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJkYXkgaW50ZXJ2YWwiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZU51bWJlckxvb2t1cCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgIm51bWJlciBsb29rdXAiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZVN0cmluZ0xvb2t1cCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInRleHQgbG9va3VwIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVEYXRlRGF5TG9va3VwKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiZGF5IGxvb2t1cCIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYmxlVGV4dENvbG9yKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yIF9jb2xvciA9ICgoVGFibGVUZXh0Q29sb3IpbykuZ2V0Q29sb3IoKTsKKyAgICAgICAgU3RyaW5nIF9jb2xvcl8xID0gX2NvbG9yLmdldENvbG9yKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGV4dCBjb2xvciIsIF9jb2xvcl8xKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZUNlbGxDb2xvcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciBfY29sb3IgPSAoKFRhYmxlQ2VsbENvbG9yKW8pLmdldENvbG9yKCk7CisgICAgICAgIFN0cmluZyBfY29sb3JfMSA9IF9jb2xvci5nZXRDb2xvcigpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImJhY2tncm91bmQgY29sb3IiLCBfY29sb3JfMSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVJY29uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0cmluZyBfaWNvbiA9ICgoVGFibGVJY29uKW8pLmdldEljb24oKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJpY29uIiwgX2ljb24pOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYmxlVHJlbmQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJ0cmVuZCBpY29uIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JpZCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImdyaWQiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBHcmlkUm93KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAicm93Iik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JpZENlbGwpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJjZWxsIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGl0bGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChUaXRsZSlvKS5nZXRUZXh0KCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGl0bGUiLCBfdGV4dCk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgU3ViVGl0bGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChTdWJUaXRsZSlvKS5nZXRUZXh0KCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAic3VidGl0bGUiLCBfdGV4dCk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgU3ViU3ViVGl0bGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChTdWJTdWJUaXRsZSlvKS5nZXRUZXh0KCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAic3Vic3VidGlsZSIsIF90ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMYWJlbCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX3RleHQgPSAoKExhYmVsKW8pLmdldFRleHQoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJsYWJlbCIsIF90ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAidGV4dCIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEF1dG9UZXh0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIEF1dG9UZXh0RW51bSBfdHlwZSA9ICgoQXV0b1RleHQpbykuZ2V0VHlwZSgpOworICAgICAgICBTdHJpbmcgX3N0cmluZyA9IF90eXBlLnRvU3RyaW5nKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiYXV0byB0ZXh0IiwgX3N0cmluZyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJpbWFnZSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBfc3dpdGNoUmVzdWx0ID0gc3VwZXIudGV4dChvKTsKKyAgICB9CisgICAgcmV0dXJuIF9zd2l0Y2hSZXN1bHQ7CisgIH0KKyAgCisgIHB1YmxpYyBPYmplY3QgaW1hZ2UoZmluYWwgT2JqZWN0IG8pIHsKKyAgICBJbWFnZSBfc3dpdGNoUmVzdWx0ID0gbnVsbDsKKyAgICBib29sZWFuIF9tYXRjaGVkID0gZmFsc2U7CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXBvcnRNb2RlbCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJtb2RlbC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlcG9ydFBhY2thZ2UpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgicGFja2FnZS5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBhZ2VUZW1wbGF0ZXMpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgibWFzdGVyX3BhZ2UuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTb21lRm9ybWF0cykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJmb3JtYXRidWlsZGVyLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ29sb3JzKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImNvbG9yLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRm9udHMpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZm9udC5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0eWxlcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJzdHlsZS5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJtYXN0ZXJfcGFnZS5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFBhZ2VUZW1wbGF0ZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJtYXN0ZXJfcGFnZS5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlcG9ydERlc2lnbkZpbGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZmluZGVyX2Rlc2NyaXB0b3Jfb2JqLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUmVwb3J0RGVzaWduVGVtcGxhdGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiYXBpX3Rvb2xzLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUGFnZUhlYWRlcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJoZWFkZXIuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQYWdlRGV0YWlsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRldGFpbHMuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQYWdlRm9vdGVyKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImZvb3Rlci5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldENvbG9ySW1hZ2UoKChvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcilvKSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBJbWFnZSBfeHRyeWNhdGNoZmluYWxseWV4cHJlc3Npb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgIEltYWdlIF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmdldEZvbnQoKChvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250KW8pKTsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgICAgICBfeGJsb2NrZXhwcmVzc2lvbiA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZm9udC5naWYiLCBfY2xhc3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBfeHRyeWNhdGNoZmluYWxseWV4cHJlc3Npb24gPSBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICAgICAgaWYgKF90IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pX3Q7CisgICAgICAgICAgICBfeHRyeWNhdGNoZmluYWxseWV4cHJlc3Npb24gPSB0aGlzLmdldEVycm9ySW1hZ2UoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSBfeHRyeWNhdGNoZmluYWxseWV4cHJlc3Npb247CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgTWVkaWEpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgibWFzdGVyX3BhZ2UuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHlsZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJzdHlsZS5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlcG9ydCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfcmVwb3J0LmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnREZWZpbml0aW9uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9kYXRhbWFydC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZHNsX2RhdGFtYXJ0LnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZUdyb3VwKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImdyb3VwLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImdyb3VwX2hlYWRlci5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGVHcm91cEZvb3RlcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJncm91cF9mb290ZXIuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhbWFydFRhYmxlRGV0YWlsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRldGFpbC1hcmVhLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZVByb3BlcnR5KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInByb3BlcnRpZXMucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZVByb3BlcnR5KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInByb3BlcnRpZXMucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZUFnZ3JlZ2F0aW9uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImFnZ3JlZ2F0ZS5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFVvbW9Gb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgibGVuZ3RoX21lYXN1cmUtMTZ4MTYucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOdW1iZXJGb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZm9ybWF0YnVpbGRlci5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEN1cnJlbmN5Rm9ybWF0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImN1cnJlbmN5X2V1cm8ucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRlRm9ybWF0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImNhbGVuZGFyLXNtYWxsLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0ZVRpbWVGb3JtYXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZGF0ZXRpbWUuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUaW1lRm9ybWF0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInRpbWUuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZUludGVydmFsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoIm51bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZUxvb2t1cCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJlbnVtX2FsdF9vYmouZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJsZVRleHRDb2xvcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJmb250X2NvbG9yLmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVDZWxsQ29sb3IpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiZm9yZWdyb3VuZF9maWxsX2NvbG9yLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFibGVJY29uKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImltZy5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYmxlVHJlbmQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgidHJlbmRfcmlzaW5nLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JpZCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJncmlkbGF5b3V0X29iai5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEdyaWRSb3cpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgicm93LmdpZiIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JpZENlbGwpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlcG9ydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiY2VsbC5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFRleHRFbGVtZW50KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInRleHQuZ2lmIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBdXRvVGV4dCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgUmVwb3J0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJhdXRvdGV4dC5naWYiLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBSZXBvcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImltZy5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBfc3dpdGNoUmVzdWx0ID0gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIF9zd2l0Y2hSZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9vdXRsaW5lL1JlcG9ydERTTE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91aS9vdXRsaW5lL1JlcG9ydERTTE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI4YjViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL291dGxpbmUvUmVwb3J0RFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFJlcG9ydERTTE91dGxpbmVUcmVlUHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0T3V0bGluZVRyZWVQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdWkvcXVpY2tmaXgvUmVwb3J0RFNMUXVpY2tmaXhQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL3F1aWNrZml4L1JlcG9ydERTTFF1aWNrZml4UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdmZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3VpL3F1aWNrZml4L1JlcG9ydERTTFF1aWNrZml4UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51aS5xdWlja2ZpeDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5EZWZhdWx0UXVpY2tmaXhQcm92aWRlcjsKKworLyoqCisgKiBDdXN0b20gcXVpY2tmaXhlcy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3F1aWNrZml4ZXMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIERlZmF1bHRRdWlja2ZpeFByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMTVhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLy5wcm9qZWN0CkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5zb25hcmxpbnQuZWNsaXBzZS5jb3JlLnNvbmFybGludEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmMDJhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTI1IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbAorQnVuZGxlLVZlbmRvcjogRWNsaXBzZSBPU0JQCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK1JlcXVpcmUtQnVuZGxlOiBvcmcuc2xmNGouYXBpO2J1bmRsZS12ZXJzaW9uPSIxLjcuMiIsCisgb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249IjIuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCisgb2xhcDRqLm9zZ2k7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAorIG9yZy5kcm9vbHMuYXBpO2J1bmRsZS12ZXJzaW9uPSJbNS41LjEsNS41LjIpIiwKKyBtb25kcmlhbi5vc2dpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsMy41LjEpIiwKKyBjb20uaWJtLmljdSwKKyBjb20udmFhZGluLnNlcnZlcjtidW5kbGUtdmVyc2lvbj0iWzcuNS43LDcuNy4wKSIsCisgb3JnLmFudGxyLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKKyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZztidW5kbGUtdmVyc2lvbj0iMS4wLjQiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLAorIG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cywKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLAorIG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLndvcmtiZW5jaCwKKyBvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLAorIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5tb3ppbGxhLmphdmFzY3JpcHQ7YnVuZGxlLXZlcnNpb249IlsxLjcuMiwxLjcuNCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhjb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjEuMiIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhjb3JlLmxpYiwKKyBvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS54dGV4dC51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXM7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5vYmplY3R3ZWIuYXNtO2J1bmRsZS12ZXJzaW9uPSIzLjMuMSIsCisgamF2YXgucGVyc2lzdGVuY2U7YnVuZGxlLXZlcnNpb249IjIuMS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXA7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLndlYi52YWFkaW4uZGF0YWJpbmRpbmc7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnJ1bnRpbWUuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuY29yZS5leHRlbnNpb24ubW9kZWw7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5vc2dpLmh5YnJpZC5hcGk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnByZWZlcmVuY2VzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC53ZWJzZXJ2ZXIubWVzc2FnZXF1ZXVlO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC51dGlscztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHMudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmV2ZW50YnJva2VyO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmJwbW4yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLm13ZTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAuZWN2aWV3LmNvcmUuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5naXRpbmZvO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2UuZW1mLm13ZTIubGF1bmNoO2J1bmRsZS12ZXJzaW9uPSIyLjcuMSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb247YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQ7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFkZG9ucztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5idW5kbGVzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5hcGk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIudHlwZXMubG9hZGVyLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIueGJhc2Uuc2V0dXBzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmFwYWNoZS5wZGZib3g7YnVuZGxlLXZlcnNpb249IjIuMC40IiwKKyBvcmcuYXBhY2hlLnBkZmJveC5mb250Ym94O2J1bmRsZS12ZXJzaW9uPSIyLjAuNCIKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZvcm1hdHRpbmc7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2NvcGluZzt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2VyaWFsaXplcjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2VydmljZXM7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnV0aWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnZhbGlkYXRpb247dmVyc2lvbj0iMC45LjAiCitJbXBvcnQtUGFja2FnZTogY29tLmxvd2FnaWUudGV4dDt2ZXJzaW9uPSIyLjEuNyIsCisgY29tLmxvd2FnaWUudGV4dC5wZGY7dmVyc2lvbj0iMi4xLjciLAorIGphdmF4LnZhbGlkYXRpb24sCisgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cywKKyBtb25kcmlhbi5vbGFwLAorIG1vbmRyaWFuLnJvbGFwLAorIG9yZy5hcGFjaGUubG9nNGosCisgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmRhdGEsCisgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmV4Y2VwdGlvbiwKKyBvcmcuZWNsaXBzZS5iaXJ0LmNvcmUuZnJhbWV3b3JrLAorIG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGksCisgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLAorIG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5hY3Rpdml0eSwKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZCwKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29yZSwKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY3NzLAorIG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cywKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuc3RydWN0dXJlcywKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkubWV0YWRhdGEsCisgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuY29yZSwKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5jc3MsCisgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuZWxlbWVudHMsCisgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuZWxlbWVudHMuaW50ZXJmYWNlcywKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5tZXRhZGF0YSwKKyBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC51dGlsLAorIG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLndyaXRlciwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmRpLmV4dGVuc2lvbnMsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wuY29tbW9uLmRhdGF0eXBlczt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQ7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmxheW91dCwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5tZXRhZGF0YTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkucmVwb3J0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS50aGVtZXM7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHMudGhlbWVzLnVpO3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMSwgMjAxNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9hYm91dC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjcxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2Fib3V0LmluaQpAQCAtMCwwICsxLDE3IEBACisjIGFib3V0LmluaQorIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCithYm91dFRleHQ9JWZlYXR1cmVUZXh0CisKKyMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKK2ZlYXR1cmVJbWFnZT0KKworIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCithcHBOYW1lPSVmZWF0dXJlTmFtZQorCisjIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKK3dlbGNvbWVQYWdlPQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9hYm91dC5tYXBwaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTExYTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYWJvdXQubWFwcGluZ3MKQEAgLTAsMCArMSw2IEBACisjIGFib3V0Lm1hcHBpbmdzCisjIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKzA9cXVhbGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYWJvdXQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAwNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYWJvdXQucHJvcGVydGllcwpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMKKworIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKKworZmVhdHVyZU5hbWU9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2JkZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICBzcmMtZ2VuLyxcCisgICAgICAgICAgIHh0ZW5kLWdlbi8sXAorICAgICAgICAgICBlbWYtZ2VuLworYmluLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIG1vZGVsLyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIC5jbGFzc3BhdGgsXAorICAgICAgICAgICAgICAgLnByb2plY3QsXAorICAgICAgICAgICAgICAgLnNldHRpbmdzLyxcCisgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9BdXRvVGV4dC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9BdXRvVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzlhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0F1dG9UZXh0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdXRvIFRleHQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRBdXRvVGV4dCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBdXRvVGV4dCBleHRlbmRzIEVsZW1lbnQsIFdpdGhTdHlsZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtCisJICogQHNlZSAjc2V0VHlwZShBdXRvVGV4dEVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEF1dG9UZXh0X1R5cGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRvVGV4dEVudW0gZ2V0VHlwZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW0KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUeXBlKEF1dG9UZXh0RW51bSB2YWx1ZSk7CisKK30gLy8gQXV0b1RleHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQXV0b1RleHRFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0F1dG9UZXh0RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTMwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0F1dG9UZXh0RW51bS5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QXV0byBUZXh0IEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRBdXRvVGV4dEVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIEF1dG9UZXh0RW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBBR0UgTlVNQkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BBR0VfTlVNQkVSX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUEFHRV9OVU1CRVIoMCwgIlBBR0VfTlVNQkVSIiwgInBhZ2UtbnVtYmVyIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5UT1RBTCBQQUdFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RPVEFMX1BBR0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlUT1RBTF9QQUdFKDAsICJUT1RBTF9QQUdFIiwgInRvdGFsLXBhZ2UiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBBR0UgTlVNQkVSIFVORklMVEVSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEFHRV9OVU1CRVJfVU5GSUxURVJFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBBR0VfTlVNQkVSX1VORklMVEVSRUQoMCwgIlBBR0VfTlVNQkVSX1VORklMVEVSRUQiLCAicGFnZS1udW1iZXItdW5maWx0ZXJlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+VE9UQUwgUEFHRSBVTkZJTFRFUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RPVEFMX1BBR0VfVU5GSUxURVJFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVRPVEFMX1BBR0VfVU5GSUxURVJFRCgwLCAiVE9UQUxfUEFHRV9VTkZJTFRFUkVEIiwgInRvdGFsLXBhZ2UtdW5maWx0ZXJlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEFHRSBWQVJJQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQQUdFX1ZBUklBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUEFHRV9WQVJJQUJMRSgwLCAiUEFHRV9WQVJJQUJMRSIsICJwYWdlLXZhcmlhYmxlIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QQUdFIE5VTUJFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEFHRSBOVU1CRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEFHRV9OVU1CRVIKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icGFnZS1udW1iZXIiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9OVU1CRVJfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+VE9UQUwgUEFHRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VE9UQUwgUEFHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNUT1RBTF9QQUdFCisJICogQG1vZGVsIGxpdGVyYWw9InRvdGFsLXBhZ2UiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUEFHRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QQUdFIE5VTUJFUiBVTkZJTFRFUkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QQUdFIE5VTUJFUiBVTkZJTFRFUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BBR0VfTlVNQkVSX1VORklMVEVSRUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icGFnZS1udW1iZXItdW5maWx0ZXJlZCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFX05VTUJFUl9VTkZJTFRFUkVEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRPVEFMIFBBR0UgVU5GSUxURVJFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VE9UQUwgUEFHRSBVTkZJTFRFUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RPVEFMX1BBR0VfVU5GSUxURVJFRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJ0b3RhbC1wYWdlLXVuZmlsdGVyZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUEFHRV9VTkZJTFRFUkVEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBBR0UgVkFSSUFCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBBR0UgVkFSSUFCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEFHRV9WQVJJQUJMRQorCSAqIEBtb2RlbCBsaXRlcmFsPSJwYWdlLXZhcmlhYmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBR0VfVkFSSUFCTEVfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkF1dG8gVGV4dCBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdXRvVGV4dEVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQXV0b1RleHRFbnVtW10geworCQkJUEFHRV9OVU1CRVIsCisJCQlUT1RBTF9QQUdFLAorCQkJUEFHRV9OVU1CRVJfVU5GSUxURVJFRCwKKwkJCVRPVEFMX1BBR0VfVU5GSUxURVJFRCwKKwkJCVBBR0VfVkFSSUFCTEUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QXV0byBUZXh0IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxBdXRvVGV4dEVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0byBUZXh0IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBBdXRvVGV4dEVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlBdXRvVGV4dEVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BdXRvIFRleHQgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEF1dG9UZXh0RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUF1dG9UZXh0RW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QXV0byBUZXh0IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBBdXRvVGV4dEVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFBBR0VfTlVNQkVSX1ZBTFVFOiByZXR1cm4gUEFHRV9OVU1CRVI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEF1dG9UZXh0RW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9BdXRvVGV4dEVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQmFzZVN0eWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0Jhc2VTdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODVhMzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0Jhc2VTdHlsZS5qYXZhCkBAIC0wLDAgKzEsNzYyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2UgU3R5bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0Rm9udCA8ZW0+Rm9udDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJhY2tncm91bmRjb2xvciA8ZW0+QmFja2dyb3VuZGNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFRleHRjb2xvciA8ZW0+VGV4dGNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0VGV4dGFsaWduIDxlbT5UZXh0YWxpZ248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJUb3AgPGVtPkJvcmRlciBUb3A8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJCb3R0b20gPGVtPkJvcmRlciBCb3R0b208L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJMZWZ0IDxlbT5Cb3JkZXIgTGVmdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlclJpZ2h0IDxlbT5Cb3JkZXIgUmlnaHQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nVG9wVmFsdWUgPGVtPlBhZGRpbmcgVG9wIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1RvcFVuaXQgPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nQm90dG9tVmFsdWUgPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ0JvdHRvbVVuaXQgPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nTGVmdFZhbHVlIDxlbT5QYWRkaW5nIExlZnQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nTGVmdFVuaXQgPGVtPlBhZGRpbmcgTGVmdCBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nUmlnaHRVbml0IDxlbT5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Ub3BWYWx1ZSA8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblRvcFVuaXQgPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkxlZnRWYWx1ZSA8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5MZWZ0VW5pdCA8ZW0+TWFyZ2luIExlZnQgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkJvdHRvbVZhbHVlIDxlbT5NYXJnaW4gQm90dG9tIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luQm90dG9tVW5pdCA8ZW0+TWFyZ2luIEJvdHRvbSBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luUmlnaHRWYWx1ZSA8ZW0+TWFyZ2luIFJpZ2h0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luUmlnaHRVbml0IDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZVN0eWxlIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gb3JtYXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvcm1hdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtYXQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEZvcm1hdChTb21lRm9ybWF0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfRm9ybWF0KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU29tZUZvcm1hdCBnZXRGb3JtYXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRGb3JtYXQgPGVtPkZvcm1hdDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybWF0PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvcm1hdChTb21lRm9ybWF0IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9udDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Rm9udChGb250KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfRm9udCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUZvbnQgZ2V0Rm9udCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEZvbnQgPGVtPkZvbnQ8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvbnQ8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEZvbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvbnQoRm9udCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kY29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhY2tncm91bmRjb2xvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kY29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJhY2tncm91bmRjb2xvcihDb2xvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX0JhY2tncm91bmRjb2xvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9yIGdldEJhY2tncm91bmRjb2xvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJhY2tncm91bmRjb2xvciA8ZW0+QmFja2dyb3VuZGNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kY29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJhY2tncm91bmRjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFja2dyb3VuZGNvbG9yKENvbG9yIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZShDb2xvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb2xvciBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZShDb2xvciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXh0Y29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRleHRjb2xvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0Y29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRleHRjb2xvcihDb2xvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX1RleHRjb2xvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9yIGdldFRleHRjb2xvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFRleHRjb2xvciA8ZW0+VGV4dGNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0Y29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFRleHRjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGV4dGNvbG9yKENvbG9yIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRleHRhbGlnbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGV4dGFsaWduPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHRhbGlnbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0QWxpZ25FbnVtCisJICogQHNlZSAjc2V0VGV4dGFsaWduKFRleHRBbGlnbkVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9UZXh0YWxpZ24oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZXh0QWxpZ25FbnVtIGdldFRleHRhbGlnbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFRleHRhbGlnbiA8ZW0+VGV4dGFsaWduPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0YWxpZ248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bQorCSAqIEBzZWUgI2dldFRleHRhbGlnbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGV4dGFsaWduKFRleHRBbGlnbkVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9yZGVyIFRvcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Qm9yZGVyIFRvcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgVG9wPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCb3JkZXJUb3AoQm9yZGVyU3R5bGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9Cb3JkZXJUb3AoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQm9yZGVyU3R5bGUgZ2V0Qm9yZGVyVG9wKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0Qm9yZGVyVG9wIDxlbT5Cb3JkZXIgVG9wPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgVG9wPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCb3JkZXJUb3AoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJvcmRlclRvcChCb3JkZXJTdHlsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb3JkZXIgQm90dG9tPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Cb3JkZXIgQm90dG9tPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvcmRlciBCb3R0b208L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJvcmRlckJvdHRvbShCb3JkZXJTdHlsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX0JvcmRlckJvdHRvbSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCb3JkZXJTdHlsZSBnZXRCb3JkZXJCb3R0b20oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJCb3R0b20gPGVtPkJvcmRlciBCb3R0b208L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvcmRlciBCb3R0b208L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJvcmRlckJvdHRvbSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Qm9yZGVyQm90dG9tKEJvcmRlclN0eWxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvcmRlciBMZWZ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Cb3JkZXIgTGVmdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgTGVmdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Qm9yZGVyTGVmdChCb3JkZXJTdHlsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX0JvcmRlckxlZnQoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQm9yZGVyU3R5bGUgZ2V0Qm9yZGVyTGVmdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlckxlZnQgPGVtPkJvcmRlciBMZWZ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgTGVmdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Qm9yZGVyTGVmdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Qm9yZGVyTGVmdChCb3JkZXJTdHlsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb3JkZXIgUmlnaHQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJvcmRlciBSaWdodDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgUmlnaHQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEJvcmRlclJpZ2h0KEJvcmRlclN0eWxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfQm9yZGVyUmlnaHQoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQm9yZGVyU3R5bGUgZ2V0Qm9yZGVyUmlnaHQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJSaWdodCA8ZW0+Qm9yZGVyIFJpZ2h0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb3JkZXIgUmlnaHQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJvcmRlclJpZ2h0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCb3JkZXJSaWdodChCb3JkZXJTdHlsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWRkaW5nIFRvcCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFBhZGRpbmdUb3BWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9QYWRkaW5nVG9wVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0UGFkZGluZ1RvcFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1RvcFZhbHVlIDxlbT5QYWRkaW5nIFRvcCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBhZGRpbmdUb3BWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFkZGluZ1RvcFZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWRkaW5nIFRvcCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFkZGluZyBUb3AgVW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIFRvcCBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjc2V0UGFkZGluZ1RvcFVuaXQoVW5pdEVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9QYWRkaW5nVG9wVW5pdCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuaXRFbnVtIGdldFBhZGRpbmdUb3BVbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1RvcFVuaXQgPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNnZXRQYWRkaW5nVG9wVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFkZGluZ1RvcFVuaXQoVW5pdEVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFkZGluZyBCb3R0b20gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQYWRkaW5nQm90dG9tVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfUGFkZGluZ0JvdHRvbVZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFBhZGRpbmdCb3R0b21WYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdCb3R0b21WYWx1ZSA8ZW0+UGFkZGluZyBCb3R0b20gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQYWRkaW5nQm90dG9tVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBhZGRpbmdCb3R0b21WYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFkZGluZyBCb3R0b20gVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFkZGluZyBCb3R0b20gVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldFBhZGRpbmdCb3R0b21Vbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfUGFkZGluZ0JvdHRvbVVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRQYWRkaW5nQm90dG9tVW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdCb3R0b21Vbml0IDxlbT5QYWRkaW5nIEJvdHRvbSBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIEJvdHRvbSBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBhZGRpbmdCb3R0b21Vbml0KFVuaXRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhZGRpbmcgTGVmdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFkZGluZyBMZWZ0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgTGVmdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UGFkZGluZ0xlZnRWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9QYWRkaW5nTGVmdFZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldFBhZGRpbmdMZWZ0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nTGVmdFZhbHVlIDxlbT5QYWRkaW5nIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgTGVmdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UGFkZGluZ0xlZnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFkZGluZ0xlZnRWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFkZGluZyBMZWZ0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWRkaW5nIExlZnQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIExlZnQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldFBhZGRpbmdMZWZ0VW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX1BhZGRpbmdMZWZ0VW5pdCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuaXRFbnVtIGdldFBhZGRpbmdMZWZ0VW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdMZWZ0VW5pdCA8ZW0+UGFkZGluZyBMZWZ0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgTGVmdCBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0UGFkZGluZ0xlZnRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQYWRkaW5nTGVmdFVuaXQoVW5pdEVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFkZGluZyBSaWdodCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFkZGluZyBSaWdodCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIFJpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQYWRkaW5nUmlnaHRWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9QYWRkaW5nUmlnaHRWYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRQYWRkaW5nUmlnaHRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdSaWdodFZhbHVlIDxlbT5QYWRkaW5nIFJpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIFJpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQYWRkaW5nUmlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFkZGluZ1JpZ2h0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhZGRpbmcgUmlnaHQgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhZGRpbmcgUmlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRQYWRkaW5nUmlnaHRVbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfUGFkZGluZ1JpZ2h0VW5pdCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuaXRFbnVtIGdldFBhZGRpbmdSaWdodFVuaXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nUmlnaHRVbml0IDxlbT5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZGRpbmcgUmlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldFBhZGRpbmdSaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBhZGRpbmdSaWdodFVuaXQoVW5pdEVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyZ2luIFRvcCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gVG9wIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXJnaW5Ub3BWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9NYXJnaW5Ub3BWYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRNYXJnaW5Ub3BWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblRvcFZhbHVlIDxlbT5NYXJnaW4gVG9wIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gVG9wIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXJnaW5Ub3BWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWFyZ2luVG9wVmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gVG9wIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRNYXJnaW5Ub3BVbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfTWFyZ2luVG9wVW5pdCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuaXRFbnVtIGdldE1hcmdpblRvcFVuaXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Ub3BVbml0IDxlbT5NYXJnaW4gVG9wIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldE1hcmdpblRvcFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcmdpblRvcFVuaXQoVW5pdEVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyZ2luIExlZnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXJnaW5MZWZ0VmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1hcmdpbkxlZnRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkxlZnRWYWx1ZSA8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXJnaW5MZWZ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcmdpbkxlZnRWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyZ2luIExlZnQgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcmdpbiBMZWZ0IFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFyZ2luIExlZnQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldE1hcmdpbkxlZnRVbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRNYXJnaW5MZWZ0VW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkxlZnRVbml0IDxlbT5NYXJnaW4gTGVmdCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gTGVmdCBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0TWFyZ2luTGVmdFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcmdpbkxlZnRVbml0KFVuaXRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcmdpbiBCb3R0b20gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcmdpbiBCb3R0b20gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFyZ2luIEJvdHRvbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFyZ2luQm90dG9tVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCYXNlU3R5bGVfTWFyZ2luQm90dG9tVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TWFyZ2luQm90dG9tVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Cb3R0b21WYWx1ZSA8ZW0+TWFyZ2luIEJvdHRvbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFyZ2luIEJvdHRvbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWFyZ2luQm90dG9tVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcmdpbkJvdHRvbVZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXJnaW4gQm90dG9tIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXJnaW4gQm90dG9tIFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFyZ2luIEJvdHRvbSBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjc2V0TWFyZ2luQm90dG9tVW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX01hcmdpbkJvdHRvbVVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRNYXJnaW5Cb3R0b21Vbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luQm90dG9tVW5pdCA8ZW0+TWFyZ2luIEJvdHRvbSBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gQm90dG9tIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNnZXRNYXJnaW5Cb3R0b21Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXJnaW5Cb3R0b21Vbml0KFVuaXRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcmdpbiBSaWdodCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFyZ2luIFJpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBSaWdodCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFyZ2luUmlnaHRWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJhc2VTdHlsZV9NYXJnaW5SaWdodFZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldE1hcmdpblJpZ2h0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5SaWdodFZhbHVlIDxlbT5NYXJnaW4gUmlnaHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBSaWdodCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWFyZ2luUmlnaHRWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFyZ2luIFJpZ2h0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldE1hcmdpblJpZ2h0VW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmFzZVN0eWxlX01hcmdpblJpZ2h0VW5pdCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuaXRFbnVtIGdldE1hcmdpblJpZ2h0VW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblJpZ2h0VW5pdCA8ZW0+TWFyZ2luIFJpZ2h0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcmdpbiBSaWdodCBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0TWFyZ2luUmlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXJnaW5SaWdodFVuaXQoVW5pdEVudW0gdmFsdWUpOworCit9IC8vIEJhc2VTdHlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0JpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU2YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5CaW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkRJVjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNESVZfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlESVYoMCwgIkRJViIsICJkaXZpZGUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkRJVjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RElWPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RJVgorCSAqIEBtb2RlbCBsaXRlcmFsPSJkaXZpZGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CaW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1bXSB7CisJCQlESVYsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QmluYXJ5IEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmluYXJ5IEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmluYXJ5IEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5CaW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgRElWX1ZBTFVFOiByZXR1cm4gRElWOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0JpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQm9yZGVyU3R5bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQm9yZGVyU3R5bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODcxZmIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Cb3JkZXJTdHlsZS5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJvcmRlciBTdHlsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRXaWR0aHZhbHVlIDxlbT5XaWR0aHZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRXaWR0aHVuaXQgPGVtPldpZHRodW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJvcmRlclN0eWxlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJvcmRlclN0eWxlIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtCisJICogQHNlZSAjc2V0VHlwZShCb3JkZXJUeXBlRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Qm9yZGVyU3R5bGVfVHlwZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvcmRlclR5cGVFbnVtIGdldFR5cGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZUVudW0KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUeXBlKEJvcmRlclR5cGVFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldpZHRodmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldpZHRodmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGh2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0V2lkdGh2YWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJvcmRlclN0eWxlX1dpZHRodmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0V2lkdGh2YWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUjZ2V0V2lkdGh2YWx1ZSA8ZW0+V2lkdGh2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGh2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0V2lkdGh2YWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0V2lkdGh2YWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2lkdGh1bml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2lkdGh1bml0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldpZHRodW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldFdpZHRodW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Qm9yZGVyU3R5bGVfV2lkdGh1bml0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVW5pdEVudW0gZ2V0V2lkdGh1bml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRXaWR0aHVuaXQgPGVtPldpZHRodW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGh1bml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0V2lkdGh1bml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRXaWR0aHVuaXQoVW5pdEVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbG9yPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbG9yPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb2xvcihDb2xvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Qm9yZGVyU3R5bGVfQ29sb3IoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb2xvciBnZXRDb2xvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2xvcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbG9yKENvbG9yIHZhbHVlKTsKKworfSAvLyBCb3JkZXJTdHlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Cb3JkZXJUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0JvcmRlclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRiMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Cb3JkZXJUeXBlLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Qm9yZGVyIFR5cGU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCb3JkZXJUeXBlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBCb3JkZXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9ORSgwLCAiTk9ORSIsICJub25lIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT0xJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTT0xJRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNPTElEKDAsICJTT0xJRCIsICJzb2xpZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RE9UVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RPVFRFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURPVFRFRCgwLCAiRE9UVEVEIiwgImRvdHRlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+REFTSEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RBU0hFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURBU0hFRCgwLCAiREFTSEVEIiwgImRhc2hlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RPVUJMRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURPVUJMRSgwLCAiRE9VQkxFIiwgImRvdWJsZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+R1JPT1ZFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0dST09WRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUdST09WRSgwLCAiR1JPT1ZFIiwgImdyb292ZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UklER0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUklER0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlSSURHRSgwLCAiUklER0UiLCAicmlkZ2UiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0VUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSU5TRVQoMCwgIklOU0VUIiwgImluc2V0IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVRTRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1VUU0VUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1VUU0VUKDAsICJPVVRTRVQiLCAib3V0c2V0Iik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibm9uZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPTElEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TT0xJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTT0xJRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJzb2xpZCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0xJRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5ET1RURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVFRFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNET1RURUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZG90dGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVFRFRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EQVNIRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRBU0hFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNEQVNIRUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZGFzaGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBU0hFRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNET1VCTEUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZG91YmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HUk9PVkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkdST09WRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHUk9PVkUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZ3Jvb3ZlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdST09WRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SSURHRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UklER0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUklER0UKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icmlkZ2UiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklER0VfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5TRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0VUCisJICogQG1vZGVsIGxpdGVyYWw9Imluc2V0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU0VUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVFNFVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVFNFVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJvdXRzZXQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUU0VUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBCb3JkZXJUeXBlW10geworCQkJTk9ORSwKKwkJCVNPTElELAorCQkJRE9UVEVELAorCQkJREFTSEVELAorCQkJRE9VQkxFLAorCQkJR1JPT1ZFLAorCQkJUklER0UsCisJCQlJTlNFVCwKKwkJCU9VVFNFVCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEJvcmRlclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBCb3JkZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQm9yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJvcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQm9yZGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUJvcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJvcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQm9yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEJvcmRlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vQm9yZGVyVHlwZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Cb3JkZXJUeXBlRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Cb3JkZXJUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDE3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0JvcmRlclR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Cb3JkZXIgVHlwZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Qm9yZGVyVHlwZUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIEJvcmRlclR5cGVFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9ORSgwLCAiTk9ORSIsICJub25lIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT0xJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTT0xJRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNPTElEKDAsICJTT0xJRCIsICJzb2xpZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RE9UVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RPVFRFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURPVFRFRCgwLCAiRE9UVEVEIiwgImRvdHRlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+REFTSEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RBU0hFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURBU0hFRCgwLCAiREFTSEVEIiwgImRhc2hlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RPVUJMRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURPVUJMRSgwLCAiRE9VQkxFIiwgImRvdWJsZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+R1JPT1ZFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0dST09WRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUdST09WRSgwLCAiR1JPT1ZFIiwgImdyb292ZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UklER0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUklER0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlSSURHRSgwLCAiUklER0UiLCAicmlkZ2UiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0VUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSU5TRVQoMCwgIklOU0VUIiwgImluc2V0IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVRTRVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1VUU0VUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1VUU0VUKDAsICJPVVRTRVQiLCAib3V0c2V0Iik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibm9uZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPTElEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TT0xJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTT0xJRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJzb2xpZCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0xJRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5ET1RURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVFRFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNET1RURUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZG90dGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVFRFRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EQVNIRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRBU0hFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNEQVNIRUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZGFzaGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBU0hFRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNET1VCTEUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZG91YmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HUk9PVkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkdST09WRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHUk9PVkUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZ3Jvb3ZlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdST09WRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SSURHRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UklER0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUklER0UKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icmlkZ2UiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklER0VfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5TRVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0VUCisJICogQG1vZGVsIGxpdGVyYWw9Imluc2V0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU0VUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVFNFVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUU0VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVFNFVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJvdXRzZXQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUU0VUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Cb3JkZXIgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXJUeXBlRW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBCb3JkZXJUeXBlRW51bVtdIHsKKwkJCU5PTkUsCisJCQlTT0xJRCwKKwkJCURPVFRFRCwKKwkJCURBU0hFRCwKKwkJCURPVUJMRSwKKwkJCUdST09WRSwKKwkJCVJJREdFLAorCQkJSU5TRVQsCisJCQlPVVRTRVQsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Qm9yZGVyIFR5cGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEJvcmRlclR5cGVFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJvcmRlciBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBCb3JkZXJUeXBlRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUJvcmRlclR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Qm9yZGVyIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJvcmRlclR5cGVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQm9yZGVyVHlwZUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJvcmRlciBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBCb3JkZXJUeXBlRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEJvcmRlclR5cGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0JvcmRlclR5cGVFbnVtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0J1aWxkSW5Gb250RmFtaWx5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0J1aWxkSW5Gb250RmFtaWx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiMDJjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQnVpbGRJbkZvbnRGYW1pbHkuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5I2dldEN1c3RvbSA8ZW0+Q3VzdG9tPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEJ1aWxkSW5Gb250RmFtaWx5KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJ1aWxkSW5Gb250RmFtaWx5IGV4dGVuZHMgRm9udEZhbWlseSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHlFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b208L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHlFbnVtCisJICogQHNlZSAjc2V0Q3VzdG9tKEJ1aWxkSW5Gb250RmFtaWx5RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0QnVpbGRJbkZvbnRGYW1pbHlfQ3VzdG9tKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQnVpbGRJbkZvbnRGYW1pbHlFbnVtIGdldEN1c3RvbSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHkjZ2V0Q3VzdG9tIDxlbT5DdXN0b208L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseUVudW0KKwkgKiBAc2VlICNnZXRDdXN0b20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEN1c3RvbShCdWlsZEluRm9udEZhbWlseUVudW0gdmFsdWUpOworCit9IC8vIEJ1aWxkSW5Gb250RmFtaWx5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0J1aWxkSW5Gb250RmFtaWx5RW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9CdWlsZEluRm9udEZhbWlseUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc4MzVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9CdWlsZEluRm9udEZhbWlseUVudW0uamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5IEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRCdWlsZEluRm9udEZhbWlseUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIEJ1aWxkSW5Gb250RmFtaWx5RW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1PTk9TUEFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNNT05PU1BBQ0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlNT05PU1BBQ0UoMCwgIk1PTk9TUEFDRSIsICJtb25vc3BhY2UiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNBTlMgU0VSSUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0FOU19TRVJJRl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNBTlNfU0VSSUYoMCwgIlNBTlNfU0VSSUYiLCAic2Fucy1zZXJpZiIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0VSSUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VSSUZfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTRVJJRigwLCAiU0VSSUYiLCAic2VyaWYiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1PTk9TUEFDRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TU9OT1NQQUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI01PTk9TUEFDRQorCSAqIEBtb2RlbCBsaXRlcmFsPSJtb25vc3BhY2UiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9OT1NQQUNFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNBTlMgU0VSSUY8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNBTlMgU0VSSUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0FOU19TRVJJRgorCSAqIEBtb2RlbCBsaXRlcmFsPSJzYW5zLXNlcmlmIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBTlNfU0VSSUZfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0VSSUY8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFUklGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NFUklGCisJICogQG1vZGVsIGxpdGVyYWw9InNlcmlmIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUklGX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CdWlsZCBJbiBGb250IEZhbWlseSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCdWlsZEluRm9udEZhbWlseUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQnVpbGRJbkZvbnRGYW1pbHlFbnVtW10geworCQkJTU9OT1NQQUNFLAorCQkJU0FOU19TRVJJRiwKKwkJCVNFUklGLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxCdWlsZEluRm9udEZhbWlseUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QnVpbGQgSW4gRm9udCBGYW1pbHkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJ1aWxkSW5Gb250RmFtaWx5RW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUJ1aWxkSW5Gb250RmFtaWx5RW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBCdWlsZEluRm9udEZhbWlseUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlCdWlsZEluRm9udEZhbWlseUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBCdWlsZEluRm9udEZhbWlseUVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIE1PTk9TUEFDRV9WQUxVRTogcmV0dXJuIE1PTk9TUEFDRTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQnVpbGRJbkZvbnRGYW1pbHlFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0J1aWxkSW5Gb250RmFtaWx5RW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db2xvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db2xvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYmY2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0NvbG9yLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXRCYXNlY29sb3IgPGVtPkJhc2Vjb2xvcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0RGFya2Vuc2J5IDxlbT5EYXJrZW5zYnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldExpZ2h0ZW5zYnkgPGVtPkxpZ2h0ZW5zYnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldFRyYW5zZm9ybXNieSA8ZW0+VHJhbnNmb3Jtc2J5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXRUYXJnZXRjb2xvciA8ZW0+VGFyZ2V0Y29sb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q29sb3IoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29sb3IgZXh0ZW5kcyBSZXBvcnRCYXNlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xvcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbG9yKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q29sb3JfQ29sb3IoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q29sb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb2xvcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlY29sb3I8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWNvbG9yPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCYXNlY29sb3IoQ29sb3IpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldENvbG9yX0Jhc2Vjb2xvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9yIGdldEJhc2Vjb2xvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0QmFzZWNvbG9yIDxlbT5CYXNlY29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2Vjb2xvcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmFzZWNvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCYXNlY29sb3IoQ29sb3IgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGFya2Vuc2J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXJrZW5zYnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGFya2Vuc2J5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREYXJrZW5zYnkoSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q29sb3JfRGFya2Vuc2J5KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSW50ZWdlciBnZXREYXJrZW5zYnkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldERhcmtlbnNieSA8ZW0+RGFya2Vuc2J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXJrZW5zYnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERhcmtlbnNieSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGFya2Vuc2J5KEludGVnZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlnaHRlbnNieTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlnaHRlbnNieTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaWdodGVuc2J5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMaWdodGVuc2J5KEludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldENvbG9yX0xpZ2h0ZW5zYnkoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJbnRlZ2VyIGdldExpZ2h0ZW5zYnkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldExpZ2h0ZW5zYnkgPGVtPkxpZ2h0ZW5zYnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpZ2h0ZW5zYnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExpZ2h0ZW5zYnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExpZ2h0ZW5zYnkoSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1zYnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zZm9ybXNieTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2Zvcm1zYnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRyYW5zZm9ybXNieShJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRDb2xvcl9UcmFuc2Zvcm1zYnkoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJbnRlZ2VyIGdldFRyYW5zZm9ybXNieSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0VHJhbnNmb3Jtc2J5IDxlbT5UcmFuc2Zvcm1zYnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zZm9ybXNieTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VHJhbnNmb3Jtc2J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUcmFuc2Zvcm1zYnkoSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXRjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0Y29sb3I8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0Y29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRhcmdldGNvbG9yKENvbG9yKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRDb2xvcl9UYXJnZXRjb2xvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9yIGdldFRhcmdldGNvbG9yKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXRUYXJnZXRjb2xvciA8ZW0+VGFyZ2V0Y29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldGNvbG9yPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUYXJnZXRjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGFyZ2V0Y29sb3IoQ29sb3IgdmFsdWUpOworCit9IC8vIENvbG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0NvbG9ycy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db2xvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2YwMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db2xvcnMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2xvcnM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzI2dldENvbG9ycyA8ZW0+Q29sb3JzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldENvbG9ycygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb2xvcnMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q29sb3JzX0NvbG9ycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxDb2xvcj4gZ2V0Q29sb3JzKCk7CisKK30gLy8gQ29sb3JzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0NvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk0NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Db250YWluZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29udGFpbmVyI2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRDb250YWluZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q29udGFpbmVyX0VsZW1lbnRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PEVsZW1lbnQ+IGdldEVsZW1lbnRzKCk7CisKK30gLy8gQ29udGFpbmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1cnJlbmN5Rm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1cnJlbmN5Rm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmNGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQ3VycmVuY3lGb3JtYXQuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1cnJlbmN5IEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRDdXJyZW5jeUZvcm1hdCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDdXJyZW5jeUZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0KKwkgKiBAc2VlICNzZXRSZXBvcnRfY2F0ZWdvcnkoQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEN1cnJlbmN5Rm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIGdldFJlcG9ydF9jYXRlZ29yeSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVwb3J0X2NhdGVnb3J5KEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIHZhbHVlKTsKKworfSAvLyBDdXJyZW5jeUZvcm1hdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9DdXJyZW5jeUZvcm1hdENhdGVnb3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MyMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9DdXJyZW5jeUZvcm1hdENhdGVnb3J5LmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQ3VycmVuY3lGb3JtYXRDYXRlZ29yeSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVORk9STUFUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VORk9STUFUVEVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVU5GT1JNQVRURUQoMCwgIlVORk9STUFUVEVEIiwgInVuZm9ybWF0dGVkIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVJSRU5DWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVJSRU5DWV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNVUlJFTkNZKDAsICJDVVJSRU5DWSIsICJjdXJyZW5jeSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNVU1RPTSgwLCAiQ1VTVE9NIiwgImN1c3RvbSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+VU5GT1JNQVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVORk9STUFUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VORk9STUFUVEVECisJICogQG1vZGVsIGxpdGVyYWw9InVuZm9ybWF0dGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORk9STUFUVEVEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVUlJFTkNZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DVVJSRU5DWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVJSRU5DWQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXJyZW5jeSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJSRU5DWV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT00KKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY3VzdG9tIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXJyZW5jeUZvcm1hdENhdGVnb3J5W10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlbXSB7CisJCQlVTkZPUk1BVFRFRCwKKwkJCUNVUlJFTkNZLAorCQkJQ1VTVE9NLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkN1cnJlbmN5IEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnk+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnkgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DdXJyZW5jeSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDdXJyZW5jeUZvcm1hdENhdGVnb3J5IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQ3VycmVuY3lGb3JtYXRDYXRlZ29yeSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgVU5GT1JNQVRURURfVkFMVUU6IHJldHVybiBVTkZPUk1BVFRFRDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9DdXJyZW5jeUZvcm1hdENhdGVnb3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNzM3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0uamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkN1cnJlbmN5IEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+VU5GT1JNQVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVU5GT1JNQVRURURfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlVTkZPUk1BVFRFRCgwLCAiVU5GT1JNQVRURUQiLCAidW5mb3JtYXR0ZWQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVUlJFTkNZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVUlJFTkNZX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ1VSUkVOQ1koMCwgIkNVUlJFTkNZIiwgImN1cnJlbmN5IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ1VTVE9NKDAsICJDVVNUT00iLCAiY3VzdG9tIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VTkZPUk1BVFRFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5GT1JNQVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVU5GT1JNQVRURUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idW5mb3JtYXR0ZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5GT1JNQVRURURfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VSUkVOQ1k8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNVUlJFTkNZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVUlJFTkNZCisJICogQG1vZGVsIGxpdGVyYWw9ImN1cnJlbmN5IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlJFTkNZX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXN0b20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VTVE9NX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DdXJyZW5jeSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1bXSB7CisJCQlVTkZPUk1BVFRFRCwKKwkJCUNVUlJFTkNZLAorCQkJQ1VTVE9NLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkN1cnJlbmN5IEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DdXJyZW5jeSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBVTkZPUk1BVFRFRF9WQUxVRTogcmV0dXJuIFVORk9STUFUVEVEOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9DdXN0b21Gb250RmFtaWx5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0N1c3RvbUZvbnRGYW1pbHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ0NjBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9DdXN0b21Gb250RmFtaWx5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gRm9udCBGYW1pbHk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VzdG9tRm9udEZhbWlseSNnZXRDdXN0b20gPGVtPkN1c3RvbTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRDdXN0b21Gb250RmFtaWx5KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEN1c3RvbUZvbnRGYW1pbHkgZXh0ZW5kcyBGb250RmFtaWx5IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b208L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEN1c3RvbShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEN1c3RvbUZvbnRGYW1pbHlfQ3VzdG9tKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEN1c3RvbSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VzdG9tRm9udEZhbWlseSNnZXRDdXN0b20gPGVtPkN1c3RvbTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDdXN0b20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEN1c3RvbShTdHJpbmcgdmFsdWUpOworCit9IC8vIEN1c3RvbUZvbnRGYW1pbHkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0YW1hcnRUYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmODhhMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0YW1hcnRUYWJsZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUjZ2V0R3JvdXBzIDxlbT5Hcm91cHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUjZ2V0RGV0YWlsIDxlbT5EZXRhaWw8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0YW1hcnRUYWJsZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhbWFydFRhYmxlIGV4dGVuZHMgUmVwb3J0QmFzZSwgRWxlbWVudCwgV2l0aFN0eWxlLCBXaXRoSGVhZGVyRm9vdGVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXB9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlX0dyb3VwcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxEYXRhbWFydFRhYmxlR3JvdXA+IGdldEdyb3VwcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGV0YWlsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXRhaWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGV0YWlsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREZXRhaWwoRGF0YW1hcnRUYWJsZURldGFpbCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0YW1hcnRUYWJsZV9EZXRhaWwoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZURldGFpbCBnZXREZXRhaWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUjZ2V0RGV0YWlsIDxlbT5EZXRhaWw8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRldGFpbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGV0YWlsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXRhaWwoRGF0YW1hcnRUYWJsZURldGFpbCB2YWx1ZSk7CisKK30gLy8gRGF0YW1hcnRUYWJsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlRGV0YWlsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGFtYXJ0VGFibGVEZXRhaWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ0Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlRGV0YWlsLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YW1hcnQgVGFibGUgRGV0YWlsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwjZ2V0Q29sdW1uRm9ybWF0dGVycyA8ZW0+Q29sdW1uIEZvcm1hdHRlcnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0YW1hcnRUYWJsZURldGFpbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhbWFydFRhYmxlRGV0YWlsIGV4dGVuZHMgV2l0aFN0eWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gRm9ybWF0dGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW4gRm9ybWF0dGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBGb3JtYXR0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlRGV0YWlsX0NvbHVtbkZvcm1hdHRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8RGF0YW1hcnRUYWJsZVByb3BlcnR5PiBnZXRDb2x1bW5Gb3JtYXR0ZXJzKCk7CisKK30gLy8gRGF0YW1hcnRUYWJsZURldGFpbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlR3JvdXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0YW1hcnRUYWJsZUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0YW1hcnRUYWJsZUdyb3VwLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0UHJvcGVydHk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cCNnZXRHcm91cGluZ1JlZiA8ZW0+R3JvdXBpbmcgUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cCNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlR3JvdXAoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YW1hcnRUYWJsZUdyb3VwIGV4dGVuZHMgUmVwb3J0QmFzZSwgV2l0aEhlYWRlckZvb3RlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXBpbmcgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cGluZyBSZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXBpbmcgUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRHcm91cGluZ1JlZihEYXRhbWFydFByb3BlcnR5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlR3JvdXBfR3JvdXBpbmdSZWYoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhbWFydFByb3BlcnR5IGdldEdyb3VwaW5nUmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAjZ2V0R3JvdXBpbmdSZWYgPGVtPkdyb3VwaW5nIFJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXBpbmcgUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRHcm91cGluZ1JlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0R3JvdXBpbmdSZWYoRGF0YW1hcnRQcm9wZXJ0eSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEhlYWRlcihEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVHcm91cF9IZWFkZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIGdldEhlYWRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwI2dldEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SGVhZGVyKERhdGFtYXJ0VGFibGVHcm91cEhlYWRlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gb290ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvb3RlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb290ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEZvb3RlcihEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVHcm91cF9Gb290ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyIGdldEZvb3RlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwI2dldEZvb3RlciA8ZW0+Rm9vdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb290ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEZvb3RlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Rm9vdGVyKERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciB2YWx1ZSk7CisKK30gLy8gRGF0YW1hcnRUYWJsZUdyb3VwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlR3JvdXBGb290ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQwN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlR3JvdXBGb290ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZXh0ZW5kcyBFbGVtZW50LCBTb21lR3JpZCwgV2l0aFN0eWxlIHsKK30gLy8gRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVkYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgZXh0ZW5kcyBFbGVtZW50LCBTb21lR3JpZCwgV2l0aFN0eWxlIHsKK30gLy8gRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGFtYXJ0VGFibGVQcm9wZXJ0eS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZlMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRhbWFydFRhYmxlUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAgISEhIGNvcHkgZnJvbSB0YWJsZWRzbCAuLi4KKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNnZXRJbnRlcnZhbHMgPGVtPkludGVydmFsczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5I2lzSGlkZUxhYmVsSW50ZXJ2YWwgPGVtPkhpZGUgTGFiZWwgSW50ZXJ2YWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNnZXRMb29rdXBzIDxlbT5Mb29rdXBzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIaWRlTGFiZWxMb29rdXAgPGVtPkhpZGUgTGFiZWwgTG9va3VwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIYXNJbWFnZSA8ZW0+SGFzIEltYWdlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0SW1hZ2UgPGVtPkltYWdlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhbWFydFRhYmxlUHJvcGVydHkgZXh0ZW5kcyBFbGVtZW50LCBXaXRoU3R5bGUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29sdW1uKFRhYmxlVmFsdWVFbGVtZW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfQ29sdW1uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVRhYmxlVmFsdWVFbGVtZW50IGdldENvbHVtbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5I2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29sdW1uKFRhYmxlVmFsdWVFbGVtZW50IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVydmFsczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWx9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJ2YWxzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJ2YWxzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSW50ZXJ2YWxzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFRhYmxlSW50ZXJ2YWw+IGdldEludGVydmFscygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGlkZSBMYWJlbCBJbnRlcnZhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGlkZSBMYWJlbCBJbnRlcnZhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIExhYmVsIEludGVydmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRIaWRlTGFiZWxJbnRlcnZhbChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGlkZUxhYmVsSW50ZXJ2YWwoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzSGlkZUxhYmVsSW50ZXJ2YWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNpc0hpZGVMYWJlbEludGVydmFsIDxlbT5IaWRlIExhYmVsIEludGVydmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIExhYmVsIEludGVydmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0hpZGVMYWJlbEludGVydmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRIaWRlTGFiZWxJbnRlcnZhbChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUxvb2t1cH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb29rdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0xvb2t1cHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8VGFibGVMb29rdXA+IGdldExvb2t1cHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpZGUgTGFiZWwgTG9va3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaWRlIExhYmVsIExvb2t1cDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIExhYmVsIExvb2t1cDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SGlkZUxhYmVsTG9va3VwKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9IaWRlTGFiZWxMb29rdXAoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzSGlkZUxhYmVsTG9va3VwKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIaWRlTGFiZWxMb29rdXAgPGVtPkhpZGUgTGFiZWwgTG9va3VwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIExhYmVsIExvb2t1cDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNIaWRlTGFiZWxMb29rdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhpZGVMYWJlbExvb2t1cChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBJbWFnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzIEltYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBJbWFnZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SGFzSW1hZ2UoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0hhc0ltYWdlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0hhc0ltYWdlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIYXNJbWFnZSA8ZW0+SGFzIEltYWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgSW1hZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzSGFzSW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhhc0ltYWdlKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRJbWFnZShUYWJsZUltYWdlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSW1hZ2UoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVJbWFnZSBnZXRJbWFnZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5I2dldEltYWdlIDxlbT5JbWFnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1hZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEltYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbWFnZShUYWJsZUltYWdlIHZhbHVlKTsKKworfSAvLyBEYXRhbWFydFRhYmxlUHJvcGVydHkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZUZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlRm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4OTlmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZUZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0ZSBGb3JtYXQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRlRm9ybWF0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGVGb3JtYXQgZXh0ZW5kcyBTb21lRm9ybWF0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQgY2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgI3NldFJlcG9ydF9jYXRlZ29yeShEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRlRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGVGb3JtYXRDYXRlZ29yeUVudW0gZ2V0UmVwb3J0X2NhdGVnb3J5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0I2dldFJlcG9ydF9jYXRlZ29yeSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVwb3J0X2NhdGVnb3J5KERhdGVGb3JtYXRDYXRlZ29yeUVudW0gdmFsdWUpOworCit9IC8vIERhdGVGb3JtYXQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZUZvcm1hdENhdGVnb3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVGb3JtYXRDYXRlZ29yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTY5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVGb3JtYXRDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRhdGUgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0ZUZvcm1hdENhdGVnb3J5KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBEYXRlRm9ybWF0Q2F0ZWdvcnkgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ1VTVE9NKDAsICJDVVNUT00iLCAiY3VzdG9tIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT00KKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY3VzdG9tIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXRDYXRlZ29yeVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBEYXRlRm9ybWF0Q2F0ZWdvcnlbXSB7CisJCQlDVVNUT00sCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxEYXRlRm9ybWF0Q2F0ZWdvcnk+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlRm9ybWF0Q2F0ZWdvcnkgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlEYXRlRm9ybWF0Q2F0ZWdvcnkgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRlIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVGb3JtYXRDYXRlZ29yeSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCURhdGVGb3JtYXRDYXRlZ29yeSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlRm9ybWF0Q2F0ZWdvcnkgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIENVU1RPTV9WQUxVRTogcmV0dXJuIENVU1RPTTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRGF0ZUZvcm1hdENhdGVnb3J5KGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0RhdGVGb3JtYXRDYXRlZ29yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVGb3JtYXRDYXRlZ29yeUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBhYTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RGF0ZUZvcm1hdENhdGVnb3J5RW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gRGF0ZUZvcm1hdENhdGVnb3J5RW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT01fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDVVNUT00oMCwgIkNVU1RPTSIsICJjdXN0b20iKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXN0b20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VTVE9NX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IERhdGVGb3JtYXRDYXRlZ29yeUVudW1bXSB7CisJCQlDVVNUT00sCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PERhdGVGb3JtYXRDYXRlZ29yeUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVGb3JtYXRDYXRlZ29yeUVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVGb3JtYXRDYXRlZ29yeUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRGF0ZUZvcm1hdENhdGVnb3J5RW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgQ1VTVE9NX1ZBTFVFOiByZXR1cm4gQ1VTVE9NOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0RhdGVGb3JtYXRDYXRlZ29yeUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZVRpbWVGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZVRpbWVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU4ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlVGltZUZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0ZSBUaW1lIEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXREYXRlVGltZUZvcm1hdCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRlVGltZUZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkgKiBAc2VlICNzZXRSZXBvcnRfY2F0ZWdvcnkoRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGVUaW1lRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldFJlcG9ydF9jYXRlZ29yeSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVwb3J0X2NhdGVnb3J5KERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHZhbHVlKTsKKworfSAvLyBEYXRlVGltZUZvcm1hdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlVGltZUZvcm1hdENhdGVnb3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjRhY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9EYXRlVGltZUZvcm1hdENhdGVnb3J5LmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ1VTVE9NKDAsICJDVVNUT00iLCAiY3VzdG9tIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT00KKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY3VzdG9tIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBEYXRlVGltZUZvcm1hdENhdGVnb3J5W10geworCQkJQ1VTVE9NLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxEYXRlVGltZUZvcm1hdENhdGVnb3J5PiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlVGltZUZvcm1hdENhdGVnb3J5IGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlVGltZUZvcm1hdENhdGVnb3J5IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIENVU1RPTV9WQUxVRTogcmV0dXJuIENVU1RPTTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9EYXRlVGltZUZvcm1hdENhdGVnb3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0RhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyYmZmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT01fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDVVNUT00oMCwgIkNVU1RPTSIsICJjdXN0b20iKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXN0b20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VTVE9NX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EYXRlIFRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtW10geworCQkJQ1VTVE9NLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGUgVGltZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRlIFRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRlIFRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgQ1VTVE9NX1ZBTFVFOiByZXR1cm4gQ1VTVE9NOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9FbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0VsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdlZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9FbGVtZW50LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0RWxlbWVudCgpCisgKiBAbW9kZWwgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKK30gLy8gRWxlbWVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Gb250LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0ZvbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA1OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Gb250LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Rm9udDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldEV4dGVuZHMgPGVtPkV4dGVuZHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0RmFtaWx5IDxlbT5GYW1pbHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2lzQm9sZCA8ZW0+Qm9sZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRTaXpldmFsdWUgPGVtPlNpemV2YWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRTaXpldW5pdCA8ZW0+U2l6ZXVuaXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Rm9udCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBGb250IGV4dGVuZHMgUmVwb3J0QmFzZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZW5kczwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRFeHRlbmRzKEZvbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEZvbnRfRXh0ZW5kcygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUZvbnQgZ2V0RXh0ZW5kcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRFeHRlbmRzIDxlbT5FeHRlbmRzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFeHRlbmRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFeHRlbmRzKEZvbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmFtaWx5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GYW1pbHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmFtaWx5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRGYW1pbHkoRm9udEZhbWlseSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Rm9udF9GYW1pbHkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRm9udEZhbWlseSBnZXRGYW1pbHkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0RmFtaWx5IDxlbT5GYW1pbHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZhbWlseTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGYW1pbHkoRm9udEZhbWlseSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRTdHlsZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bQorCSAqIEBzZWUgI3NldFN0eWxlKEZvbnRTdHlsZUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEZvbnRfU3R5bGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGb250U3R5bGVFbnVtIGdldFN0eWxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bQorCSAqIEBzZWUgI2dldFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTdHlsZShGb250U3R5bGVFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJvbGQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9sZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Qm9sZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRGb250X0JvbGQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzQm9sZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNpc0JvbGQgPGVtPkJvbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvbGQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzQm9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Qm9sZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemV2YWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2l6ZXZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemV2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2l6ZXZhbHVlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Rm9udF9TaXpldmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0U2l6ZXZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldFNpemV2YWx1ZSA8ZW0+U2l6ZXZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXpldmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNpemV2YWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2l6ZXZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXpldW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemV1bml0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemV1bml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjc2V0U2l6ZXVuaXQoVW5pdEVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEZvbnRfU2l6ZXVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRTaXpldW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRTaXpldW5pdCA8ZW0+U2l6ZXVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemV1bml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0U2l6ZXVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNpemV1bml0KFVuaXRFbnVtIHZhbHVlKTsKKworfSAvLyBGb250CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0ZvbnRGYW1pbHkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udEZhbWlseS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDg4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0ZvbnRGYW1pbHkuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZvbnQgRmFtaWx5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Rm9udEZhbWlseSgpCisgKiBAbW9kZWwgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBGb250RmFtaWx5IGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKK30gLy8gRm9udEZhbWlseQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Gb250U3R5bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udFN0eWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwZWVlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udFN0eWxlLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Rm9udCBTdHlsZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEZvbnRTdHlsZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gRm9udFN0eWxlIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9STUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PUk1BTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PUk1BTCgwLCAiTk9STUFMIiwgIm5vcm1hbCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SVRBTElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lUQUxJQ19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlUQUxJQygwLCAiSVRBTElDIiwgIml0YWxpYyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+T0JMSVFVRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPQkxJUVVFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT0JMSVFVRSgwLCAiT0JMSVFVRSIsICJvYmxpcXVlIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT1JNQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PUk1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT1JNQUwKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibm9ybWFsIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5JVEFMSUM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklUQUxJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJVEFMSUMKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iaXRhbGljIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElUQUxJQ19WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PQkxJUVVFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PQkxJUVVFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09CTElRVUUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ib2JsaXF1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkxJUVVFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Gb250IFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb250U3R5bGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgRm9udFN0eWxlW10geworCQkJTk9STUFMLAorCQkJSVRBTElDLAorCQkJT0JMSVFVRSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Gb250IFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Rm9udFN0eWxlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZvbnQgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBGb250U3R5bGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlGb250U3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gb250IFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRm9udFN0eWxlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJRm9udFN0eWxlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gb250IFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRm9udFN0eWxlIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBOT1JNQUxfVkFMVUU6IHJldHVybiBOT1JNQUw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEZvbnRTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Gb250U3R5bGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udFN0eWxlRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Gb250U3R5bGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlNmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udFN0eWxlRW51bS5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Rm9udCBTdHlsZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0Rm9udFN0eWxlRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gRm9udFN0eWxlRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PUk1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT1JNQUxfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT1JNQUwoMCwgIk5PUk1BTCIsICJub3JtYWwiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklUQUxJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJVEFMSUNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJVEFMSUMoMCwgIklUQUxJQyIsICJpdGFsaWMiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9CTElRVUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT0JMSVFVRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9CTElRVUUoMCwgIk9CTElRVUUiLCAib2JsaXF1ZSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9STUFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1JNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9STUFMCisJICogQG1vZGVsIGxpdGVyYWw9Im5vcm1hbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SVRBTElDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JVEFMSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSVRBTElDCisJICogQG1vZGVsIGxpdGVyYWw9Iml0YWxpYyIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEFMSUNfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+T0JMSVFVRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T0JMSVFVRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPQkxJUVVFCisJICogQG1vZGVsIGxpdGVyYWw9Im9ibGlxdWUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JMSVFVRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Rm9udCBTdHlsZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb250U3R5bGVFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IEZvbnRTdHlsZUVudW1bXSB7CisJCQlOT1JNQUwsCisJCQlJVEFMSUMsCisJCQlPQkxJUVVFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkZvbnQgU3R5bGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEZvbnRTdHlsZUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Rm9udCBTdHlsZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRm9udFN0eWxlRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUZvbnRTdHlsZUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gb250IFN0eWxlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBGb250U3R5bGVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJRm9udFN0eWxlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Rm9udCBTdHlsZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRm9udFN0eWxlRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgTk9STUFMX1ZBTFVFOiByZXR1cm4gTk9STUFMOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBGb250U3R5bGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0ZvbnRTdHlsZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udHMuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvRm9udHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE4NGZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Gb250cy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZvbnRzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzI2dldEZvbnRzIDxlbT5Gb250czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRGb250cygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBGb250cyBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9udHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9udHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEZvbnRzX0ZvbnRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PEZvbnQ+IGdldEZvbnRzKCk7CisKK30gLy8gRm9udHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvR3JpZC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9HcmlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZTc3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvR3JpZC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JpZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqICAuLi4gY29weSBmcm9tIHRhYmxlZHNsICEhIQorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0R3JpZCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHcmlkIGV4dGVuZHMgUmVwb3J0QmFzZSwgRWxlbWVudCwgU29tZUdyaWQgeworfSAvLyBHcmlkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0dyaWRDZWxsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0dyaWRDZWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViNzZlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvR3JpZENlbGwuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyaWQgQ2VsbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbCNnZXRDb2x1bW5zcGFuIDxlbT5Db2x1bW5zcGFuPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEdyaWRDZWxsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyaWRDZWxsIGV4dGVuZHMgUmVwb3J0QmFzZSwgQ29udGFpbmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW5zcGFuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW5zcGFuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbnNwYW48L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbHVtbnNwYW4oaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRHcmlkQ2VsbF9Db2x1bW5zcGFuKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldENvbHVtbnNwYW4oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsI2dldENvbHVtbnNwYW4gPGVtPkNvbHVtbnNwYW48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbnNwYW48L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbHVtbnNwYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbHVtbnNwYW4oaW50IHZhbHVlKTsKKworfSAvLyBHcmlkQ2VsbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9HcmlkUm93LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0dyaWRSb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI0NWZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9HcmlkUm93LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JpZCBSb3c8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdyNnZXRDZWxscyA8ZW0+Q2VsbHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0R3JpZFJvdygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBHcmlkUm93IGV4dGVuZHMgUmVwb3J0QmFzZSwgV2l0aFN0eWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DZWxsczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNlbGxzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2VsbHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEdyaWRSb3dfQ2VsbHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8R3JpZENlbGw+IGdldENlbGxzKCk7CisKK30gLy8gR3JpZFJvdwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9JbWFnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9JbWFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDcwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0ltYWdlLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRTb3VyY2VUeXBlIDxlbT5Tb3VyY2UgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0RmlsZW5hbWUgPGVtPkZpbGVuYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEltYWdlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEltYWdlIGV4dGVuZHMgRWxlbWVudCwgV2l0aFN0eWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTaXplRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTaXplRW51bQorCSAqIEBzZWUgI3NldFNpemUoSW1hZ2VTaXplRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0SW1hZ2VfU2l6ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUltYWdlU2l6ZUVudW0gZ2V0U2l6ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtCisJICogQHNlZSAjZ2V0U2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2l6ZShJbWFnZVNpemVFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2NhbGUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRJbWFnZV9TY2FsZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRTY2FsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNjYWxlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU291cmNlRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb3VyY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNvdXJjZUVudW0KKwkgKiBAc2VlICNzZXRTb3VyY2VUeXBlKEltYWdlU291cmNlRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0SW1hZ2VfU291cmNlVHlwZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCUltYWdlU291cmNlRW51bSBnZXRTb3VyY2VUeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRTb3VyY2VUeXBlIDxlbT5Tb3VyY2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtCisJICogQHNlZSAjZ2V0U291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U291cmNlVHlwZShJbWFnZVNvdXJjZUVudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsZW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGVuYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbGVuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGaWxlbmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEltYWdlX0ZpbGVuYW1lKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEZpbGVuYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRGaWxlbmFtZSA8ZW0+RmlsZW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbGVuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaWxlbmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBJbWFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9JbWFnZVNpemVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0ltYWdlU2l6ZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTExNTZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9JbWFnZVNpemVFbnVtLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JbWFnZSBTaXplIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRJbWFnZVNpemVFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBJbWFnZVNpemVFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+U0laRSBUTyBJTUFHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTSVpFX1RPX0lNQUdFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU0laRV9UT19JTUFHRSgwLCAiU0laRV9UT19JTUFHRSIsICJzaXplLXRvLWltYWdlIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TQ0FMRSBUTyBJVEVNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NDQUxFX1RPX0lURU1fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTQ0FMRV9UT19JVEVNKDAsICJTQ0FMRV9UT19JVEVNIiwgInNjYWxlLXRvLWl0ZW0iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNMSVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0xJUF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNMSVAoMCwgIkNMSVAiLCAiY2xpcCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0laRSBUTyBJTUFHRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0laRSBUTyBJTUFHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTSVpFX1RPX0lNQUdFCisJICogQG1vZGVsIGxpdGVyYWw9InNpemUtdG8taW1hZ2UiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UT19JTUFHRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TQ0FMRSBUTyBJVEVNPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TQ0FMRSBUTyBJVEVNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NDQUxFX1RPX0lURU0KKwkgKiBAbW9kZWwgbGl0ZXJhbD0ic2NhbGUtdG8taXRlbSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0FMRV9UT19JVEVNX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNMSVA8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNMSVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0xJUAorCSAqIEBtb2RlbCBsaXRlcmFsPSJjbGlwIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSVBfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkltYWdlIFNpemUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VTaXplRW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBJbWFnZVNpemVFbnVtW10geworCQkJU0laRV9UT19JTUFHRSwKKwkJCVNDQUxFX1RPX0lURU0sCisJCQlDTElQLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkltYWdlIFNpemUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEltYWdlU2l6ZUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW1hZ2UgU2l6ZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VTaXplRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUltYWdlU2l6ZUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5JbWFnZSBTaXplIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZVNpemVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJSW1hZ2VTaXplRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW1hZ2UgU2l6ZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VTaXplRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgU0laRV9UT19JTUFHRV9WQUxVRTogcmV0dXJuIFNJWkVfVE9fSU1BR0U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEltYWdlU2l6ZUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vSW1hZ2VTaXplRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9JbWFnZVNvdXJjZUVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvSW1hZ2VTb3VyY2VFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YTEzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvSW1hZ2VTb3VyY2VFbnVtLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JbWFnZSBTb3VyY2UgRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldEltYWdlU291cmNlRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gSW1hZ2VTb3VyY2VFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+RklMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNGSUxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRklMRSgwLCAiRklMRSIsICJmaWxlIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUkw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVVJMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVVJMKDAsICJVUkwiLCAidXJsIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FTUJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFTUJFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUVNQkVEKDAsICJFTUJFRCIsICJlbWJlZCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+RklMRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RklMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNGSUxFCisJICogQG1vZGVsIGxpdGVyYWw9ImZpbGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUkw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVSTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVUkwKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idXJsIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSTF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FTUJFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU1CRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRU1CRUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZW1iZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1CRURfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkltYWdlIFNvdXJjZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZVNvdXJjZUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgSW1hZ2VTb3VyY2VFbnVtW10geworCQkJRklMRSwKKwkJCVVSTCwKKwkJCUVNQkVELAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkltYWdlIFNvdXJjZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SW1hZ2VTb3VyY2VFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkltYWdlIFNvdXJjZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VTb3VyY2VFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJSW1hZ2VTb3VyY2VFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW1hZ2UgU291cmNlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZVNvdXJjZUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlJbWFnZVNvdXJjZUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkltYWdlIFNvdXJjZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VTb3VyY2VFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBGSUxFX1ZBTFVFOiByZXR1cm4gRklMRTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgSW1hZ2VTb3VyY2VFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0ltYWdlU291cmNlRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9MYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDg5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0xhYmVsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldExhYmVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIExhYmVsIGV4dGVuZHMgVGV4dEVsZW1lbnQgeworfSAvLyBMYWJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9NZWRpYS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9NZWRpYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNWYyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL01lZGlhLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZWRpYTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE1lZGlhKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1lZGlhIGV4dGVuZHMgUmVwb3J0QmFzZSB7Cit9IC8vIE1lZGlhCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL01lZGlhU3R5bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTWVkaWFTdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzE5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL01lZGlhU3R5bGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lZGlhIFN0eWxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUjZ2V0TWVkaWEgPGVtPk1lZGlhPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE1lZGlhU3R5bGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVkaWFTdHlsZSBleHRlbmRzIEJhc2VTdHlsZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVkaWE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lZGlhPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lZGlhPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNZWRpYShNZWRpYSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0TWVkaWFTdHlsZV9NZWRpYSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCU1lZGlhIGdldE1lZGlhKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlI2dldE1lZGlhIDxlbT5NZWRpYTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVkaWE8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1lZGlhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZWRpYShNZWRpYSB2YWx1ZSk7CisKK30gLy8gTWVkaWFTdHlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9NZWRpYXMuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTWVkaWFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyMDY3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTWVkaWFzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVkaWFzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhcyNnZXRNZWRpYXMgPGVtPk1lZGlhczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRNZWRpYXMoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVkaWFzIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZWRpYXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZWRpYXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZWRpYXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE1lZGlhc19NZWRpYXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8TWVkaWE+IGdldE1lZGlhcygpOworCit9IC8vIE1lZGlhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZmY3MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5NdWx0aXBsZSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNPTkNBVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT05DQVRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT05DQVQoMCwgIkNPTkNBVCIsICJjb25jYXQiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNPTkNBVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09OQ0FUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NPTkNBVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJjb25jYXQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0FUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NdWx0aXBsZSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1bXSB7CisJCQlDT05DQVQsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk11bHRpcGxlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk11bHRpcGxlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBDT05DQVRfVkFMVUU6IHJldHVybiBDT05DQVQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTnVtYmVyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL051bWJlckZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODY3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL051bWJlckZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVtYmVyIEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0TnVtYmVyRm9ybWF0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE51bWJlckZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgI3NldFJlcG9ydF9jYXRlZ29yeShOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE51bWJlckZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gZ2V0UmVwb3J0X2NhdGVnb3J5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0KKwkgKiBAc2VlICNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlcG9ydF9jYXRlZ29yeShOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gdmFsdWUpOworCit9IC8vIE51bWJlckZvcm1hdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9OdW1iZXJGb3JtYXRDYXRlZ29yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9OdW1iZXJGb3JtYXRDYXRlZ29yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGI3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL051bWJlckZvcm1hdENhdGVnb3J5LmphdmEKQEAgLTAsMCArMSwzMjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE51bWJlckZvcm1hdENhdGVnb3J5KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBOdW1iZXJGb3JtYXRDYXRlZ29yeSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVORk9STUFUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VORk9STUFUVEVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVU5GT1JNQVRURUQoMCwgIlVORk9STUFUVEVEIiwgInVuZm9ybWF0dGVkIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5HRU5FUkFMIE5VTUJFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHRU5FUkFMX05VTUJFUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUdFTkVSQUxfTlVNQkVSKDAsICJHRU5FUkFMX05VTUJFUiIsICJnZW5lcmFsLW51bWJlciIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRklYRURfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlGSVhFRCgwLCAiRklYRUQiLCAiZml4ZWQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBFUkNFTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEVSQ0VOVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBFUkNFTlQoMCwgIlBFUkNFTlQiLCAicGVyY2VudCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0NJRU5USUZJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTQ0lFTlRJRklDX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU0NJRU5USUZJQygwLCAiU0NJRU5USUZJQyIsICJzY2llbnRpZmljIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ1VTVE9NKDAsICJDVVNUT00iLCAiY3VzdG9tIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VTkZPUk1BVFRFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VU5GT1JNQVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVU5GT1JNQVRURUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idW5mb3JtYXR0ZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5GT1JNQVRURURfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+R0VORVJBTCBOVU1CRVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkdFTkVSQUwgTlVNQkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0dFTkVSQUxfTlVNQkVSCisJICogQG1vZGVsIGxpdGVyYWw9ImdlbmVyYWwtbnVtYmVyIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfTlVNQkVSX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNGSVhFRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJmaXhlZCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QRVJDRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QRVJDRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BFUkNFTlQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icGVyY2VudCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJDRU5UX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNDSUVOVElGSUM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNDSUVOVElGSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0NJRU5USUZJQworCSAqIEBtb2RlbCBsaXRlcmFsPSJzY2llbnRpZmljIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSUVOVElGSUNfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NCisJICogQG1vZGVsIGxpdGVyYWw9ImN1c3RvbSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVNUT01fVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bWJlckZvcm1hdENhdGVnb3J5W10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IE51bWJlckZvcm1hdENhdGVnb3J5W10geworCQkJVU5GT1JNQVRURUQsCisJCQlHRU5FUkFMX05VTUJFUiwKKwkJCUZJWEVELAorCQkJUEVSQ0VOVCwKKwkJCVNDSUVOVElGSUMsCisJCQlDVVNUT00sCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE51bWJlckZvcm1hdENhdGVnb3J5PiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBOdW1iZXJGb3JtYXRDYXRlZ29yeSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCU51bWJlckZvcm1hdENhdGVnb3J5IHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE51bWJlckZvcm1hdENhdGVnb3J5IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJTnVtYmVyRm9ybWF0Q2F0ZWdvcnkgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBOdW1iZXJGb3JtYXRDYXRlZ29yeSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgVU5GT1JNQVRURURfVkFMVUU6IHJldHVybiBVTkZPUk1BVFRFRDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgTnVtYmVyRm9ybWF0Q2F0ZWdvcnkoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vTnVtYmVyRm9ybWF0Q2F0ZWdvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL051bWJlckZvcm1hdENhdGVnb3J5RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2FkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL051bWJlckZvcm1hdENhdGVnb3J5RW51bS5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VTkZPUk1BVFRFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVTkZPUk1BVFRFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVVORk9STUFUVEVEKDAsICJVTkZPUk1BVFRFRCIsICJ1bmZvcm1hdHRlZCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+R0VORVJBTCBOVU1CRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjR0VORVJBTF9OVU1CRVJfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlHRU5FUkFMX05VTUJFUigwLCAiR0VORVJBTF9OVU1CRVIiLCAiZ2VuZXJhbC1udW1iZXIiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0ZJWEVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRklYRUQoMCwgIkZJWEVEIiwgImZpeGVkIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QRVJDRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BFUkNFTlRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlQRVJDRU5UKDAsICJQRVJDRU5UIiwgInBlcmNlbnQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNDSUVOVElGSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0NJRU5USUZJQ19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNDSUVOVElGSUMoMCwgIlNDSUVOVElGSUMiLCAic2NpZW50aWZpYyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNVU1RPTSgwLCAiQ1VTVE9NIiwgImN1c3RvbSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+VU5GT1JNQVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVORk9STUFUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VORk9STUFUVEVECisJICogQG1vZGVsIGxpdGVyYWw9InVuZm9ybWF0dGVkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORk9STUFUVEVEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkdFTkVSQUwgTlVNQkVSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5HRU5FUkFMIE5VTUJFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHRU5FUkFMX05VTUJFUgorCSAqIEBtb2RlbCBsaXRlcmFsPSJnZW5lcmFsLW51bWJlciIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX05VTUJFUl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRklYRUQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZml4ZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRURfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEVSQ0VOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEVSQ0VOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQRVJDRU5UCisJICogQG1vZGVsIGxpdGVyYWw9InBlcmNlbnQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSQ0VOVF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TQ0lFTlRJRklDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TQ0lFTlRJRklDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NDSUVOVElGSUMKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ic2NpZW50aWZpYyIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0lFTlRJRklDX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXN0b20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VTVE9NX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5OdW1iZXIgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bWJlckZvcm1hdENhdGVnb3J5RW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1bXSB7CisJCQlVTkZPUk1BVFRFRCwKKwkJCUdFTkVSQUxfTlVNQkVSLAorCQkJRklYRUQsCisJCQlQRVJDRU5ULAorCQkJU0NJRU5USUZJQywKKwkJCUNVU1RPTSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5OdW1iZXIgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVtYmVyIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5OdW1iZXIgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFVORk9STUFUVEVEX1ZBTFVFOiByZXR1cm4gVU5GT1JNQVRURUQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE51bWJlckZvcm1hdENhdGVnb3J5RW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvT3JpZW50YXRpb25FbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL09yaWVudGF0aW9uRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGUxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL09yaWVudGF0aW9uRW51bS5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T3JpZW50YXRpb24gRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldE9yaWVudGF0aW9uRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gT3JpZW50YXRpb25FbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+UE9SVFJBSVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUE9SVFJBSVRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlQT1JUUkFJVCgwLCAiUE9SVFJBSVQiLCAicG9ydHJhaXQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxBTkRTQ0FQRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMQU5EU0NBUEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMQU5EU0NBUEUoMCwgIkxBTkRTQ0FQRSIsICJsYW5kc2NhcGUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBPUlRSQUlUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QT1JUUkFJVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQT1JUUkFJVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJwb3J0cmFpdCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUUkFJVF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5MQU5EU0NBUEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxBTkRTQ0FQRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMQU5EU0NBUEUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibGFuZHNjYXBlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTkRTQ0FQRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+T3JpZW50YXRpb24gRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JpZW50YXRpb25FbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IE9yaWVudGF0aW9uRW51bVtdIHsKKwkJCVBPUlRSQUlULAorCQkJTEFORFNDQVBFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9yaWVudGF0aW9uIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxPcmllbnRhdGlvbkVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T3JpZW50YXRpb24gRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9yaWVudGF0aW9uRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCU9yaWVudGF0aW9uRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yaWVudGF0aW9uIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBPcmllbnRhdGlvbkVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlPcmllbnRhdGlvbkVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yaWVudGF0aW9uIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBPcmllbnRhdGlvbkVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFBPUlRSQUlUX1ZBTFVFOiByZXR1cm4gUE9SVFJBSVQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE9yaWVudGF0aW9uRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9PcmllbnRhdGlvbkVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZURldGFpbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9QYWdlRGV0YWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4MDYyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZURldGFpbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFnZSBEZXRhaWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlRGV0YWlsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBhZ2VEZXRhaWwgZXh0ZW5kcyBDb250YWluZXIgeworfSAvLyBQYWdlRGV0YWlsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1BhZ2VGb290ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZUZvb3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2IzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1BhZ2VGb290ZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWdlIEZvb3RlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2lzU2hvd09uTGFzdCA8ZW0+U2hvdyBPbiBMYXN0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2dldEhlaWdodFZhbHVlIDxlbT5IZWlnaHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIjZ2V0SGVpZ2h0VW5pdCA8ZW0+SGVpZ2h0IFVuaXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZUZvb3RlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBQYWdlRm9vdGVyIGV4dGVuZHMgQ29udGFpbmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaG93IE9uIExhc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNob3cgT24gTGFzdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaG93IE9uIExhc3Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNob3dPbkxhc3QoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZUZvb3Rlcl9TaG93T25MYXN0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1Nob3dPbkxhc3QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIjaXNTaG93T25MYXN0IDxlbT5TaG93IE9uIExhc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNob3cgT24gTGFzdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTaG93T25MYXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTaG93T25MYXN0KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRIZWlnaHRWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VGb290ZXJfSGVpZ2h0VmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0SGVpZ2h0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIjZ2V0SGVpZ2h0VmFsdWUgPGVtPkhlaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRIZWlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SGVpZ2h0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVpZ2h0IFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRIZWlnaHRVbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlRm9vdGVyX0hlaWdodFVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRIZWlnaHRVbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2dldEhlaWdodFVuaXQgPGVtPkhlaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldEhlaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhlaWdodFVuaXQoVW5pdEVudW0gdmFsdWUpOworCit9IC8vIFBhZ2VGb290ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZUhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9QYWdlSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZGQ3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZUhlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgSGVhZGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIjaXNTaG93T25GaXJzdCA8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlciNnZXRIZWlnaHRWYWx1ZSA8ZW0+SGVpZ2h0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyI2dldEhlaWdodFVuaXQgPGVtPkhlaWdodCBVbml0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VIZWFkZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFnZUhlYWRlciBleHRlbmRzIENvbnRhaW5lciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hvdyBPbiBGaXJzdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaG93IE9uIEZpcnN0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTaG93T25GaXJzdChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlSGVhZGVyX1Nob3dPbkZpcnN0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1Nob3dPbkZpcnN0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyI2lzU2hvd09uRmlyc3QgPGVtPlNob3cgT24gRmlyc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNob3cgT24gRmlyc3Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2hvd09uRmlyc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNob3dPbkZpcnN0KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRIZWlnaHRWYWx1ZShkb3VibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VIZWFkZXJfSGVpZ2h0VmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0SGVpZ2h0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIjZ2V0SGVpZ2h0VmFsdWUgPGVtPkhlaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRIZWlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SGVpZ2h0VmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVpZ2h0IFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0IFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRIZWlnaHRVbml0KFVuaXRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlSGVhZGVyX0hlaWdodFVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRIZWlnaHRVbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyI2dldEhlaWdodFVuaXQgPGVtPkhlaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQgVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldEhlaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhlaWdodFVuaXQoVW5pdEVudW0gdmFsdWUpOworCit9IC8vIFBhZ2VIZWFkZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZVNpemVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1BhZ2VTaXplRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjgxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1BhZ2VTaXplRW51bS5qYXZhCkBAIC0wLDAgKzEsMzQ4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UGFnZSBTaXplIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlU2l6ZUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFBhZ2VTaXplRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkE0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0E0X1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQTQoMCwgIkE0IiwgImE0IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BMzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBM19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUEzKDAsICJBMyIsICJhMyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+QTU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQTVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBNSgwLCAiQTUiLCAiYTUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVTIExFVFRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVU19MRVRURVJfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlVU19MRVRURVIoMCwgIlVTX0xFVFRFUiIsICJ1cy1sZXR0ZXIiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVTIExFR0FMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VTX0xFR0FMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVVNfTEVHQUwoMCwgIlVTX0xFR0FMIiwgInVzLWxlZ2FsIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUyBMRURHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVVNfTEVER0VSX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVVNfTEVER0VSKDAsICJVU19MRURHRVIiLCAidXMtbGVkZ2VyIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUyBTVVBFUiBCPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VTX1NVUEVSX0JfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlVU19TVVBFUl9CKDAsICJVU19TVVBFUl9CIiwgInVzLXN1cGVyLWIiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkE0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BNDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBNAorCSAqIEBtb2RlbCBsaXRlcmFsPSJhNCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBNF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BMzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QTM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQTMKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iYTMiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQTNfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+QTU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkE1PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0E1CisJICogQG1vZGVsIGxpdGVyYWw9ImE1IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEE1X1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVTIExFVFRFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VVMgTEVUVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VTX0xFVFRFUgorCSAqIEBtb2RlbCBsaXRlcmFsPSJ1cy1sZXR0ZXIiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNfTEVUVEVSX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVTIExFR0FMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VUyBMRUdBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVU19MRUdBTAorCSAqIEBtb2RlbCBsaXRlcmFsPSJ1cy1sZWdhbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU19MRUdBTF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUyBMRURHRVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVTIExFREdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVU19MRURHRVIKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idXMtbGVkZ2VyIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTX0xFREdFUl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUyBTVVBFUiBCPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VUyBTVVBFUiBCPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VTX1NVUEVSX0IKKwkgKiBAbW9kZWwgbGl0ZXJhbD0idXMtc3VwZXItYiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU19TVVBFUl9CX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5QYWdlIFNpemUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFnZVNpemVFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFBhZ2VTaXplRW51bVtdIHsKKwkJCUE0LAorCQkJQTMsCisJCQlBNSwKKwkJCVVTX0xFVFRFUiwKKwkJCVVTX0xFR0FMLAorCQkJVVNfTEVER0VSLAorCQkJVVNfU1VQRVJfQiwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5QYWdlIFNpemUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFBhZ2VTaXplRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5QYWdlIFNpemUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBhZ2VTaXplRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVBhZ2VTaXplRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBhZ2UgU2l6ZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUGFnZVNpemVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJUGFnZVNpemVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5QYWdlIFNpemUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBhZ2VTaXplRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgQTRfVkFMVUU6IHJldHVybiBBNDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgUGFnZVNpemVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1BhZ2VTaXplRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9QYWdlVGVtcGxhdGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZVRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyZjc2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZVRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFnZSBUZW1wbGF0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldE9yaWVudGF0aW9uIDxlbT5PcmllbnRhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFRvcE1hcmdpblZhbHVlIDxlbT5Ub3AgTWFyZ2luIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0VG9wTWFyZ2luVW5pdCA8ZW0+VG9wIE1hcmdpbiBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0TGVmdE1hcmdpblZhbHVlIDxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldExlZnRNYXJnaW5Vbml0IDxlbT5MZWZ0IE1hcmdpbiBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0Qm90dG9tTWFyZ2luVmFsdWUgPGVtPkJvdHRvbSBNYXJnaW4gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRCb3R0b21NYXJnaW5Vbml0IDxlbT5Cb3R0b20gTWFyZ2luIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRSaWdodE1hcmdpblZhbHVlIDxlbT5SaWdodCBNYXJnaW4gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRSaWdodE1hcmdpblVuaXQgPGVtPlJpZ2h0IE1hcmdpbiBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlVGVtcGxhdGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFnZVRlbXBsYXRlIGV4dGVuZHMgUmVwb3J0QmFzZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVNpemVFbnVtCisJICogQHNlZSAjc2V0U2l6ZShQYWdlU2l6ZUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZV9TaXplKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZVNpemVFbnVtIGdldFNpemUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bQorCSAqIEBzZWUgI2dldFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNpemUoUGFnZVNpemVFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yaWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuT3JpZW50YXRpb25FbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk9yaWVudGF0aW9uRW51bQorCSAqIEBzZWUgI3NldE9yaWVudGF0aW9uKE9yaWVudGF0aW9uRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZVRlbXBsYXRlX09yaWVudGF0aW9uKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJT3JpZW50YXRpb25FbnVtIGdldE9yaWVudGF0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0T3JpZW50YXRpb24gPGVtPk9yaWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmllbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5PcmllbnRhdGlvbkVudW0KKwkgKiBAc2VlICNnZXRPcmllbnRhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JpZW50YXRpb24oT3JpZW50YXRpb25FbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvcCBNYXJnaW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvcCBNYXJnaW4gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9wIE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VG9wTWFyZ2luVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlVGVtcGxhdGVfVG9wTWFyZ2luVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0VG9wTWFyZ2luVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRUb3BNYXJnaW5WYWx1ZSA8ZW0+VG9wIE1hcmdpbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9wIE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VG9wTWFyZ2luVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRvcE1hcmdpblZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub3AgTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub3AgTWFyZ2luIFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9wIE1hcmdpbiBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjc2V0VG9wTWFyZ2luVW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZVRlbXBsYXRlX1RvcE1hcmdpblVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRUb3BNYXJnaW5Vbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0VG9wTWFyZ2luVW5pdCA8ZW0+VG9wIE1hcmdpbiBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub3AgTWFyZ2luIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNnZXRUb3BNYXJnaW5Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUb3BNYXJnaW5Vbml0KFVuaXRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlZnQgTWFyZ2luIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TGVmdE1hcmdpblZhbHVlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZVRlbXBsYXRlX0xlZnRNYXJnaW5WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRMZWZ0TWFyZ2luVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRMZWZ0TWFyZ2luVmFsdWUgPGVtPkxlZnQgTWFyZ2luIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TGVmdE1hcmdpblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMZWZ0TWFyZ2luVmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlZnQgTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZWZ0IE1hcmdpbiBVbml0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlZnQgTWFyZ2luIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRMZWZ0TWFyZ2luVW5pdChVbml0RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZVRlbXBsYXRlX0xlZnRNYXJnaW5Vbml0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVW5pdEVudW0gZ2V0TGVmdE1hcmdpblVuaXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRMZWZ0TWFyZ2luVW5pdCA8ZW0+TGVmdCBNYXJnaW4gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVmdCBNYXJnaW4gVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldExlZnRNYXJnaW5Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMZWZ0TWFyZ2luVW5pdChVbml0RW51bSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb3R0b20gTWFyZ2luIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Cb3R0b20gTWFyZ2luIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvdHRvbSBNYXJnaW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEJvdHRvbU1hcmdpblZhbHVlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJZG91YmxlIGdldEJvdHRvbU1hcmdpblZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0Qm90dG9tTWFyZ2luVmFsdWUgPGVtPkJvdHRvbSBNYXJnaW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvdHRvbSBNYXJnaW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEJvdHRvbU1hcmdpblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCb3R0b21NYXJnaW5WYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm90dG9tIE1hcmdpbiBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Qm90dG9tIE1hcmdpbiBVbml0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvdHRvbSBNYXJnaW4gVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI3NldEJvdHRvbU1hcmdpblVuaXQoVW5pdEVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZV9Cb3R0b21NYXJnaW5Vbml0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVW5pdEVudW0gZ2V0Qm90dG9tTWFyZ2luVW5pdCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldEJvdHRvbU1hcmdpblVuaXQgPGVtPkJvdHRvbSBNYXJnaW4gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm90dG9tIE1hcmdpbiBVbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQHNlZSAjZ2V0Qm90dG9tTWFyZ2luVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Qm90dG9tTWFyZ2luVW5pdChVbml0RW51bSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SaWdodCBNYXJnaW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBNYXJnaW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJpZ2h0TWFyZ2luVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlVGVtcGxhdGVfUmlnaHRNYXJnaW5WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXRSaWdodE1hcmdpblZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0UmlnaHRNYXJnaW5WYWx1ZSA8ZW0+UmlnaHQgTWFyZ2luIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBNYXJnaW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJpZ2h0TWFyZ2luVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJpZ2h0TWFyZ2luVmFsdWUoZG91YmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpZ2h0IE1hcmdpbiBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlICNzZXRSaWdodE1hcmdpblVuaXQoVW5pdEVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblVuaXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlVbml0RW51bSBnZXRSaWdodE1hcmdpblVuaXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRSaWdodE1hcmdpblVuaXQgPGVtPlJpZ2h0IE1hcmdpbiBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaWdodCBNYXJnaW4gVW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bQorCSAqIEBzZWUgI2dldFJpZ2h0TWFyZ2luVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmlnaHRNYXJnaW5Vbml0KFVuaXRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SGVhZGVyKFBhZ2VIZWFkZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZV9IZWFkZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZUhlYWRlciBnZXRIZWFkZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRIZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhlYWRlcihQYWdlSGVhZGVyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvb3RlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Rm9vdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZvb3RlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Rm9vdGVyKFBhZ2VGb290ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZV9Gb290ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZUZvb3RlciBnZXRGb290ZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9vdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvb3RlcihQYWdlRm9vdGVyIHZhbHVlKTsKKworfSAvLyBQYWdlVGVtcGxhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZVRlbXBsYXRlcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9QYWdlVGVtcGxhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1MWIxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUGFnZVRlbXBsYXRlcy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgVGVtcGxhdGVzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMjZ2V0UGFnZXRlbXBsYXRlcyA8ZW0+UGFnZXRlbXBsYXRlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRQYWdlVGVtcGxhdGVzKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFBhZ2VUZW1wbGF0ZXMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhZ2V0ZW1wbGF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFnZXRlbXBsYXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhZ2V0ZW1wbGF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFBhZ2VUZW1wbGF0ZXNfUGFnZXRlbXBsYXRlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxQYWdlVGVtcGxhdGU+IGdldFBhZ2V0ZW1wbGF0ZXMoKTsKKworfSAvLyBQYWdlVGVtcGxhdGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1B1cmVBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1B1cmVBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxMWQwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlB1cmUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Q09VTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09VTlRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT1VOVCgwLCAiQ09VTlQiLCAiY291bnQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJVTk5JTkdDT1VOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSVU5OSU5HQ09VTlRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlSVU5OSU5HQ09VTlQoMCwgIlJVTk5JTkdDT1VOVCIsICJydW5uaW5nLWNvdW50Iik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DT1VOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09VTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09VTlQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY291bnQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UlVOTklOR0NPVU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SVU5OSU5HQ09VTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUlVOTklOR0NPVU5UCisJICogQG1vZGVsIGxpdGVyYWw9InJ1bm5pbmctY291bnQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR0NPVU5UX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5QdXJlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1bXSB7CisJCQlDT1VOVCwKKwkJCVJVTk5JTkdDT1VOVCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5QdXJlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlB1cmUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlQdXJlQWdncmVnYXRpb25UeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlB1cmUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlQdXJlQWdncmVnYXRpb25UeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UHVyZSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBQdXJlQWdncmVnYXRpb25UeXBlRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgQ09VTlRfVkFMVUU6IHJldHVybiBDT1VOVDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVuZGVyaW5nRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZW5kZXJpbmdFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiM2NjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVuZGVyaW5nRW51bS5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UmVuZGVyaW5nIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZW5kZXJpbmdFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBSZW5kZXJpbmdFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+SFRNTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIVE1MX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSFRNTCgwLCAiSFRNTCIsICJodG1sIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QREY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUERGX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUERGKDAsICJQREYiLCAicGRmIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5IVE1MPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5IVE1MPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0hUTUwKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iaHRtbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVE1MX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBERjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UERGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BERgorCSAqIEBtb2RlbCBsaXRlcmFsPSJwZGYiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUERGX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZW5kZXJpbmcgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVuZGVyaW5nRW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBSZW5kZXJpbmdFbnVtW10geworCQkJSFRNTCwKKwkJCVBERiwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZW5kZXJpbmcgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFJlbmRlcmluZ0VudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVuZGVyaW5nIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSZW5kZXJpbmdFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJUmVuZGVyaW5nRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlbmRlcmluZyBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVuZGVyaW5nRW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVJlbmRlcmluZ0VudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlbmRlcmluZyBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVuZGVyaW5nRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgSFRNTF9WQUxVRTogcmV0dXJuIEhUTUw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFJlbmRlcmluZ0VudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vUmVuZGVyaW5nRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNGE5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0LmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25Ub29sYmFyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydERlZmluaXRpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjaXNEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXREZXNjcmlwdGlvblZhbHVlIDxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldERhdGFtYXJ0UmVmIDxlbT5EYXRhbWFydCBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRSZW5kZXJpbmcgPGVtPlJlbmRlcmluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldEV4dGVybmFsQ3NzVVJJIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUgPGVtPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0UGFnZVRlbXBsYXRlIDxlbT5QYWdlIFRlbXBsYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0TWVkaWEgPGVtPk1lZGlhPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0VG9vbGJhciA8ZW0+VG9vbGJhcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldERlc2lnbiA8ZW0+RGVzaWduPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnQgZXh0ZW5kcyBSZXBvcnRCYXNlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNEZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb24oYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uVmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRfRGVzY3JpcHRpb25WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvblZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGVzY3JpcHRpb25WYWx1ZSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvblZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhbWFydCBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhbWFydCBSZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERhdGFtYXJ0UmVmKERhdGFtYXJ0RGVmaW5pdGlvbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0X0RhdGFtYXJ0UmVmKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnREZWZpbml0aW9uIGdldERhdGFtYXJ0UmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGF0YW1hcnRSZWYgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YW1hcnQgUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREYXRhbWFydFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGF0YW1hcnRSZWYoRGF0YW1hcnREZWZpbml0aW9uIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbmRlcmluZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlbmRlcmluZ0VudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVuZGVyaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbmRlcmluZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtCisJICogQHNlZSAjc2V0UmVuZGVyaW5nKFJlbmRlcmluZ0VudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydF9SZW5kZXJpbmcoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZW5kZXJpbmdFbnVtIGdldFJlbmRlcmluZygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldFJlbmRlcmluZyA8ZW0+UmVuZGVyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW5kZXJpbmc8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVuZGVyaW5nRW51bQorCSAqIEBzZWUgI2dldFJlbmRlcmluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVuZGVyaW5nKFJlbmRlcmluZ0VudW0gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgQ3NzIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRFeHRlcm5hbENzc1VSSShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydF9FeHRlcm5hbENzc1VSSSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRFeHRlcm5hbENzc1VSSSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldEV4dGVybmFsQ3NzVVJJIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXh0ZXJuYWxDc3NVUkkoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRfRXh0ZXJuYWxDc3NVUklCdW5kbGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhZ2UgVGVtcGxhdGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UGFnZVRlbXBsYXRlKFBhZ2VUZW1wbGF0ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0X1BhZ2VUZW1wbGF0ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVBhZ2VUZW1wbGF0ZSBnZXRQYWdlVGVtcGxhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRQYWdlVGVtcGxhdGUgPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFnZVRlbXBsYXRlKFBhZ2VUZW1wbGF0ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZWRpYTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVkaWE8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVkaWE8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1lZGlhKE1lZGlhKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRfTWVkaWEoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNZWRpYSBnZXRNZWRpYSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldE1lZGlhIDxlbT5NZWRpYTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVkaWE8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1lZGlhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZWRpYShNZWRpYSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sYmFyPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sYmFyPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2xiYXI8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFRvb2xiYXIoQWN0aW9uVG9vbGJhcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0X1Rvb2xiYXIoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBY3Rpb25Ub29sYmFyIGdldFRvb2xiYXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRUb29sYmFyIDxlbT5Ub29sYmFyPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sYmFyPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRUb29sYmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUb29sYmFyKEFjdGlvblRvb2xiYXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzaWduPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNpZ248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzaWduPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREZXNpZ24oUmVwb3J0RGVzaWduKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRfRGVzaWduKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlcG9ydERlc2lnbiBnZXREZXNpZ24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXREZXNpZ24gPGVtPkRlc2lnbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzaWduPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZXNpZ24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2lnbihSZXBvcnREZXNpZ24gdmFsdWUpOworCit9IC8vIFJlcG9ydApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnRCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjFmODNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnRCYXNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgQmFzZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRCYXNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0QmFzZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnRCYXNlIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRCYXNlX05hbWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0QmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gUmVwb3J0QmFzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA3NjBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcG9ydERTTEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXBvcnREU0xGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBNb2RlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVwb3J0TW9kZWwgY3JlYXRlUmVwb3J0TW9kZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0IExhenkgUmVzb2x2ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXBvcnRMYXp5UmVzb2x2ZXIgY3JlYXRlUmVwb3J0TGF6eVJlc29sdmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBCYXNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQgQmFzZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVwb3J0QmFzZSBjcmVhdGVSZXBvcnRCYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBQYWNrYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQgUGFja2FnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVwb3J0UGFja2FnZSBjcmVhdGVSZXBvcnRQYWNrYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgVGVtcGxhdGVzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWdlIFRlbXBsYXRlczwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZVRlbXBsYXRlcyBjcmVhdGVQYWdlVGVtcGxhdGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNvbWUgRm9ybWF0czwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U29tZSBGb3JtYXRzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTb21lRm9ybWF0cyBjcmVhdGVTb21lRm9ybWF0cygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db2xvcnM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbG9yczwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29sb3JzIGNyZWF0ZUNvbG9ycygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Gb250czwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Rm9udHM8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUZvbnRzIGNyZWF0ZUZvbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lZGlhczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVkaWFzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNZWRpYXMgY3JlYXRlTWVkaWFzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0eWxlczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3R5bGVzPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZXMgY3JlYXRlU3R5bGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVBhZ2VUZW1wbGF0ZSBjcmVhdGVQYWdlVGVtcGxhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29sb3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb2xvciBjcmVhdGVDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Gb250PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Gb250PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGb250IGNyZWF0ZUZvbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCdWlsZEluRm9udEZhbWlseSBjcmVhdGVCdWlsZEluRm9udEZhbWlseSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gRm9udCBGYW1pbHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBGb250IEZhbWlseTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ3VzdG9tRm9udEZhbWlseSBjcmVhdGVDdXN0b21Gb250RmFtaWx5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lZGlhPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZWRpYTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWVkaWEgY3JlYXRlTWVkaWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Qm9yZGVyIFN0eWxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Cb3JkZXIgU3R5bGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvcmRlclN0eWxlIGNyZWF0ZUJvcmRlclN0eWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2UgU3R5bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2UgU3R5bGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUJhc2VTdHlsZSBjcmVhdGVCYXNlU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVkaWEgU3R5bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lZGlhIFN0eWxlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNZWRpYVN0eWxlIGNyZWF0ZU1lZGlhU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3R5bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0eWxlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZSBjcmVhdGVTdHlsZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Tb21lIEZvcm1hdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U29tZSBGb3JtYXQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVNvbWVGb3JtYXQgY3JlYXRlU29tZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Vb21vIEZvcm1hdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW9tbyBGb3JtYXQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVVvbW9Gb3JtYXQgY3JlYXRlVW9tb0Zvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OdW1iZXIgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OdW1iZXIgRm9ybWF0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOdW1iZXJGb3JtYXQgY3JlYXRlTnVtYmVyRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1cnJlbmN5IEZvcm1hdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDdXJyZW5jeUZvcm1hdCBjcmVhdGVDdXJyZW5jeUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRlIEZvcm1hdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGF0ZSBGb3JtYXQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGVGb3JtYXQgY3JlYXRlRGF0ZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRlIFRpbWUgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRlIFRpbWUgRm9ybWF0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRlVGltZUZvcm1hdCBjcmVhdGVEYXRlVGltZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lIEZvcm1hdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBGb3JtYXQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRpbWVGb3JtYXQgY3JlYXRlVGltZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVwb3J0IGNyZWF0ZVJlcG9ydCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQgRGVzaWduIEZpbGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBEZXNpZ24gRmlsZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVwb3J0RGVzaWduRmlsZSBjcmVhdGVSZXBvcnREZXNpZ25GaWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlcG9ydERlc2lnblRlbXBsYXRlIGNyZWF0ZVJlcG9ydERlc2lnblRlbXBsYXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRhaW5lcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGFpbmVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb250YWluZXIgY3JlYXRlQ29udGFpbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgSGVhZGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWdlIEhlYWRlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZUhlYWRlciBjcmVhdGVQYWdlSGVhZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgRGV0YWlsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWdlIERldGFpbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZURldGFpbCBjcmVhdGVQYWdlRGV0YWlsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhZ2UgRm9vdGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWdlIEZvb3RlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZUZvb3RlciBjcmVhdGVQYWdlRm9vdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldpdGggU3R5bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldpdGggU3R5bGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVdpdGhTdHlsZSBjcmVhdGVXaXRoU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpdGxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaXRsZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGl0bGUgY3JlYXRlVGl0bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3ViIFRpdGxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdWIgVGl0bGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN1YlRpdGxlIGNyZWF0ZVN1YlRpdGxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1YiBTdWIgVGl0bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1YiBTdWIgVGl0bGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVN1YlN1YlRpdGxlIGNyZWF0ZVN1YlN1YlRpdGxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxhYmVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGFiZWwgY3JlYXRlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGV4dCBjcmVhdGVUZXh0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dG8gVGV4dDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0byBUZXh0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRvVGV4dCBjcmVhdGVBdXRvVGV4dCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUltYWdlIGNyZWF0ZUltYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldpdGggSGVhZGVyIEZvb3RlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlXaXRoSGVhZGVyRm9vdGVyIGNyZWF0ZVdpdGhIZWFkZXJGb290ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGF0YW1hcnQgVGFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhbWFydFRhYmxlIGNyZWF0ZURhdGFtYXJ0VGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXA8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhbWFydFRhYmxlR3JvdXAgY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNvbWUgR3JpZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U29tZSBHcmlkPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTb21lR3JpZCBjcmVhdGVTb21lR3JpZCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZSBHcm91cCBIZWFkZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIGNyZWF0ZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZSBHcm91cCBGb290ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyIGNyZWF0ZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZSBEZXRhaWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZURldGFpbCBjcmVhdGVEYXRhbWFydFRhYmxlRGV0YWlsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIFByb3BlcnR5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGF0YW1hcnRUYWJsZVByb3BlcnR5IGNyZWF0ZURhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBGb3JtYXR0ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVGb3JtYXR0ZXIgY3JlYXRlVGFibGVGb3JtYXR0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgSW1hZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIEltYWdlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZUltYWdlIGNyZWF0ZVRhYmxlSW1hZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgUHJvcGVydHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIFByb3BlcnR5PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVByb3BlcnR5IGNyZWF0ZVRhYmxlUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgQWdncmVnYXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZUFnZ3JlZ2F0aW9uIGNyZWF0ZVRhYmxlQWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgQmFzZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgQmFzZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVCYXNlQWdncmVnYXRpb24gY3JlYXRlVGFibGVCYXNlQWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVQdXJlQWdncmVnYXRpb24gY3JlYXRlVGFibGVQdXJlQWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgVW5hcnkgQWdncmVnYXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIFVuYXJ5IEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVVuYXJ5QWdncmVnYXRpb24gY3JlYXRlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIE11bHRpcGxlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBNdWx0aXBsZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIGNyZWF0ZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBCaW5hcnkgQWdncmVnYXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiBjcmVhdGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIE51bWJlciBJbnRlcnZhbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZU51bWJlckludGVydmFsIGNyZWF0ZVRhYmxlTnVtYmVySW50ZXJ2YWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFibGUgRGF0ZSBEYXkgSW50ZXJ2YWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIERhdGUgRGF5IEludGVydmFsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZURhdGVEYXlJbnRlcnZhbCBjcmVhdGVUYWJsZURhdGVEYXlJbnRlcnZhbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBOdW1iZXIgTG9va3VwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBOdW1iZXIgTG9va3VwPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZU51bWJlckxvb2t1cCBjcmVhdGVUYWJsZU51bWJlckxvb2t1cCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBTdHJpbmcgTG9va3VwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBTdHJpbmcgTG9va3VwPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVN0cmluZ0xvb2t1cCBjcmVhdGVUYWJsZVN0cmluZ0xvb2t1cCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBEYXRlIERheSBMb29rdXA8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIERhdGUgRGF5IExvb2t1cDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVEYXRlRGF5TG9va3VwIGNyZWF0ZVRhYmxlRGF0ZURheUxvb2t1cCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBUZXh0IENvbG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBUZXh0IENvbG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVRleHRDb2xvciBjcmVhdGVUYWJsZVRleHRDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBDZWxsIENvbG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBDZWxsIENvbG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZUNlbGxDb2xvciBjcmVhdGVUYWJsZUNlbGxDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBJY29uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBJY29uPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZUljb24gY3JlYXRlVGFibGVJY29uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIFRyZW5kPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYWJsZSBUcmVuZDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVUcmVuZCBjcmVhdGVUYWJsZVRyZW5kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIFRvb2x0aXA8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhYmxlIFRvb2x0aXA8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVRhYmxlVG9vbHRpcCBjcmVhdGVUYWJsZVRvb2x0aXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JpZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JpZDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR3JpZCBjcmVhdGVHcmlkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyaWQgUm93PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmlkIFJvdzwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJR3JpZFJvdyBjcmVhdGVHcmlkUm93KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyaWQgQ2VsbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JpZCBDZWxsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlHcmlkQ2VsbCBjcmVhdGVHcmlkQ2VsbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXBvcnREU0xQYWNrYWdlIGdldFJlcG9ydERTTFBhY2thZ2UoKTsKKworfSAvL1JlcG9ydERTTEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmYzYxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMTExMDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5PU0JQVHlwZXNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqICoKKyAqIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIGZpbGVFeHRlbnNpb25zPSdyZXBvcnQnIG1vZGVsTmFtZT0nUmVwb3J0RFNMJyBwcmVmaXg9J1JlcG9ydERTTCcgdXBkYXRlQ2xhc3NwYXRoPSdmYWxzZScgY29weXJpZ2h0VGV4dD0nQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSlcclxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgXHJcbiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgXHJcbiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBcclxuIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIFxyXG5cclxuIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZVxyXG4gIFxyXG4gQ29udHJpYnV0b3JzOiAgXHJcbiBcdFx0Q2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBcclxuICcgYmFzZVBhY2thZ2U9J29yZy5lY2xpcHNlLm9zYnAueHRleHQnIgorICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUgcm9vdFBhY2thZ2U9J3JlcG9ydGRzbCciCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVwb3J0RFNMUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJyZXBvcnRkc2wiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gInJlcG9ydGRzbCI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVJlcG9ydERTTFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0TW9kZWxJbXBsIDxlbT5SZXBvcnQgTW9kZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydE1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRVBPUlRfTU9ERUwgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBja2c8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9NT0RFTF9fUENLRyA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0IE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9NT0RFTF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5SZXBvcnQgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX01PREVMX09QRVJBVElPTl9DT1VOVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0TGF6eVJlc29sdmVySW1wbCA8ZW0+UmVwb3J0IExhenkgUmVzb2x2ZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydExhenlSZXNvbHZlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFUE9SVF9MQVpZX1JFU09MVkVSID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQgTGF6eSBSZXNvbHZlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJlcG9ydCBMYXp5IFJlc29sdmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0QmFzZUltcGwgPGVtPlJlcG9ydCBCYXNlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRCYXNlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnRCYXNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFUE9SVF9CQVNFID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0JBU0VfX05BTUUgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQgQmFzZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJlcG9ydCBCYXNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9CQVNFX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0UGFja2FnZUltcGwgPGVtPlJlcG9ydCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnRQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX1BBQ0tBR0VfX05BTUUgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19JTVBPUlRTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fSU1QT1JUUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBvcnQgU2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19JTVBPUlRfU0VDVElPTiA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgQ3NzIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJX0JVTkRMRSA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFnZXRlbXBsYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtYXR0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX1BBQ0tBR0VfX0ZPUk1BVFRFUlMgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19DT0xPUlMgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX1BBQ0tBR0VfX0ZPTlRTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZWRpYXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfUEFDS0FHRV9fTUVESUFTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfUEFDS0FHRV9fU1RZTEVTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfUEFDS0FHRV9fUkVQT1JUUyA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0IFBhY2thZ2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJlcG9ydCBQYWNrYWdlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9QQUNLQUdFX09QRVJBVElPTl9DT1VOVCA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVzSW1wbCA8ZW0+UGFnZSBUZW1wbGF0ZXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZXNJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFBhZ2VUZW1wbGF0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURVMgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZ2V0ZW1wbGF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVTX19QQUdFVEVNUExBVEVTID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFnZSBUZW1wbGF0ZXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURVNfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVTX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QYWdlIFRlbXBsYXRlczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX1RFTVBMQVRFU19PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlNvbWVGb3JtYXRzSW1wbCA8ZW0+U29tZSBGb3JtYXRzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0c0ltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0U29tZUZvcm1hdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU09NRV9GT1JNQVRTID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtYXR0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVFNfX0ZPUk1BVFRFUlMgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Tb21lIEZvcm1hdHM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09NRV9GT1JNQVRTX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVFNfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlNvbWUgRm9ybWF0czwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVFNfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db2xvcnNJbXBsIDxlbT5Db2xvcnM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9yc0ltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0Q29sb3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTE9SUyA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sb3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUlNfX0NPTE9SUyA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbG9yczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUlNfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTE9SU19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q29sb3JzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTE9SU19PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRzSW1wbCA8ZW0+Rm9udHM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRzSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRGb250cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBGT05UUyA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9udHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRTX19GT05UUyA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZvbnRzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRTX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UU19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Rm9udHM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9OVFNfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5NZWRpYXNJbXBsIDxlbT5NZWRpYXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLk1lZGlhc0ltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0TWVkaWFzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1FRElBUyA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVkaWFzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQVNfX01FRElBUyA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lZGlhczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQVNfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBU19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+TWVkaWFzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBU19PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlc0ltcGwgPGVtPlN0eWxlczwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVzSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRTdHlsZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RZTEVTID0gOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFU19fU1RZTEVTID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3R5bGVzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFU19GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVTX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TdHlsZXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVTX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURSA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX1RFTVBMQVRFX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX1NJWkUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmllbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX09SSUVOVEFUSU9OID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9wIE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX1RPUF9NQVJHSU5fVkFMVUUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3AgTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1VOSVQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWZ0IE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVmdCBNYXJnaW4gVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1VOSVQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3R0b20gTWFyZ2luIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURV9fQk9UVE9NX01BUkdJTl9WQUxVRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvdHRvbSBNYXJnaW4gVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX0JPVFRPTV9NQVJHSU5fVU5JVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX1JJR0hUX01BUkdJTl9WQUxVRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJpZ2h0IE1hcmdpbiBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1VOSVQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX1RFTVBMQVRFX19IRUFERVIgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURV9fRk9PVEVSID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDEyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfVEVNUExBVEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9URU1QTEFURV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9ySW1wbCA8ZW0+Q29sb3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT0xPUiA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUl9fTkFNRSA9IFJFUE9SVF9CQVNFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09MT1JfX0NPTE9SID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09MT1JfX0JBU0VDT0xPUiA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhcmtlbnNieTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTE9SX19EQVJLRU5TQlkgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaWdodGVuc2J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09MT1JfX0xJR0hURU5TQlkgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1zYnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUl9fVFJBTlNGT1JNU0JZID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0Y29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUl9fVEFSR0VUQ09MT1IgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT0xPUl9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09MT1JfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNvbG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTE9SX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9CQVNFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRm9udEltcGwgPGVtPkZvbnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRk9OVCA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfX0VYVEVORFMgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GYW1pbHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX19GQU1JTFkgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfX1NUWUxFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9sZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfX0JPTEQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXpldmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX19TSVpFVkFMVUUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXpldW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfX1NJWkVVTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Rm9udDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Gb250PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0JBU0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseSA8ZW0+Rm9udCBGYW1pbHk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250RmFtaWx5CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnRGYW1pbHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRk9OVF9GQU1JTFkgPSAxMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Gb250IEZhbWlseTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBGT05UX0ZBTUlMWV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRk9OVF9GQU1JTFlfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkZvbnQgRmFtaWx5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZPTlRfRkFNSUxZX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQnVpbGRJbkZvbnRGYW1pbHlJbXBsIDxlbT5CdWlsZCBJbiBGb250IEZhbWlseTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQnVpbGRJbkZvbnRGYW1pbHlJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEJ1aWxkSW5Gb250RmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEJVSUxEX0lOX0ZPTlRfRkFNSUxZID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQlVJTERfSU5fRk9OVF9GQU1JTFlfX0NVU1RPTSA9IEZPTlRfRkFNSUxZX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJVSUxEX0lOX0ZPTlRfRkFNSUxZX0ZFQVRVUkVfQ09VTlQgPSBGT05UX0ZBTUlMWV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCVUlMRF9JTl9GT05UX0ZBTUlMWV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBGT05UX0ZBTUlMWV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQlVJTERfSU5fRk9OVF9GQU1JTFlfT1BFUkFUSU9OX0NPVU5UID0gRk9OVF9GQU1JTFlfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXN0b21Gb250RmFtaWx5SW1wbCA8ZW0+Q3VzdG9tIEZvbnQgRmFtaWx5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXN0b21Gb250RmFtaWx5SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRDdXN0b21Gb250RmFtaWx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENVU1RPTV9GT05UX0ZBTUlMWSA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVU1RPTV9GT05UX0ZBTUlMWV9fQ1VTVE9NID0gRk9OVF9GQU1JTFlfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIEZvbnQgRmFtaWx5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVU1RPTV9GT05UX0ZBTUlMWV9GRUFUVVJFX0NPVU5UID0gRk9OVF9GQU1JTFlfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ1VTVE9NX0ZPTlRfRkFNSUxZX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEZPTlRfRkFNSUxZX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5DdXN0b20gRm9udCBGYW1pbHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ1VTVE9NX0ZPTlRfRkFNSUxZX09QRVJBVElPTl9DT1VOVCA9IEZPTlRfRkFNSUxZX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFJbXBsIDxlbT5NZWRpYTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE1lZGlhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE1FRElBID0gMTY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWVkaWE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5NZWRpYTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJvcmRlclN0eWxlSW1wbCA8ZW0+Qm9yZGVyIFN0eWxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Cb3JkZXJTdHlsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0Qm9yZGVyU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQk9SREVSX1NUWUxFID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJPUkRFUl9TVFlMRV9fVFlQRSA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRodmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCT1JERVJfU1RZTEVfX1dJRFRIVkFMVUUgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aHVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCT1JERVJfU1RZTEVfX1dJRFRIVU5JVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQk9SREVSX1NUWUxFX19DT0xPUiA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJvcmRlciBTdHlsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCT1JERVJfU1RZTEVfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJPUkRFUl9TVFlMRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Qm9yZGVyIFN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJPUkRFUl9TVFlMRV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwgPGVtPkJhc2UgU3R5bGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEJBU0VfU1RZTEUgPSAxODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtYXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19GT1JNQVQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb250PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fRk9OVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmRjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUiA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1JfQUxURVJOQVRFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fVEVYVENPTE9SID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fVEVYVEFMSUdOID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9yZGVyIFRvcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX0JPUkRFUl9UT1AgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3JkZXIgQm90dG9tPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fQk9SREVSX0JPVFRPTSA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBMZWZ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fQk9SREVSX0xFRlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3JkZXIgUmlnaHQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19CT1JERVJfUklHSFQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIFRvcCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgVG9wIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19QQURESU5HX1RPUF9VTklUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUUgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBCb3R0b20gVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBMZWZ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgTGVmdCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBSaWdodCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUUgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19NQVJHSU5fVE9QX1ZBTFVFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVU5JVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gTGVmdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDIwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBMZWZ0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9VTklUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDIxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBCb3R0b20gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDIyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBCb3R0b20gVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVkFMVUUgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMjQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIFJpZ2h0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVU5JVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAyNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CYXNlIFN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAyNjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBCQVNFX1NUWUxFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5CYXNlIFN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEJBU0VfU1RZTEVfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5NZWRpYVN0eWxlSW1wbCA8ZW0+TWVkaWEgU3R5bGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLk1lZGlhU3R5bGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE1lZGlhU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEUgPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtYXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fRk9STUFUID0gQkFTRV9TVFlMRV9fRk9STUFUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fRk9OVCA9IEJBU0VfU1RZTEVfX0ZPTlQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZGNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUiA9IEJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kY29sb3IgYWx0ZXJuYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEUgPSBCQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1JfQUxURVJOQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHRjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19URVhUQ09MT1IgPSBCQVNFX1NUWUxFX19URVhUQ09MT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX1RFWFRBTElHTiA9IEJBU0VfU1RZTEVfX1RFWFRBTElHTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3JkZXIgVG9wPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX0JPUkRFUl9UT1AgPSBCQVNFX1NUWUxFX19CT1JERVJfVE9QOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBCb3R0b208L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fQk9SREVSX0JPVFRPTSA9IEJBU0VfU1RZTEVfX0JPUkRFUl9CT1RUT007CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9yZGVyIExlZnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fQk9SREVSX0xFRlQgPSBCQVNFX1NUWUxFX19CT1JERVJfTEVGVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3JkZXIgUmlnaHQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fQk9SREVSX1JJR0hUID0gQkFTRV9TVFlMRV9fQk9SREVSX1JJR0hUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgVG9wIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFID0gQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19QQURESU5HX1RPUF9VTklUID0gQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVU5JVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRSA9IEJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVCA9IEJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBMZWZ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRSA9IEJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIExlZnQgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19QQURESU5HX0xFRlRfVU5JVCA9IEJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRSA9IEJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVCA9IEJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gVG9wIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX01BUkdJTl9UT1BfVkFMVUUgPSBCQVNFX1NUWUxFX19NQVJHSU5fVE9QX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19NQVJHSU5fVE9QX1VOSVQgPSBCQVNFX1NUWUxFX19NQVJHSU5fVE9QX1VOSVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIExlZnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fTUFSR0lOX0xFRlRfVkFMVUUgPSBCQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gTGVmdCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQgPSBCQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9VTklUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBCb3R0b20gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fTUFSR0lOX0JPVFRPTV9WQUxVRSA9IEJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIEJvdHRvbSBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVCA9IEJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFID0gQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVESUFfU1RZTEVfX01BUkdJTl9SSUdIVF9VTklUID0gQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVkaWE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRURJQV9TVFlMRV9fTUVESUEgPSBCQVNFX1NUWUxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lZGlhIFN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX0ZFQVRVUkVfQ09VTlQgPSBCQVNFX1NUWUxFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEJBU0VfU1RZTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPk1lZGlhIFN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FRElBX1NUWUxFX09QRVJBVElPTl9DT1VOVCA9IEJBU0VfU1RZTEVfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwgPGVtPlN0eWxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1RZTEUgPSAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX05BTUUgPSBSRVBPUlRfQkFTRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtYXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fRk9STUFUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9udDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX19GT05UID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZGNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUiA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHRjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX19URVhUQ09MT1IgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0YWxpZ248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fVEVYVEFMSUdOID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9yZGVyIFRvcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX19CT1JERVJfVE9QID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9yZGVyIEJvdHRvbTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX19CT1JERVJfQk9UVE9NID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9yZGVyIExlZnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fQk9SREVSX0xFRlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb3JkZXIgUmlnaHQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fQk9SREVSX1JJR0hUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBUb3AgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fUEFERElOR19UT1BfVkFMVUUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX19QQURESU5HX1RPUF9VTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fUEFERElOR19CT1RUT01fVU5JVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIExlZnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgTGVmdCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fUEFERElOR19SSUdIVF9VTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fTUFSR0lOX1RPUF9WQUxVRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gVG9wIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fTUFSR0lOX1RPUF9VTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBMZWZ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDIwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBMZWZ0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fTUFSR0lOX0xFRlRfVU5JVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAyMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gQm90dG9tIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIEJvdHRvbSBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX01BUkdJTl9SSUdIVF9VTklUID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVFlMRV9fRVhURU5EUyA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAyNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZWRpYXN0eWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX01FRElBU1RZTEVTID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI3OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjg7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RZTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlN0eWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUWUxFX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9CQVNFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUZvcm1hdEltcGwgPGVtPlNvbWUgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRTb21lRm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNPTUVfRk9STUFUID0gMjE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfRk9STUFUX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VWkgcGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfRk9STUFUX19VSV9QQVRURVJOID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IHBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4gPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0YWxpZ248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVF9fVEVYVEFMSUdOID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U29tZSBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU09NRV9GT1JNQVRfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfRk9STUFUX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Tb21lIEZvcm1hdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0ZPUk1BVF9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlVvbW9Gb3JtYXRJbXBsIDxlbT5Vb21vIEZvcm1hdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVW9tb0Zvcm1hdEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VW9tb0Zvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBVT01PX0ZPUk1BVCA9IDIyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVT01PX0ZPUk1BVF9fTkFNRSA9IFNPTUVfRk9STUFUX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVpIHBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVT01PX0ZPUk1BVF9fVUlfUEFUVEVSTiA9IFNPTUVfRk9STUFUX19VSV9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVU9NT19GT1JNQVRfX1JFUE9SVF9QQVRURVJOID0gU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHRhbGlnbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVPTU9fRk9STUFUX19URVhUQUxJR04gPSBTT01FX0ZPUk1BVF9fVEVYVEFMSUdOOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVvbW8gRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFVPTU9fRk9STUFUX0ZFQVRVUkVfQ09VTlQgPSBTT01FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBVT01PX0ZPUk1BVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBTT01FX0ZPUk1BVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VW9tbyBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVU9NT19GT1JNQVRfT1BFUkFUSU9OX0NPVU5UID0gU09NRV9GT1JNQVRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5OdW1iZXJGb3JtYXRJbXBsIDxlbT5OdW1iZXIgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5OdW1iZXJGb3JtYXRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE51bWJlckZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBOVU1CRVJfRk9STUFUID0gMjM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5VTUJFUl9GT1JNQVRfX05BTUUgPSBTT01FX0ZPUk1BVF9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VaSBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTlVNQkVSX0ZPUk1BVF9fVUlfUEFUVEVSTiA9IFNPTUVfRk9STUFUX19VSV9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTlVNQkVSX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4gPSBTT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTlVNQkVSX0ZPUk1BVF9fVEVYVEFMSUdOID0gU09NRV9GT1JNQVRfX1RFWFRBTElHTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQgY2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBOVU1CRVJfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkgPSBTT01FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OdW1iZXIgRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5VTUJFUl9GT1JNQVRfRkVBVFVSRV9DT1VOVCA9IFNPTUVfRk9STUFUX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE5VTUJFUl9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gU09NRV9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPk51bWJlciBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTlVNQkVSX0ZPUk1BVF9PUEVSQVRJT05fQ09VTlQgPSBTT01FX0ZPUk1BVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkN1cnJlbmN5Rm9ybWF0SW1wbCA8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXJyZW5jeUZvcm1hdEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0Q3VycmVuY3lGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ1VSUkVOQ1lfRk9STUFUID0gMjQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVUlJFTkNZX0ZPUk1BVF9fTkFNRSA9IFNPTUVfRk9STUFUX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVpIHBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDVVJSRU5DWV9GT1JNQVRfX1VJX1BBVFRFUk4gPSBTT01FX0ZPUk1BVF9fVUlfUEFUVEVSTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQgcGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4gPSBTT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ1VSUkVOQ1lfRk9STUFUX19URVhUQUxJR04gPSBTT01FX0ZPUk1BVF9fVEVYVEFMSUdOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZID0gU09NRV9GT1JNQVRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENVUlJFTkNZX0ZPUk1BVF9GRUFUVVJFX0NPVU5UID0gU09NRV9GT1JNQVRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ1VSUkVOQ1lfRk9STUFUX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFNPTUVfRk9STUFUX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5DdXJyZW5jeSBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ1VSUkVOQ1lfRk9STUFUX09QRVJBVElPTl9DT1VOVCA9IFNPTUVfRk9STUFUX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0ZUZvcm1hdEltcGwgPGVtPkRhdGUgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRlRm9ybWF0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRlRm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERBVEVfRk9STUFUID0gMjU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfRk9STUFUX19OQU1FID0gU09NRV9GT1JNQVRfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VWkgcGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfRk9STUFUX19VSV9QQVRURVJOID0gU09NRV9GT1JNQVRfX1VJX1BBVFRFUk47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IHBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRFX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4gPSBTT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9GT1JNQVRfX1RFWFRBTElHTiA9IFNPTUVfRk9STUFUX19URVhUQUxJR047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IGNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSA9IFNPTUVfRk9STUFUX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGUgRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfRk9STUFUX0ZFQVRVUkVfQ09VTlQgPSBTT01FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRFX0ZPUk1BVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBTT01FX0ZPUk1BVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+RGF0ZSBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9GT1JNQVRfT1BFUkFUSU9OX0NPVU5UID0gU09NRV9GT1JNQVRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRlVGltZUZvcm1hdEltcGwgPGVtPkRhdGUgVGltZSBGb3JtYXQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGVUaW1lRm9ybWF0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRlVGltZUZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEQVRFX1RJTUVfRk9STUFUID0gMjY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfVElNRV9GT1JNQVRfX05BTUUgPSBTT01FX0ZPUk1BVF9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VaSBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9USU1FX0ZPUk1BVF9fVUlfUEFUVEVSTiA9IFNPTUVfRk9STUFUX19VSV9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9USU1FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4gPSBTT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk47CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9USU1FX0ZPUk1BVF9fVEVYVEFMSUdOID0gU09NRV9GT1JNQVRfX1RFWFRBTElHTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQgY2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRFX1RJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkgPSBTT01FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EYXRlIFRpbWUgRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfVElNRV9GT1JNQVRfRkVBVFVSRV9DT1VOVCA9IFNPTUVfRk9STUFUX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEVfVElNRV9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gU09NRV9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkRhdGUgVGltZSBGb3JtYXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFURV9USU1FX0ZPUk1BVF9PUEVSQVRJT05fQ09VTlQgPSBTT01FX0ZPUk1BVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRpbWVGb3JtYXRJbXBsIDxlbT5UaW1lIEZvcm1hdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGltZUZvcm1hdEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGltZUZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUSU1FX0ZPUk1BVCA9IDI3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FX0ZPUk1BVF9fTkFNRSA9IFNPTUVfRk9STUFUX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVpIHBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FX0ZPUk1BVF9fVUlfUEFUVEVSTiA9IFNPTUVfRk9STUFUX19VSV9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOID0gU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHRhbGlnbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVfRk9STUFUX19URVhUQUxJR04gPSBTT01FX0ZPUk1BVF9fVEVYVEFMSUdOOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkgPSBTT01FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UaW1lIEZvcm1hdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FX0ZPUk1BVF9GRUFUVVJFX0NPVU5UID0gU09NRV9GT1JNQVRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRV9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gU09NRV9GT1JNQVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRpbWUgRm9ybWF0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVfRk9STUFUX09QRVJBVElPTl9DT1VOVCA9IFNPTUVfRk9STUFUX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRVBPUlQgPSAyODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfX0RFU0NSSVBUSU9OID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfX0RFU0NSSVBUSU9OX1ZBTFVFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YW1hcnQgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX19EQVRBTUFSVF9SRUYgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW5kZXJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfX1JFTkRFUklORyA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfX0VYVEVSTkFMX0NTU19VUkkgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWdlIFRlbXBsYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX19QQUdFX1RFTVBMQVRFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVkaWE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfX01FRElBID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbGJhcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9fVE9PTEJBUiA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2lnbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9fREVTSUdOID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfQkFTRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ24gPGVtPlJlcG9ydCBEZXNpZ248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ24KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0RGVzaWduKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR04gPSAyOTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQgRGVzaWduPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJlcG9ydCBEZXNpZ248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnbkZpbGVJbXBsIDxlbT5SZXBvcnQgRGVzaWduIEZpbGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnbkZpbGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFJlcG9ydERlc2lnbkZpbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9GSUxFID0gMzA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fRklMRV9fTkFNRSA9IFJFUE9SVF9ERVNJR05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0IERlc2lnbiBGaWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fRklMRV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0RFU0lHTl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfREVTSUdOX0ZJTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0RFU0lHTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UmVwb3J0IERlc2lnbiBGaWxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fRklMRV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfREVTSUdOX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RGVzaWduVGVtcGxhdGVJbXBsIDxlbT5SZXBvcnQgRGVzaWduIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREZXNpZ25UZW1wbGF0ZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9URU1QTEFURSA9IDMxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVTQ1JJUFRJT04gPSBSRVBPUlRfREVTSUdOX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0hFQURFUiA9IFJFUE9SVF9ERVNJR05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVUQUlMID0gUkVQT1JUX0RFU0lHTl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb290ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfREVTSUdOX1RFTVBMQVRFX19GT09URVIgPSBSRVBPUlRfREVTSUdOX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0RFU0lHTl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVBPUlRfREVTSUdOX1RFTVBMQVRFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9ERVNJR05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfREVTSUdOX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29udGFpbmVySW1wbCA8ZW0+Q29udGFpbmVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db250YWluZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT05UQUlORVIgPSAzMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OVEFJTkVSX19FTEVNRU5UUyA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTlRBSU5FUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTlRBSU5FUl9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VIZWFkZXJJbXBsIDxlbT5QYWdlIEhlYWRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUhlYWRlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UGFnZUhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQQUdFX0hFQURFUiA9IDMzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0hFQURFUl9fRUxFTUVOVFMgPSBDT05UQUlORVJfX0VMRU1FTlRTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3cgT24gRmlyc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0hFQURFUl9fU0hPV19PTl9GSVJTVCA9IENPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0hFQURFUl9fSEVJR0hUX1ZBTFVFID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9IRUFERVJfX0hFSUdIVF9VTklUID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhZ2UgSGVhZGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfSEVBREVSX0ZFQVRVUkVfQ09VTlQgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9IRUFERVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ09OVEFJTkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QYWdlIEhlYWRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0hFQURFUl9PUEVSQVRJT05fQ09VTlQgPSBDT05UQUlORVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlRGV0YWlsSW1wbCA8ZW0+UGFnZSBEZXRhaWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VEZXRhaWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFBhZ2VEZXRhaWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEFHRV9ERVRBSUwgPSAzNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9ERVRBSUxfX0VMRU1FTlRTID0gQ09OVEFJTkVSX19FTEVNRU5UUzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWdlIERldGFpbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0RFVEFJTF9GRUFUVVJFX0NPVU5UID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfREVUQUlMX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENPTlRBSU5FUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+UGFnZSBEZXRhaWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9ERVRBSUxfT1BFUkFUSU9OX0NPVU5UID0gQ09OVEFJTkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUZvb3RlckltcGwgPGVtPlBhZ2UgRm9vdGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlRm9vdGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRQYWdlRm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBBR0VfRk9PVEVSID0gMzU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfRk9PVEVSX19FTEVNRU5UUyA9IENPTlRBSU5FUl9fRUxFTUVOVFM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvdyBPbiBMYXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9GT09URVJfX1NIT1dfT05fTEFTVCA9IENPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0ZPT1RFUl9fSEVJR0hUX1ZBTFVFID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9GT09URVJfX0hFSUdIVF9VTklUID0gQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhZ2UgRm9vdGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBBR0VfRk9PVEVSX0ZFQVRVUkVfQ09VTlQgPSBDT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUEFHRV9GT09URVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ09OVEFJTkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5QYWdlIEZvb3RlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBQQUdFX0ZPT1RFUl9PUEVSQVRJT05fQ09VTlQgPSBDT05UQUlORVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBFTEVNRU5UID0gMzY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEVMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5XaXRoU3R5bGVJbXBsIDxlbT5XaXRoIFN0eWxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5XaXRoU3R5bGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFdpdGhTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBXSVRIX1NUWUxFID0gMzc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXSVRIX1NUWUxFX19TVFlMRSA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldpdGggU3R5bGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0lUSF9TVFlMRV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0lUSF9TVFlMRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+V2l0aCBTdHlsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXSVRIX1NUWUxFX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGV4dEVsZW1lbnRJbXBsIDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRleHRFbGVtZW50SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBURVhUX0VMRU1FTlQgPSAzODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFWFRfRUxFTUVOVF9fU1RZTEUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVhUX0VMRU1FTlRfX1RFWFQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRleHQgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVhUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVYVF9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEVMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRleHQgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVhUX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRpdGxlSW1wbCA8ZW0+VGl0bGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRpdGxlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUaXRsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUSVRMRSA9IDM5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElUTEVfX1NUWUxFID0gVEVYVF9FTEVNRU5UX19TVFlMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElUTEVfX1RFWFQgPSBURVhUX0VMRU1FTlRfX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGl0bGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElUTEVfRkVBVFVSRV9DT1VOVCA9IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSVRMRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBURVhUX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRpdGxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJVExFX09QRVJBVElPTl9DT1VOVCA9IFRFWFRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN1YlRpdGxlSW1wbCA8ZW0+U3ViIFRpdGxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdWJUaXRsZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0U3ViVGl0bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU1VCX1RJVExFID0gNDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVUJfVElUTEVfX1NUWUxFID0gVEVYVF9FTEVNRU5UX19TVFlMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VCX1RJVExFX19URVhUID0gVEVYVF9FTEVNRU5UX19URVhUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1YiBUaXRsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVUJfVElUTEVfRkVBVFVSRV9DT1VOVCA9IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVUJfVElUTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEVYVF9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5TdWIgVGl0bGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VCX1RJVExFX09QRVJBVElPTl9DT1VOVCA9IFRFWFRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN1YlN1YlRpdGxlSW1wbCA8ZW0+U3ViIFN1YiBUaXRsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3ViU3ViVGl0bGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFN1YlN1YlRpdGxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNVQl9TVUJfVElUTEUgPSA0MTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVQl9TVUJfVElUTEVfX1NUWUxFID0gVEVYVF9FTEVNRU5UX19TVFlMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1VCX1NVQl9USVRMRV9fVEVYVCA9IFRFWFRfRUxFTUVOVF9fVEVYVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdWIgU3ViIFRpdGxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNVQl9TVUJfVElUTEVfRkVBVFVSRV9DT1VOVCA9IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVUJfU1VCX1RJVExFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFRFWFRfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U3ViIFN1YiBUaXRsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVUJfU1VCX1RJVExFX09QRVJBVElPTl9DT1VOVCA9IFRFWFRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkxhYmVsSW1wbCA8ZW0+TGFiZWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkxhYmVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMQUJFTCA9IDQyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfX1NUWUxFID0gVEVYVF9FTEVNRU5UX19TVFlMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfX1RFWFQgPSBURVhUX0VMRU1FTlRfX1RFWFQ7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTEFCRUxfRkVBVFVSRV9DT1VOVCA9IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMQUJFTF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBURVhUX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkxhYmVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExBQkVMX09QRVJBVElPTl9DT1VOVCA9IFRFWFRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRleHRJbXBsIDxlbT5UZXh0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UZXh0SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRFWFQgPSA0MzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFWFRfX1NUWUxFID0gVEVYVF9FTEVNRU5UX19TVFlMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEVYVF9fVEVYVCA9IFRFWFRfRUxFTUVOVF9fVEVYVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRFWFRfRkVBVFVSRV9DT1VOVCA9IFRFWFRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVhUX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFRFWFRfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBURVhUX09QRVJBVElPTl9DT1VOVCA9IFRFWFRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkF1dG9UZXh0SW1wbCA8ZW0+QXV0byBUZXh0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5BdXRvVGV4dEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0QXV0b1RleHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQVVUT19URVhUID0gNDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRPX1RFWFRfX1NUWUxFID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUT19URVhUX19UWVBFID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdXRvIFRleHQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUT19URVhUX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVE9fVEVYVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBFTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BdXRvIFRleHQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUT19URVhUX09QRVJBVElPTl9DT1VOVCA9IEVMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5JbWFnZUltcGwgPGVtPkltYWdlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5JbWFnZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0SW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSU1BR0UgPSA0NTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElNQUdFX19TVFlMRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElNQUdFX19TSVpFID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElNQUdFX19TQ0FMRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTUFHRV9fU09VUkNFX1RZUEUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbGVuYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU1BR0VfX0ZJTEVOQU1FID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbWFnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTUFHRV9GRUFUVVJFX0NPVU5UID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTUFHRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBFTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5JbWFnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTUFHRV9PUEVSQVRJT05fQ09VTlQgPSBFTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aEhlYWRlckZvb3RlckltcGwgPGVtPldpdGggSGVhZGVyIEZvb3RlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aEhlYWRlckZvb3RlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0V2l0aEhlYWRlckZvb3RlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBXSVRIX0hFQURFUl9GT09URVIgPSA0NjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxoZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEhFQURFUiA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcnN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRSA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbGZvb3RlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdJVEhfSEVBREVSX0ZPT1RFUl9fREVUQUlMRk9PVEVSID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyc3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXSVRIX0hFQURFUl9GT09URVJfX0ZPT1RFUlNUWUxFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdJVEhfSEVBREVSX0ZPT1RFUl9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0lUSF9IRUFERVJfRk9PVEVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5XaXRoIEhlYWRlciBGb290ZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0lUSF9IRUFERVJfRk9PVEVSX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRhbWFydFRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFID0gNDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX19OQU1FID0gUkVQT1JUX0JBU0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fU1RZTEUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxoZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fREVUQUlMSEVBREVSID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyc3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fSEVBREVSU1RZTEUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxmb290ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fREVUQUlMRk9PVEVSID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyc3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fRk9PVEVSU1RZTEUgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX19HUk9VUFMgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXRhaWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9fREVUQUlMID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGF0YW1hcnQgVGFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5EYXRhbWFydCBUYWJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGFtYXJ0VGFibGVHcm91cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUCA9IDQ4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9fTkFNRSA9IFJFUE9SVF9CQVNFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbGhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxIRUFERVIgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXJzdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVJTVFlMRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRldGFpbGZvb3RlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxGT09URVIgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb290ZXJzdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVJTVFlMRSA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwaW5nIFJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX19HUk9VUElOR19SRUYgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUiA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfQkFTRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0JBU0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lR3JpZEltcGwgPGVtPlNvbWUgR3JpZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUdyaWRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFNvbWVHcmlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNPTUVfR1JJRCA9IDQ5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvd3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfR1JJRF9fUk9XUyA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNvbWUgR3JpZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTT01FX0dSSURfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfR1JJRF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+U29tZSBHcmlkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNPTUVfR1JJRF9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlckltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSID0gNTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um93czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSX19ST1dTID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fU1RZTEUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEVMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfT1BFUkFUSU9OX0NPVU5UID0gRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlckltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSID0gNTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um93czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0dST1VQX0ZPT1RFUl9fU1RZTEUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEVMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfT1BFUkFUSU9OX0NPVU5UID0gRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVEZXRhaWxJbXBsIDxlbT5EYXRhbWFydCBUYWJsZSBEZXRhaWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVEZXRhaWxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGFtYXJ0VGFibGVEZXRhaWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfREVUQUlMID0gNTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9ERVRBSUxfX1NUWUxFID0gV0lUSF9TVFlMRV9fU1RZTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIEZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlMgPSBXSVRIX1NUWUxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9ERVRBSUxfRkVBVFVSRV9DT1VOVCA9IFdJVEhfU1RZTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfREVUQUlMX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFdJVEhfU1RZTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9ERVRBSUxfT1BFUkFUSU9OX0NPVU5UID0gV0lUSF9TVFlMRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eUltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlUHJvcGVydHlJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWSA9IDUzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX1NUWUxFID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fQ09MVU1OID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcnZhbHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTlRFUlZBTFMgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGUgTGFiZWwgSW50ZXJ2YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9JTlRFUlZBTCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0xPT0tVUFMgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpZGUgTGFiZWwgTG9va3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hJREVfTEFCRUxfTE9PS1VQID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgSW1hZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSEFTX0lNQUdFID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTUFHRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfT1BFUkFUSU9OX0NPVU5UID0gRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRm9ybWF0dGVySW1wbCA8ZW0+VGFibGUgRm9ybWF0dGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUZvcm1hdHRlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVGb3JtYXR0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfRk9STUFUVEVSID0gNTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfRk9STUFUVEVSX19GT1JNQVQgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9GT1JNQVRURVJfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgRm9ybWF0dGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0ZPUk1BVFRFUl9PUEVSQVRJT05fQ09VTlQgPSAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlSW1hZ2VJbXBsIDxlbT5UYWJsZSBJbWFnZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVJbWFnZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9JTUFHRSA9IDU1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltYWdlIFBhdGggUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBVFRFUk4gPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRlIEltYWdlIExhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSU1BR0VfX0hJREVfSU1BR0VfTEFCRUwgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgUGFyYW1ldGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSU1BR0VfX0hBU19QQVJBTUVURVIgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9JTUFHRV9fUkVTSVpFID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzaXplIFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0lNQUdFX19SRVNJWkVfU1RSSU5HID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1hZ2UgUGF0aCBQYXJhbWV0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVJBTUVURVIgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBJbWFnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9JTUFHRV9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSU1BR0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIEltYWdlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0lNQUdFX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVmFsdWVFbGVtZW50IDxlbT5UYWJsZSBWYWx1ZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVWYWx1ZUVsZW1lbnQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVWYWx1ZUVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfVkFMVUVfRUxFTUVOVCA9IDU2OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhYmxlIFZhbHVlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVkFMVUVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVkFMVUVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgVmFsdWUgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9WQUxVRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVQcm9wZXJ0eUltcGwgPGVtPlRhYmxlIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVByb3BlcnR5SW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRBQkxFX1BST1BFUlRZID0gNTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfUFJPUEVSVFlfX1ZBTFVFX1JFRiA9IFRBQkxFX1ZBTFVFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgUHJvcGVydHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IFRBQkxFX1ZBTFVFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfUFJPUEVSVFlfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfVkFMVUVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgUHJvcGVydHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfUFJPUEVSVFlfT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfVkFMVUVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQWdncmVnYXRpb25JbXBsIDxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVBZ2dyZWdhdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTiA9IDU4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTl9fVEVYVCA9IFRBQkxFX1ZBTFVFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04gPSBUQUJMRV9WQUxVRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uIEdyb3VwPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfQUdHUkVHQVRJT05fX09OX0dST1VQID0gVEFCTEVfVkFMVUVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTl9GRUFUVVJFX0NPVU5UID0gVEFCTEVfVkFMVUVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9WQUxVRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9WQUxVRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVCYXNlQWdncmVnYXRpb25JbXBsIDxlbT5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUJhc2VBZ2dyZWdhdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVCYXNlQWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfQkFTRV9BR0dSRUdBVElPTiA9IDU5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFJlZnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fX1ZBTFVFX1JFRlMgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIEJhc2UgQWdncmVnYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbCA8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVQdXJlQWdncmVnYXRpb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRBQkxFX1BVUkVfQUdHUkVHQVRJT04gPSA2MDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBSZWZzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9QVVJFX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1BVUkVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBQdXJlIEFnZ3JlZ2F0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1BVUkVfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfUFVSRV9BR0dSRUdBVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9CQVNFX0FHR1JFR0FUSU9OX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5UYWJsZSBQdXJlIEFnZ3JlZ2F0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1BVUkVfQUdHUkVHQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbkltcGwgPGVtPlRhYmxlIFVuYXJ5IEFnZ3JlZ2F0aW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9VTkFSWV9BR0dSRUdBVElPTiA9IDYxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFJlZnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgVW5hcnkgQWdncmVnYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgVW5hcnkgQWdncmVnYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwgPGVtPlRhYmxlIE11bHRpcGxlIEFnZ3JlZ2F0aW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9NVUxUSVBMRV9BR0dSRUdBVElPTiA9IDYyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFJlZnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsIDxlbT5UYWJsZSBCaW5hcnkgQWdncmVnYXRpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlQmluYXJ5QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OID0gNjM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUmVmczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04gPSBUQUJMRV9CQVNFX0FHR1JFR0FUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9CSU5BUllfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9CSU5BUllfQUdHUkVHQVRJT05fT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUludGVydmFsIDxlbT5UYWJsZSBJbnRlcnZhbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVJbnRlcnZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9JTlRFUlZBTCA9IDY0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhYmxlIEludGVydmFsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0lOVEVSVkFMX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9JTlRFUlZBTF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgSW50ZXJ2YWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSU5URVJWQUxfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckludGVydmFsSW1wbCA8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckludGVydmFsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZU51bWJlckludGVydmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRBQkxFX05VTUJFUl9JTlRFUlZBTCA9IDY1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX0lOVEVSVkFMX1ZBTFVFID0gVEFCTEVfSU5URVJWQUxfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyIFJhbmdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UgPSBUQUJMRV9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBOdW1iZXIgSW50ZXJ2YWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0lOVEVSVkFMX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9OVU1CRVJfSU5URVJWQUxfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfSU5URVJWQUxfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIE51bWJlciBJbnRlcnZhbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9OVU1CRVJfSU5URVJWQUxfT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfSU5URVJWQUxfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZURhdGVEYXlJbnRlcnZhbEltcGwgPGVtPlRhYmxlIERhdGUgRGF5IEludGVydmFsPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZURhdGVEYXlJbnRlcnZhbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfSU5URVJWQUwgPSA2NjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRlIEludGVydmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfSU5URVJWQUxfVkFMVUUgPSBUQUJMRV9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRlIFJhbmdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfUkFOR0UgPSBUQUJMRV9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBEYXRlIERheSBJbnRlcnZhbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UID0gVEFCTEVfSU5URVJWQUxfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfSU5URVJWQUxfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIERhdGUgRGF5IEludGVydmFsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX09QRVJBVElPTl9DT1VOVCA9IFRBQkxFX0lOVEVSVkFMX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTG9va3VwIDxlbT5UYWJsZSBMb29rdXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUxvb2t1cAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUxvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9MT09LVVAgPSA2NzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBMb29rdXA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9MT09LVVBfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIExvb2t1cDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9MT09LVVBfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckxvb2t1cEltcGwgPGVtPlRhYmxlIE51bWJlciBMb29rdXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlTnVtYmVyTG9va3VwSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZU51bWJlckxvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9OVU1CRVJfTE9PS1VQID0gNjg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0xPT0tVUF9fTE9PS1VQX1ZBTFVFID0gVEFCTEVfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyZXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEUgPSBUQUJMRV9MT09LVVBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgTnVtYmVyIExvb2t1cDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9OVU1CRVJfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9MT09LVVBfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0xPT0tVUF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9MT09LVVBfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIE51bWJlciBMb29rdXA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfTlVNQkVSX0xPT0tVUF9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9MT09LVVBfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVN0cmluZ0xvb2t1cEltcGwgPGVtPlRhYmxlIFN0cmluZyBMb29rdXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlU3RyaW5nTG9va3VwSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVN0cmluZ0xvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9TVFJJTkdfTE9PS1VQID0gNjk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFID0gVEFCTEVfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyZXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfU1RSSU5HX0xPT0tVUF9fRElTQ1JFVEUgPSBUQUJMRV9MT09LVVBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgU3RyaW5nIExvb2t1cDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9TVFJJTkdfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9MT09LVVBfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfU1RSSU5HX0xPT0tVUF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9MT09LVVBfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIFN0cmluZyBMb29rdXA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfU1RSSU5HX0xPT0tVUF9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9MT09LVVBfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZURhdGVEYXlMb29rdXBJbXBsIDxlbT5UYWJsZSBEYXRlIERheSBMb29rdXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRGF0ZURheUxvb2t1cEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVEYXRlRGF5TG9va3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRBQkxFX0RBVEVfREFZX0xPT0tVUCA9IDcwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0RBVEVfREFZX0xPT0tVUF9fTE9PS1VQX1ZBTFVFID0gVEFCTEVfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyZXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfTE9PS1VQX19ESVNDUkVURSA9IFRBQkxFX0xPT0tVUF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBEYXRlIERheSBMb29rdXA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfTE9PS1VQX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9MT09LVVBfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfREFURV9EQVlfTE9PS1VQX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFRBQkxFX0xPT0tVUF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgRGF0ZSBEYXkgTG9va3VwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0RBVEVfREFZX0xPT0tVUF9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9MT09LVVBfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQgPGVtPlRhYmxlIFJhbmdlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVJhbmdlRWxlbWVudAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVJhbmdlRWxlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9SQU5HRV9FTEVNRU5UID0gNzE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgUmFuZ2UgRWxlbWVudDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9SQU5HRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9SQU5HRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJFUE9SVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5UYWJsZSBSYW5nZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1JBTkdFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRleHRDb2xvckltcGwgPGVtPlRhYmxlIFRleHQgQ29sb3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlVGV4dENvbG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVRleHRDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9URVhUX0NPTE9SID0gNzI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9URVhUX0NPTE9SX19DT0xPUiA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgVGV4dCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9URVhUX0NPTE9SX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1RFWFRfQ09MT1JfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgVGV4dCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9URVhUX0NPTE9SX09QRVJBVElPTl9DT1VOVCA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUNlbGxDb2xvckltcGwgPGVtPlRhYmxlIENlbGwgQ29sb3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQ2VsbENvbG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUNlbGxDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9DRUxMX0NPTE9SID0gNzM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9DRUxMX0NPTE9SX19DT0xPUiA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFibGUgQ2VsbCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9DRUxMX0NPTE9SX0ZFQVRVUkVfQ09VTlQgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0NFTExfQ09MT1JfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+VGFibGUgQ2VsbCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9DRUxMX0NPTE9SX09QRVJBVElPTl9DT1VOVCA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUljb25JbXBsIDxlbT5UYWJsZSBJY29uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUljb25JbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlSWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUQUJMRV9JQ09OID0gNzQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX0lDT05fX0lDT04gPSBUQUJMRV9SQU5HRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhYmxlIEljb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSUNPTl9GRUFUVVJFX0NPVU5UID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9JQ09OX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlRhYmxlIEljb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfSUNPTl9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVUcmVuZEltcGwgPGVtPlRhYmxlIFRyZW5kPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRyZW5kSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVRyZW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRBQkxFX1RSRU5EID0gNzU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1RSRU5EX19JQ09OID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBUcmVuZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9UUkVORF9GRUFUVVJFX0NPVU5UID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9UUkVORF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5UYWJsZSBUcmVuZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9UUkVORF9PUEVSQVRJT05fQ09VTlQgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVUb29sdGlwSW1wbCA8ZW0+VGFibGUgVG9vbHRpcDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVUb29sdGlwSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVRvb2x0aXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVEFCTEVfVE9PTFRJUCA9IDc2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2x0aXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUQUJMRV9UT09MVElQX19UT09MVElQID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYWJsZSBUb29sdGlwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1RPT0xUSVBfRkVBVFVSRV9DT1VOVCA9IFRBQkxFX1JBTkdFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVEFCTEVfVE9PTFRJUF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBUQUJMRV9SQU5HRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5UYWJsZSBUb29sdGlwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRBQkxFX1RPT0xUSVBfT1BFUkFUSU9OX0NPVU5UID0gVEFCTEVfUkFOR0VfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRJbXBsIDxlbT5HcmlkPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5HcmlkSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRHcmlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEdSSUQgPSA3NzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9fTkFNRSA9IFJFUE9SVF9CQVNFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvd3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSSURfX1JPV1MgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmlkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSSURfRkVBVFVSRV9DT1VOVCA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSSURfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkdyaWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9PUEVSQVRJT05fQ09VTlQgPSBSRVBPUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRSb3dJbXBsIDxlbT5HcmlkIFJvdzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZFJvd0ltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0R3JpZFJvdygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBHUklEX1JPVyA9IDc4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX1JPV19fTkFNRSA9IFJFUE9SVF9CQVNFX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9ST1dfX1NUWUxFID0gUkVQT1JUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2VsbHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSSURfUk9XX19DRUxMUyA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyaWQgUm93PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEdSSURfUk9XX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX1JPV19fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBSRVBPUlRfQkFTRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+R3JpZCBSb3c8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9ST1dfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0JBU0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5HcmlkQ2VsbEltcGwgPGVtPkdyaWQgQ2VsbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZENlbGxJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEdyaWRDZWxsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEdSSURfQ0VMTCA9IDc5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX0NFTExfX05BTUUgPSBSRVBPUlRfQkFTRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9DRUxMX19FTEVNRU5UUyA9IFJFUE9SVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbnNwYW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX0NFTExfX0NPTFVNTlNQQU4gPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmlkIENlbGw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgR1JJRF9DRUxMX0ZFQVRVUkVfQ09VTlQgPSBSRVBPUlRfQkFTRV9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX0NFTExfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUkVQT1JUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkdyaWQgQ2VsbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBHUklEX0NFTExfT1BFUkFUSU9OX0NPVU5UID0gUkVQT1JUX0JBU0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0gPGVtPlVuaXQgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VW5pdEVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVU5JVF9FTlVNID0gODA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bSA8ZW0+UGFnZSBTaXplIEVudW08L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRQYWdlU2l6ZUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUEFHRV9TSVpFX0VOVU0gPSA4MTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuT3JpZW50YXRpb25FbnVtIDxlbT5PcmllbnRhdGlvbiBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5PcmllbnRhdGlvbkVudW0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0T3JpZW50YXRpb25FbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IE9SSUVOVEFUSU9OX0VOVU0gPSA4MjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bSA8ZW0+Rm9udCBTdHlsZSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnRTdHlsZUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRk9OVF9TVFlMRV9FTlVNID0gODM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bSA8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHkgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHlFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEJ1aWxkSW5Gb250RmFtaWx5RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBCVUlMRF9JTl9GT05UX0ZBTUlMWV9FTlVNID0gODQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtIDxlbT5Cb3JkZXIgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJUeXBlRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRCb3JkZXJUeXBlRW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBCT1JERVJfVFlQRV9FTlVNID0gODU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW0gPGVtPlRleHQgQWxpZ24gRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUZXh0QWxpZ25FbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRFWFRfQUxJR05fRU5VTSA9IDg2OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gPGVtPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE51bWJlckZvcm1hdENhdGVnb3J5RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBOVU1CRVJfRk9STUFUX0NBVEVHT1JZX0VOVU0gPSA4NzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0gPGVtPkN1cnJlbmN5IEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDVVJSRU5DWV9GT1JNQVRfQ0FURUdPUllfRU5VTSA9IDg4OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIDxlbT5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGVGb3JtYXRDYXRlZ29yeUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgREFURV9GT1JNQVRfQ0FURUdPUllfRU5VTSA9IDg5OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBEQVRFX1RJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU0gPSA5MDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+VGltZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU0gPSA5MTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtIDxlbT5BdXRvIFRleHQgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEF1dG9UZXh0RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBVVRPX1RFWFRfRU5VTSA9IDkyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtIDxlbT5JbWFnZSBTaXplIEVudW08L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU2l6ZUVudW0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0SW1hZ2VTaXplRW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTUFHRV9TSVpFX0VOVU0gPSA5MzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtIDxlbT5JbWFnZSBTb3VyY2UgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEltYWdlU291cmNlRW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTUFHRV9TT1VSQ0VfRU5VTSA9IDk0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlRW51bSA8ZW0+UHVyZSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFBVUkVfQUdHUkVHQVRJT05fVFlQRV9FTlVNID0gOTU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSA8ZW0+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFVOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSA9IDk2OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIDxlbT5CaW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQklOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSA9IDk3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gPGVtPk11bHRpcGxlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNVUxUSVBMRV9BR0dSRUdBVElPTl9UWVBFX0VOVU0gPSA5ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bSA8ZW0+VHJlbmQgSWNvbiBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRyZW5kSWNvbkVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVFJFTkRfSUNPTl9FTlVNID0gOTk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlbmRlcmluZ0VudW0gPGVtPlJlbmRlcmluZyBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFJlbmRlcmluZ0VudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVOREVSSU5HX0VOVU0gPSAxMDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEludGVybmFsRU9iamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJTlRFUk5BTF9FT0JKRUNUID0gMTAxOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbCA8ZW0+UmVwb3J0IE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydCBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnRNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsI2dldFBja2cgPGVtPlBja2c8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBja2c8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbCNnZXRQY2tnKCkKKwkgKiBAc2VlICNnZXRSZXBvcnRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVwb3J0TW9kZWxfUGNrZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TGF6eVJlc29sdmVyIDxlbT5SZXBvcnQgTGF6eSBSZXNvbHZlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBvcnQgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydExhenlSZXNvbHZlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TGF6eVJlc29sdmVyI2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkgPGVtPkVSZXNvbHZlIFByb3h5PC9lbT59JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TGF6eVJlc29sdmVyI2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRU9wZXJhdGlvbiBnZXRSZXBvcnRMYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0QmFzZSA8ZW0+UmVwb3J0IEJhc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0IEJhc2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRCYXNlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnRCYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydEJhc2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRCYXNlI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFJlcG9ydEJhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlcG9ydEJhc2VfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSA8ZW0+UmVwb3J0IFBhY2thZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0IFBhY2thZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnRQYWNrYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0SW1wb3J0U2VjdGlvbiA8ZW0+SW1wb3J0IFNlY3Rpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbXBvcnQgU2VjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0SW1wb3J0U2VjdGlvbigpCisJICogQHNlZSAjZ2V0UmVwb3J0UGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9JbXBvcnRTZWN0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0RXh0ZXJuYWxDc3NVUkkgPGVtPkV4dGVybmFsIENzcyBVUkk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRFeHRlcm5hbENzc1VSSSgpCisJICogQHNlZSAjZ2V0UmVwb3J0UGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlIDxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpCisJICogQHNlZSAjZ2V0UmVwb3J0UGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSUJ1bmRsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldFBhZ2V0ZW1wbGF0ZXMgPGVtPlBhZ2V0ZW1wbGF0ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QYWdldGVtcGxhdGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRQYWdldGVtcGxhdGVzKCkKKwkgKiBAc2VlICNnZXRSZXBvcnRQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnRQYWNrYWdlX1BhZ2V0ZW1wbGF0ZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRGb3JtYXR0ZXJzIDxlbT5Gb3JtYXR0ZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Rm9ybWF0dGVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Rm9ybWF0dGVycygpCisJICogQHNlZSAjZ2V0UmVwb3J0UGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9Gb3JtYXR0ZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Q29sb3JzIDxlbT5Db2xvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2xvcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldENvbG9ycygpCisJICogQHNlZSAjZ2V0UmVwb3J0UGFja2FnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9Db2xvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRGb250cyA8ZW0+Rm9udHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Gb250czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Rm9udHMoKQorCSAqIEBzZWUgI2dldFJlcG9ydFBhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlcG9ydFBhY2thZ2VfRm9udHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRNZWRpYXMgPGVtPk1lZGlhczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1lZGlhczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0TWVkaWFzKCkKKwkgKiBAc2VlICNnZXRSZXBvcnRQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnRQYWNrYWdlX01lZGlhcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldFN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3R5bGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRTdHlsZXMoKQorCSAqIEBzZWUgI2dldFJlcG9ydFBhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlcG9ydFBhY2thZ2VfU3R5bGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXBvcnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRSZXBvcnRzKCkKKwkgKiBAc2VlICNnZXRSZXBvcnRQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnRQYWNrYWdlX1JlcG9ydHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMgPGVtPlBhZ2UgVGVtcGxhdGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhZ2UgVGVtcGxhdGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGFnZVRlbXBsYXRlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMjZ2V0UGFnZXRlbXBsYXRlcyA8ZW0+UGFnZXRlbXBsYXRlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFnZXRlbXBsYXRlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMjZ2V0UGFnZXRlbXBsYXRlcygpCisJICogQHNlZSAjZ2V0UGFnZVRlbXBsYXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGFnZVRlbXBsYXRlc19QYWdldGVtcGxhdGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0cyA8ZW0+U29tZSBGb3JtYXRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNvbWUgRm9ybWF0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXRzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTb21lRm9ybWF0cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXRzI2dldEZvcm1hdHRlcnMgPGVtPkZvcm1hdHRlcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkZvcm1hdHRlcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0cyNnZXRGb3JtYXR0ZXJzKCkKKwkgKiBAc2VlICNnZXRTb21lRm9ybWF0cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U29tZUZvcm1hdHNfRm9ybWF0dGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzIDxlbT5Db2xvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29sb3JzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDb2xvcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcnMjZ2V0Q29sb3JzIDxlbT5Db2xvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbG9yczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9ycyNnZXRDb2xvcnMoKQorCSAqIEBzZWUgI2dldENvbG9ycygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q29sb3JzX0NvbG9ycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMgPGVtPkZvbnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZvbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEZvbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMjZ2V0Rm9udHMgPGVtPkZvbnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Gb250czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzI2dldEZvbnRzKCkKKwkgKiBAc2VlICNnZXRGb250cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Rm9udHNfRm9udHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhcyA8ZW0+TWVkaWFzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lZGlhczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWVkaWFzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzI2dldE1lZGlhcyA8ZW0+TWVkaWFzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZWRpYXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYXMjZ2V0TWVkaWFzKCkKKwkgKiBAc2VlICNnZXRNZWRpYXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE1lZGlhc19NZWRpYXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0eWxlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3R5bGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzI2dldFN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdHlsZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXMjZ2V0U3R5bGVzKCkKKwkgKiBAc2VlICNnZXRTdHlsZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFN0eWxlc19TdHlsZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWdlIFRlbXBsYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRQYWdlVGVtcGxhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXplPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFNpemUoKQorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldE9yaWVudGF0aW9uIDxlbT5PcmllbnRhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yaWVudGF0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldE9yaWVudGF0aW9uKCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9PcmllbnRhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0VG9wTWFyZ2luVmFsdWUgPGVtPlRvcCBNYXJnaW4gVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub3AgTWFyZ2luIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFRvcE1hcmdpblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9Ub3BNYXJnaW5WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0VG9wTWFyZ2luVW5pdCA8ZW0+VG9wIE1hcmdpbiBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG9wIE1hcmdpbiBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFRvcE1hcmdpblVuaXQoKQorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX1RvcE1hcmdpblVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldExlZnRNYXJnaW5WYWx1ZSA8ZW0+TGVmdCBNYXJnaW4gVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRMZWZ0TWFyZ2luVmFsdWUoKQorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX0xlZnRNYXJnaW5WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0TGVmdE1hcmdpblVuaXQgPGVtPkxlZnQgTWFyZ2luIFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZWZ0IE1hcmdpbiBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldExlZnRNYXJnaW5Vbml0KCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9MZWZ0TWFyZ2luVW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0Qm90dG9tTWFyZ2luVmFsdWUgPGVtPkJvdHRvbSBNYXJnaW4gVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb3R0b20gTWFyZ2luIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldEJvdHRvbU1hcmdpblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9Cb3R0b21NYXJnaW5WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0Qm90dG9tTWFyZ2luVW5pdCA8ZW0+Qm90dG9tIE1hcmdpbiBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm90dG9tIE1hcmdpbiBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldEJvdHRvbU1hcmdpblVuaXQoKQorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldFJpZ2h0TWFyZ2luVmFsdWUgPGVtPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRSaWdodE1hcmdpblZhbHVlKCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRSaWdodE1hcmdpblVuaXQgPGVtPlJpZ2h0IE1hcmdpbiBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUjZ2V0UmlnaHRNYXJnaW5Vbml0KCkKKwkgKiBAc2VlICNnZXRQYWdlVGVtcGxhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SGVhZGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlI2dldEhlYWRlcigpCisJICogQHNlZSAjZ2V0UGFnZVRlbXBsYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRQYWdlVGVtcGxhdGVfSGVhZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkZvb3RlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZSNnZXRGb290ZXIoKQorCSAqIEBzZWUgI2dldFBhZ2VUZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UGFnZVRlbXBsYXRlX0Zvb3RlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IgPGVtPkNvbG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0Q29sb3IoKQorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb2xvcl9Db2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXRCYXNlY29sb3IgPGVtPkJhc2Vjb2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhc2Vjb2xvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldEJhc2Vjb2xvcigpCisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbG9yX0Jhc2Vjb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXREYXJrZW5zYnkgPGVtPkRhcmtlbnNieTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhcmtlbnNieTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldERhcmtlbnNieSgpCisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbG9yX0RhcmtlbnNieSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvciNnZXRMaWdodGVuc2J5IDxlbT5MaWdodGVuc2J5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGlnaHRlbnNieTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldExpZ2h0ZW5zYnkoKQorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb2xvcl9MaWdodGVuc2J5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldFRyYW5zZm9ybXNieSA8ZW0+VHJhbnNmb3Jtc2J5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNmb3Jtc2J5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0VHJhbnNmb3Jtc2J5KCkKKwkgKiBAc2VlICNnZXRDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29sb3JfVHJhbnNmb3Jtc2J5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yI2dldFRhcmdldGNvbG9yIDxlbT5UYXJnZXRjb2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhcmdldGNvbG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IjZ2V0VGFyZ2V0Y29sb3IoKQorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb2xvcl9UYXJnZXRjb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCA8ZW0+Rm9udDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Gb250PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Rm9udCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldEV4dGVuZHMgPGVtPkV4dGVuZHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FeHRlbmRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRFeHRlbmRzKCkKKwkgKiBAc2VlICNnZXRGb250KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRGb250X0V4dGVuZHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRGYW1pbHkgPGVtPkZhbWlseTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkZhbWlseTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0RmFtaWx5KCkKKwkgKiBAc2VlICNnZXRGb250KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRGb250X0ZhbWlseSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0eWxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRTdHlsZSgpCisJICogQHNlZSAjZ2V0Rm9udCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Rm9udF9TdHlsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2lzQm9sZCA8ZW0+Qm9sZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvbGQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2lzQm9sZCgpCisJICogQHNlZSAjZ2V0Rm9udCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Rm9udF9Cb2xkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0U2l6ZXZhbHVlIDxlbT5TaXpldmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXpldmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250I2dldFNpemV2YWx1ZSgpCisJICogQHNlZSAjZ2V0Rm9udCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Rm9udF9TaXpldmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udCNnZXRTaXpldW5pdCA8ZW0+U2l6ZXVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXpldW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQjZ2V0U2l6ZXVuaXQoKQorCSAqIEBzZWUgI2dldEZvbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEZvbnRfU2l6ZXVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRGYW1pbHkgPGVtPkZvbnQgRmFtaWx5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Rm9udEZhbWlseSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHkgPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEJ1aWxkSW5Gb250RmFtaWx5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5I2dldEN1c3RvbSA8ZW0+Q3VzdG9tPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VzdG9tPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHkjZ2V0Q3VzdG9tKCkKKwkgKiBAc2VlICNnZXRCdWlsZEluRm9udEZhbWlseSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QnVpbGRJbkZvbnRGYW1pbHlfQ3VzdG9tKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5IDxlbT5DdXN0b20gRm9udCBGYW1pbHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q3VzdG9tIEZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VzdG9tRm9udEZhbWlseQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q3VzdG9tRm9udEZhbWlseSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5I2dldEN1c3RvbSA8ZW0+Q3VzdG9tPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VzdG9tPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VzdG9tRm9udEZhbWlseSNnZXRDdXN0b20oKQorCSAqIEBzZWUgI2dldEN1c3RvbUZvbnRGYW1pbHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEN1c3RvbUZvbnRGYW1pbHlfQ3VzdG9tKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYSA8ZW0+TWVkaWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVkaWE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWVkaWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlIDxlbT5Cb3JkZXIgU3R5bGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Qm9yZGVyIFN0eWxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEJvcmRlclN0eWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUjZ2V0VHlwZSgpCisJICogQHNlZSAjZ2V0Qm9yZGVyU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJvcmRlclN0eWxlX1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUjZ2V0V2lkdGh2YWx1ZSA8ZW0+V2lkdGh2YWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRodmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRXaWR0aHZhbHVlKCkKKwkgKiBAc2VlICNnZXRCb3JkZXJTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Qm9yZGVyU3R5bGVfV2lkdGh2YWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRXaWR0aHVuaXQgPGVtPldpZHRodW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldpZHRodW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlI2dldFdpZHRodW5pdCgpCisJICogQHNlZSAjZ2V0Qm9yZGVyU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJvcmRlclN0eWxlX1dpZHRodW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZSNnZXRDb2xvciA8ZW0+Q29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Db2xvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlI2dldENvbG9yKCkKKwkgKiBAc2VlICNnZXRCb3JkZXJTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Qm9yZGVyU3R5bGVfQ29sb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSA8ZW0+QmFzZSBTdHlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlIFN0eWxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRCYXNlU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Rm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEZvcm1hdCgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRGb250IDxlbT5Gb250PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Rm9udDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRGb250KCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEJhc2VTdHlsZV9Gb250KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCYWNrZ3JvdW5kY29sb3IgPGVtPkJhY2tncm91bmRjb2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhY2tncm91bmRjb2xvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCYWNrZ3JvdW5kY29sb3IoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0JhY2tncm91bmRjb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0VGV4dGNvbG9yIDxlbT5UZXh0Y29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UZXh0Y29sb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0VGV4dGNvbG9yKCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEJhc2VTdHlsZV9UZXh0Y29sb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFRleHRhbGlnbiA8ZW0+VGV4dGFsaWduPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dGFsaWduPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFRleHRhbGlnbigpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfVGV4dGFsaWduKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJUb3AgPGVtPkJvcmRlciBUb3A8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Cb3JkZXIgVG9wPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlclRvcCgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQm9yZGVyVG9wKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJCb3R0b20gPGVtPkJvcmRlciBCb3R0b208L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Cb3JkZXIgQm90dG9tPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlckJvdHRvbSgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQm9yZGVyQm90dG9tKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRCb3JkZXJMZWZ0IDxlbT5Cb3JkZXIgTGVmdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJvcmRlciBMZWZ0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlckxlZnQoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0JvcmRlckxlZnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldEJvcmRlclJpZ2h0IDxlbT5Cb3JkZXIgUmlnaHQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Cb3JkZXIgUmlnaHQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0Qm9yZGVyUmlnaHQoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0JvcmRlclJpZ2h0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nVG9wVmFsdWUgPGVtPlBhZGRpbmcgVG9wIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1RvcFZhbHVlKCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nVG9wVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdUb3BVbml0IDxlbT5QYWRkaW5nIFRvcCBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFkZGluZyBUb3AgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nVG9wVW5pdCgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ1RvcFVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdCb3R0b21WYWx1ZSA8ZW0+UGFkZGluZyBCb3R0b20gVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nQm90dG9tVmFsdWUoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX1BhZGRpbmdCb3R0b21WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ0JvdHRvbVVuaXQgPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWRkaW5nIEJvdHRvbSBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdCb3R0b21Vbml0KCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ0xlZnRWYWx1ZSA8ZW0+UGFkZGluZyBMZWZ0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFkZGluZyBMZWZ0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdMZWZ0VmFsdWUoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX1BhZGRpbmdMZWZ0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdMZWZ0VW5pdCA8ZW0+UGFkZGluZyBMZWZ0IFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWRkaW5nIExlZnQgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRQYWRkaW5nTGVmdFVuaXQoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX1BhZGRpbmdMZWZ0VW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWRkaW5nIFJpZ2h0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdSaWdodFZhbHVlKCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nUmlnaHRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0UGFkZGluZ1JpZ2h0VW5pdCA8ZW0+UGFkZGluZyBSaWdodCBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFkZGluZyBSaWdodCBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldFBhZGRpbmdSaWdodFVuaXQoKQorCSAqIEBzZWUgI2dldEJhc2VTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX1BhZGRpbmdSaWdodFVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblRvcFZhbHVlIDxlbT5NYXJnaW4gVG9wIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Ub3BWYWx1ZSgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luVG9wVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblRvcFVuaXQgPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Ub3BVbml0KCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5Ub3BVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5MZWZ0VmFsdWUgPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luTGVmdFZhbHVlKCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5MZWZ0VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkxlZnRVbml0IDxlbT5NYXJnaW4gTGVmdCBVbml0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFyZ2luIExlZnQgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5MZWZ0VW5pdCgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkJvdHRvbVZhbHVlIDxlbT5NYXJnaW4gQm90dG9tIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFyZ2luIEJvdHRvbSBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Cb3R0b21WYWx1ZSgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luQm90dG9tVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpbkJvdHRvbVVuaXQgPGVtPk1hcmdpbiBCb3R0b20gVW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcmdpbiBCb3R0b20gVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5Cb3R0b21Vbml0KCkKKwkgKiBAc2VlICNnZXRCYXNlU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5Cb3R0b21Vbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZSNnZXRNYXJnaW5SaWdodFZhbHVlIDxlbT5NYXJnaW4gUmlnaHQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXJnaW4gUmlnaHQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luUmlnaHRWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CYXNlU3R5bGUjZ2V0TWFyZ2luUmlnaHRVbml0IDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcmdpbiBSaWdodCBVbml0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlI2dldE1hcmdpblJpZ2h0VW5pdCgpCisJICogQHNlZSAjZ2V0QmFzZVN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luUmlnaHRVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlIDxlbT5NZWRpYSBTdHlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZWRpYSBTdHlsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE1lZGlhU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZSNnZXRNZWRpYSA8ZW0+TWVkaWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZWRpYTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUjZ2V0TWVkaWEoKQorCSAqIEBzZWUgI2dldE1lZGlhU3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE1lZGlhU3R5bGVfTWVkaWEoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdHlsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTdHlsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZSNnZXRFeHRlbmRzIDxlbT5FeHRlbmRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RXh0ZW5kczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlI2dldEV4dGVuZHMoKQorCSAqIEBzZWUgI2dldFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTdHlsZV9FeHRlbmRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUjZ2V0TWVkaWFzdHlsZXMgPGVtPk1lZGlhc3R5bGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZWRpYXN0eWxlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlI2dldE1lZGlhc3R5bGVzKCkKKwkgKiBAc2VlICNnZXRTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U3R5bGVfTWVkaWFzdHlsZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQgPGVtPlNvbWUgRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNvbWUgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U29tZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0I2dldFVpX3BhdHRlcm4gPGVtPlVpIHBhdHRlcm48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VaSBwYXR0ZXJuPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRVaV9wYXR0ZXJuKCkKKwkgKiBAc2VlICNnZXRTb21lRm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTb21lRm9ybWF0X1VpX3BhdHRlcm4oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRSZXBvcnRfcGF0dGVybiA8ZW0+UmVwb3J0IHBhdHRlcm48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXBvcnQgcGF0dGVybjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQjZ2V0UmVwb3J0X3BhdHRlcm4oKQorCSAqIEBzZWUgI2dldFNvbWVGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNvbWVGb3JtYXRfUmVwb3J0X3BhdHRlcm4oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRUZXh0YWxpZ24gPGVtPlRleHRhbGlnbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRleHRhbGlnbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQjZ2V0VGV4dGFsaWduKCkKKwkgKiBAc2VlICNnZXRTb21lRm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTb21lRm9ybWF0X1RleHRhbGlnbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW9tb0Zvcm1hdCA8ZW0+VW9tbyBGb3JtYXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VW9tbyBGb3JtYXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vb21vRm9ybWF0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRVb21vRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQgPGVtPk51bWJlciBGb3JtYXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TnVtYmVyIEZvcm1hdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TnVtYmVyRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBzZWUgI2dldE51bWJlckZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TnVtYmVyRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQgPGVtPkN1cnJlbmN5IEZvcm1hdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DdXJyZW5jeSBGb3JtYXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q3VycmVuY3lGb3JtYXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBzZWUgI2dldEN1cnJlbmN5Rm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDdXJyZW5jeUZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQgPGVtPkRhdGUgRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRhdGUgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0ZUZvcm1hdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0I2dldFJlcG9ydF9jYXRlZ29yeSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBzZWUgI2dldERhdGVGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGVGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdCA8ZW0+RGF0ZSBUaW1lIEZvcm1hdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EYXRlIFRpbWUgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERhdGVUaW1lRm9ybWF0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0I2dldFJlcG9ydF9jYXRlZ29yeSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAc2VlICNnZXREYXRlVGltZUZvcm1hdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0ZVRpbWVGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0IDxlbT5UaW1lIEZvcm1hdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaW1lIEZvcm1hdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRpbWVGb3JtYXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAc2VlICNnZXRUaW1lRm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjaXNEZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSZXBvcnRfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGVzY3JpcHRpb25WYWx1ZSgpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSZXBvcnRfRGVzY3JpcHRpb25WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGF0YW1hcnRSZWYgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRhdGFtYXJ0IFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXREYXRhbWFydFJlZigpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnRfRGF0YW1hcnRSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldFJlbmRlcmluZyA8ZW0+UmVuZGVyaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVuZGVyaW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldFJlbmRlcmluZygpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSZXBvcnRfUmVuZGVyaW5nKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRFeHRlcm5hbENzc1VSSSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIENzcyBVUkk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RXh0ZXJuYWxDc3NVUkkoKQorCSAqIEBzZWUgI2dldFJlcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydCNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSZXBvcnRfRXh0ZXJuYWxDc3NVUklCdW5kbGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldFBhZ2VUZW1wbGF0ZSA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0UGFnZVRlbXBsYXRlKCkKKwkgKiBAc2VlICNnZXRSZXBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlcG9ydF9QYWdlVGVtcGxhdGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldE1lZGlhIDxlbT5NZWRpYTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1lZGlhPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0I2dldE1lZGlhKCkKKwkgKiBAc2VlICNnZXRSZXBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlcG9ydF9NZWRpYSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0VG9vbGJhciA8ZW0+VG9vbGJhcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRvb2xiYXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0VG9vbGJhcigpCisJICogQHNlZSAjZ2V0UmVwb3J0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnRfVG9vbGJhcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGVzaWduIDxlbT5EZXNpZ248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EZXNpZ248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQjZ2V0RGVzaWduKCkKKwkgKiBAc2VlICNnZXRSZXBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlcG9ydF9EZXNpZ24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbiA8ZW0+UmVwb3J0IERlc2lnbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBvcnQgRGVzaWduPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnREZXNpZ24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUgPGVtPlJlcG9ydCBEZXNpZ24gRmlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBvcnQgRGVzaWduIEZpbGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnREZXNpZ25GaWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFJlcG9ydERlc2lnbkZpbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlcG9ydERlc2lnbkZpbGVfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUgPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0IERlc2lnbiBUZW1wbGF0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5IZWFkZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXRIZWFkZXIoKQorCSAqIEBzZWUgI2dldFJlcG9ydERlc2lnblRlbXBsYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9IZWFkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUjZ2V0RGV0YWlsIDxlbT5EZXRhaWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EZXRhaWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXREZXRhaWwoKQorCSAqIEBzZWUgI2dldFJlcG9ydERlc2lnblRlbXBsYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXRhaWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUjZ2V0Rm9vdGVyIDxlbT5Gb290ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Gb290ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXRGb290ZXIoKQorCSAqIEBzZWUgI2dldFJlcG9ydERlc2lnblRlbXBsYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9Gb290ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbnRhaW5lciA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRhaW5lcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbnRhaW5lcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29udGFpbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29udGFpbmVyI2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWxlbWVudHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIjZ2V0RWxlbWVudHMoKQorCSAqIEBzZWUgI2dldENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyX0VsZW1lbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyIDxlbT5QYWdlIEhlYWRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWdlIEhlYWRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBhZ2VIZWFkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlciNpc1Nob3dPbkZpcnN0IDxlbT5TaG93IE9uIEZpcnN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIjaXNTaG93T25GaXJzdCgpCisJICogQHNlZSAjZ2V0UGFnZUhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZUhlYWRlcl9TaG93T25GaXJzdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyI2dldEhlaWdodFZhbHVlIDxlbT5IZWlnaHQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyI2dldEhlaWdodFZhbHVlKCkKKwkgKiBAc2VlICNnZXRQYWdlSGVhZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWdlSGVhZGVyX0hlaWdodFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIjZ2V0SGVpZ2h0VW5pdCA8ZW0+SGVpZ2h0IFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXIjZ2V0SGVpZ2h0VW5pdCgpCisJICogQHNlZSAjZ2V0UGFnZUhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZUhlYWRlcl9IZWlnaHRVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRGV0YWlsIDxlbT5QYWdlIERldGFpbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWdlIERldGFpbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VEZXRhaWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFBhZ2VEZXRhaWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIgPGVtPlBhZ2UgRm9vdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhZ2UgRm9vdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UGFnZUZvb3RlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2lzU2hvd09uTGFzdCA8ZW0+U2hvdyBPbiBMYXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hvdyBPbiBMYXN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlciNpc1Nob3dPbkxhc3QoKQorCSAqIEBzZWUgI2dldFBhZ2VGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBhZ2VGb290ZXJfU2hvd09uTGFzdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2dldEhlaWdodFZhbHVlIDxlbT5IZWlnaHQgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyI2dldEhlaWdodFZhbHVlKCkKKwkgKiBAc2VlICNnZXRQYWdlRm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRQYWdlRm9vdGVyX0hlaWdodFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIjZ2V0SGVpZ2h0VW5pdCA8ZW0+SGVpZ2h0IFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQgVW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXIjZ2V0SGVpZ2h0VW5pdCgpCisJICogQHNlZSAjZ2V0UGFnZUZvb3RlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UGFnZUZvb3Rlcl9IZWlnaHRVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGUgPGVtPldpdGggU3R5bGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2l0aCBTdHlsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0V2l0aFN0eWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZSNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TdHlsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZSNnZXRTdHlsZSgpCisJICogQHNlZSAjZ2V0V2l0aFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXaXRoU3R5bGVfU3R5bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRleHRFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRFbGVtZW50I2dldFRleHQgPGVtPlRleHQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZXh0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEVsZW1lbnQjZ2V0VGV4dCgpCisJICogQHNlZSAjZ2V0VGV4dEVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRleHRFbGVtZW50X1RleHQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaXRsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUaXRsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViVGl0bGUgPGVtPlN1YiBUaXRsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdWIgVGl0bGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJUaXRsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3ViVGl0bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlN1YlRpdGxlIDxlbT5TdWIgU3ViIFRpdGxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1YiBTdWIgVGl0bGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJTdWJUaXRsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U3ViU3ViVGl0bGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dCA8ZW0+VGV4dDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXh0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGV4dCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQgPGVtPkF1dG8gVGV4dDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdXRvIFRleHQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXV0b1RleHQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dCNnZXRUeXBlKCkKKwkgKiBAc2VlICNnZXRBdXRvVGV4dCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QXV0b1RleHRfVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEltYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXplPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2l6ZSgpCisJICogQHNlZSAjZ2V0SW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEltYWdlX1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2UjZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRTY2FsZSgpCisJICogQHNlZSAjZ2V0SW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEltYWdlX1NjYWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlI2dldFNvdXJjZVR5cGUgPGVtPlNvdXJjZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U291cmNlIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRTb3VyY2VUeXBlKCkKKwkgKiBAc2VlICNnZXRJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfU291cmNlVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZSNnZXRGaWxlbmFtZSA8ZW0+RmlsZW5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWxlbmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlI2dldEZpbGVuYW1lKCkKKwkgKiBAc2VlICNnZXRJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfRmlsZW5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIgPGVtPldpdGggSGVhZGVyIEZvb3RlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XaXRoIEhlYWRlciBGb290ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRXaXRoSGVhZGVyRm9vdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjaXNEZXRhaWxoZWFkZXIgPGVtPkRldGFpbGhlYWRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRldGFpbGhlYWRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjaXNEZXRhaWxoZWFkZXIoKQorCSAqIEBzZWUgI2dldFdpdGhIZWFkZXJGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFdpdGhIZWFkZXJGb290ZXJfRGV0YWlsaGVhZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjZ2V0SGVhZGVyc3R5bGUgPGVtPkhlYWRlcnN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+SGVhZGVyc3R5bGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2dldEhlYWRlcnN0eWxlKCkKKwkgKiBAc2VlICNnZXRXaXRoSGVhZGVyRm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXaXRoSGVhZGVyRm9vdGVyX0hlYWRlcnN0eWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjaXNEZXRhaWxmb290ZXIgPGVtPkRldGFpbGZvb3RlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRldGFpbGZvb3RlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjaXNEZXRhaWxmb290ZXIoKQorCSAqIEBzZWUgI2dldFdpdGhIZWFkZXJGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFdpdGhIZWFkZXJGb290ZXJfRGV0YWlsZm9vdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjZ2V0Rm9vdGVyc3R5bGUgPGVtPkZvb3RlcnN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Rm9vdGVyc3R5bGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2dldEZvb3RlcnN0eWxlKCkKKwkgKiBAc2VlICNnZXRXaXRoSGVhZGVyRm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXaXRoSGVhZGVyRm9vdGVyX0Zvb3RlcnN0eWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlIDxlbT5EYXRhbWFydCBUYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERhdGFtYXJ0VGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlI2dldEdyb3VwcyA8ZW0+R3JvdXBzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Hcm91cHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlI2dldEdyb3VwcygpCisJICogQHNlZSAjZ2V0RGF0YW1hcnRUYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZV9Hcm91cHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZSNnZXREZXRhaWwgPGVtPkRldGFpbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRldGFpbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUjZ2V0RGV0YWlsKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlX0RldGFpbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwIDxlbT5EYXRhbWFydCBUYWJsZSBHcm91cDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EYXRhbWFydCBUYWJsZSBHcm91cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0YW1hcnRUYWJsZUdyb3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cCNnZXRHcm91cGluZ1JlZiA8ZW0+R3JvdXBpbmcgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+R3JvdXBpbmcgUmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwI2dldEdyb3VwaW5nUmVmKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlR3JvdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVHcm91cF9Hcm91cGluZ1JlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5IZWFkZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAjZ2V0SGVhZGVyKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlR3JvdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVHcm91cF9IZWFkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwI2dldEZvb3RlciA8ZW0+Rm9vdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Rm9vdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwI2dldEZvb3RlcigpCisJICogQHNlZSAjZ2V0RGF0YW1hcnRUYWJsZUdyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlR3JvdXBfRm9vdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lR3JpZCA8ZW0+U29tZSBHcmlkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNvbWUgR3JpZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVHcmlkCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRTb21lR3JpZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVHcmlkI2dldFJvd3MgPGVtPlJvd3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJvd3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lR3JpZCNnZXRSb3dzKCkKKwkgKiBAc2VlICNnZXRTb21lR3JpZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U29tZUdyaWRfUm93cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIDxlbT5EYXRhbWFydCBUYWJsZSBHcm91cCBIZWFkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXAgSGVhZGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlciA8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXAgRm9vdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsIDxlbT5EYXRhbWFydCBUYWJsZSBEZXRhaWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YW1hcnQgVGFibGUgRGV0YWlsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZURldGFpbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0YW1hcnRUYWJsZURldGFpbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwjZ2V0Q29sdW1uRm9ybWF0dGVycyA8ZW0+Q29sdW1uIEZvcm1hdHRlcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbHVtbiBGb3JtYXR0ZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZURldGFpbCNnZXRDb2x1bW5Gb3JtYXR0ZXJzKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlRGV0YWlsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlRGV0YWlsX0NvbHVtbkZvcm1hdHRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSA8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0Q29sdW1uKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9Db2x1bW4oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0SW50ZXJ2YWxzIDxlbT5JbnRlcnZhbHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVydmFsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNnZXRJbnRlcnZhbHMoKQorCSAqIEBzZWUgI2dldERhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0ludGVydmFscygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIaWRlTGFiZWxJbnRlcnZhbCA8ZW0+SGlkZSBMYWJlbCBJbnRlcnZhbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhpZGUgTGFiZWwgSW50ZXJ2YWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIaWRlTGFiZWxJbnRlcnZhbCgpCisJICogQHNlZSAjZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGlkZUxhYmVsSW50ZXJ2YWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjZ2V0TG9va3VwcyA8ZW0+TG9va3VwczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TG9va3VwczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNnZXRMb29rdXBzKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9Mb29rdXBzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNpc0hpZGVMYWJlbExvb2t1cCA8ZW0+SGlkZSBMYWJlbCBMb29rdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IaWRlIExhYmVsIExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNpc0hpZGVMYWJlbExvb2t1cCgpCisJICogQHNlZSAjZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGlkZUxhYmVsTG9va3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSNpc0hhc0ltYWdlIDxlbT5IYXMgSW1hZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgSW1hZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkjaXNIYXNJbWFnZSgpCisJICogQHNlZSAjZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGFzSW1hZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5I2dldEltYWdlIDxlbT5JbWFnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkltYWdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5I2dldEltYWdlKCkKKwkgKiBAc2VlICNnZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9JbWFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXIgPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBGb3JtYXR0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUZvcm1hdHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVGb3JtYXR0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXIjZ2V0Rm9ybWF0IDxlbT5Gb3JtYXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gb3JtYXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUZvcm1hdHRlciNnZXRGb3JtYXQoKQorCSAqIEBzZWUgI2dldFRhYmxlRm9ybWF0dGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZUZvcm1hdHRlcl9Gb3JtYXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UgPGVtPlRhYmxlIEltYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhYmxlIEltYWdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVJbWFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldEltYWdlUGF0aFBhdHRlcm4gPGVtPkltYWdlIFBhdGggUGF0dGVybjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltYWdlIFBhdGggUGF0dGVybjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UjZ2V0SW1hZ2VQYXRoUGF0dGVybigpCisJICogQHNlZSAjZ2V0VGFibGVJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVJbWFnZV9JbWFnZVBhdGhQYXR0ZXJuKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UjaXNIaWRlSW1hZ2VMYWJlbCA8ZW0+SGlkZSBJbWFnZSBMYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhpZGUgSW1hZ2UgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2lzSGlkZUltYWdlTGFiZWwoKQorCSAqIEBzZWUgI2dldFRhYmxlSW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRhYmxlSW1hZ2VfSGlkZUltYWdlTGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc0hhc1BhcmFtZXRlciA8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBQYXJhbWV0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2lzSGFzUGFyYW1ldGVyKCkKKwkgKiBAc2VlICNnZXRUYWJsZUltYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZUltYWdlX0hhc1BhcmFtZXRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2lzUmVzaXplIDxlbT5SZXNpemU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNpemU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2lzUmVzaXplKCkKKwkgKiBAc2VlICNnZXRUYWJsZUltYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZUltYWdlX1Jlc2l6ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldFJlc2l6ZVN0cmluZyA8ZW0+UmVzaXplIFN0cmluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc2l6ZSBTdHJpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldFJlc2l6ZVN0cmluZygpCisJICogQHNlZSAjZ2V0VGFibGVJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVJbWFnZV9SZXNpemVTdHJpbmcoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNnZXRJbWFnZVBhdGhQYXJhbWV0ZXIgPGVtPkltYWdlIFBhdGggUGFyYW1ldGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW1hZ2UgUGF0aCBQYXJhbWV0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldEltYWdlUGF0aFBhcmFtZXRlcigpCisJICogQHNlZSAjZ2V0VGFibGVJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVJbWFnZV9JbWFnZVBhdGhQYXJhbWV0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVmFsdWVFbGVtZW50IDxlbT5UYWJsZSBWYWx1ZSBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhYmxlIFZhbHVlIEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVWYWx1ZUVsZW1lbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHJvcGVydHkgPGVtPlRhYmxlIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhYmxlIFByb3BlcnR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5I2dldFZhbHVlUmVmIDxlbT5WYWx1ZSBSZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WYWx1ZSBSZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5I2dldFZhbHVlUmVmKCkKKwkgKiBAc2VlICNnZXRUYWJsZVByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUYWJsZVByb3BlcnR5X1ZhbHVlUmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlQWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbiNnZXRUZXh0IDxlbT5UZXh0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24jZ2V0VGV4dCgpCisJICogQHNlZSAjZ2V0VGFibGVBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVBZ2dyZWdhdGlvbl9UZXh0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24gPGVtPkFnZ3JlZ2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWdncmVnYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAc2VlICNnZXRUYWJsZUFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUYWJsZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24jZ2V0T25Hcm91cCA8ZW0+T24gR3JvdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5PbiBHcm91cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24jZ2V0T25Hcm91cCgpCisJICogQHNlZSAjZ2V0VGFibGVBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVBZ2dyZWdhdGlvbl9Pbkdyb3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJhc2VBZ2dyZWdhdGlvbiA8ZW0+VGFibGUgQmFzZSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb24jZ2V0VmFsdWVSZWZzIDxlbT5WYWx1ZSBSZWZzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZSBSZWZzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb24jZ2V0VmFsdWVSZWZzKCkKKwkgKiBAc2VlICNnZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVCYXNlQWdncmVnYXRpb25fVmFsdWVSZWZzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbiA8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBQdXJlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQdXJlQWdncmVnYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQdXJlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24oKQorCSAqIEBzZWUgI2dldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbigpCisJICogQHNlZSAjZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25fQWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiA8ZW0+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24gPGVtPkFnZ3JlZ2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWdncmVnYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24oKQorCSAqIEBzZWUgI2dldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBCaW5hcnkgQWdncmVnYXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgQmluYXJ5IEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbigpCisJICogQHNlZSAjZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbnRlcnZhbCA8ZW0+VGFibGUgSW50ZXJ2YWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgSW50ZXJ2YWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUludGVydmFsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZUludGVydmFsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckludGVydmFsIDxlbT5UYWJsZSBOdW1iZXIgSW50ZXJ2YWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVOdW1iZXJJbnRlcnZhbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckludGVydmFsI2dldE51bWJlckludGVydmFsVmFsdWUgPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0VGFibGVOdW1iZXJJbnRlcnZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVyUmFuZ2UgPGVtPk51bWJlciBSYW5nZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk51bWJlciBSYW5nZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVyUmFuZ2UoKQorCSAqIEBzZWUgI2dldFRhYmxlTnVtYmVySW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFRhYmxlTnVtYmVySW50ZXJ2YWxfTnVtYmVyUmFuZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsIDxlbT5UYWJsZSBEYXRlIERheSBJbnRlcnZhbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBEYXRlIERheSBJbnRlcnZhbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbCNnZXREYXRlSW50ZXJ2YWxWYWx1ZSA8ZW0+RGF0ZSBJbnRlcnZhbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbCNnZXREYXRlSW50ZXJ2YWxWYWx1ZSgpCisJICogQHNlZSAjZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRhYmxlRGF0ZURheUludGVydmFsX0RhdGVJbnRlcnZhbFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsI2dldERhdGVSYW5nZSA8ZW0+RGF0ZSBSYW5nZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRhdGUgUmFuZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbCNnZXREYXRlUmFuZ2UoKQorCSAqIEBzZWUgI2dldFRhYmxlRGF0ZURheUludGVydmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbF9EYXRlUmFuZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTG9va3VwIDxlbT5UYWJsZSBMb29rdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgTG9va3VwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVMb29rdXAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlTG9va3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cCA8ZW0+VGFibGUgTnVtYmVyIExvb2t1cDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBOdW1iZXIgTG9va3VwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlTnVtYmVyTG9va3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb29rdXAgVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cCNnZXRMb29rdXBWYWx1ZSgpCisJICogQHNlZSAjZ2V0VGFibGVOdW1iZXJMb29rdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRhYmxlTnVtYmVyTG9va3VwX0xvb2t1cFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwI2dldERpc2NyZXRlIDxlbT5EaXNjcmV0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRpc2NyZXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXAjZ2V0RGlzY3JldGUoKQorCSAqIEBzZWUgI2dldFRhYmxlTnVtYmVyTG9va3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUYWJsZU51bWJlckxvb2t1cF9EaXNjcmV0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAgPGVtPlRhYmxlIFN0cmluZyBMb29rdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgU3RyaW5nIExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZVN0cmluZ0xvb2t1cCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVN0cmluZ0xvb2t1cCNnZXRMb29rdXBWYWx1ZSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9va3VwIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAjZ2V0TG9va3VwVmFsdWUoKQorCSAqIEBzZWUgI2dldFRhYmxlU3RyaW5nTG9va3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZVN0cmluZ0xvb2t1cF9Mb29rdXBWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVN0cmluZ0xvb2t1cCNnZXREaXNjcmV0ZSA8ZW0+RGlzY3JldGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EaXNjcmV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwI2dldERpc2NyZXRlKCkKKwkgKiBAc2VlICNnZXRUYWJsZVN0cmluZ0xvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVTdHJpbmdMb29rdXBfRGlzY3JldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cCA8ZW0+VGFibGUgRGF0ZSBEYXkgTG9va3VwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhYmxlIERhdGUgRGF5IExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVEYXRlRGF5TG9va3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cCNnZXRMb29rdXBWYWx1ZSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9va3VwIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5TG9va3VwI2dldExvb2t1cFZhbHVlKCkKKwkgKiBAc2VlICNnZXRUYWJsZURhdGVEYXlMb29rdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRhYmxlRGF0ZURheUxvb2t1cF9Mb29rdXBWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXAjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGlzY3JldGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXAjZ2V0RGlzY3JldGUoKQorCSAqIEBzZWUgI2dldFRhYmxlRGF0ZURheUxvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVEYXRlRGF5TG9va3VwX0Rpc2NyZXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVJhbmdlRWxlbWVudCA8ZW0+VGFibGUgUmFuZ2UgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBSYW5nZSBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlUmFuZ2VFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvciA8ZW0+VGFibGUgVGV4dCBDb2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBUZXh0IENvbG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUZXh0Q29sb3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFRhYmxlVGV4dENvbG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVGV4dENvbG9yI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNvbG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUZXh0Q29sb3IjZ2V0Q29sb3IoKQorCSAqIEBzZWUgI2dldFRhYmxlVGV4dENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUYWJsZVRleHRDb2xvcl9Db2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVDZWxsQ29sb3IgPGVtPlRhYmxlIENlbGwgQ29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFibGUgQ2VsbCBDb2xvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQ2VsbENvbG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZUNlbGxDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUNlbGxDb2xvciNnZXRDb2xvciA8ZW0+Q29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Db2xvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQ2VsbENvbG9yI2dldENvbG9yKCkKKwkgKiBAc2VlICNnZXRUYWJsZUNlbGxDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0VGFibGVDZWxsQ29sb3JfQ29sb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSWNvbiA8ZW0+VGFibGUgSWNvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBJY29uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZUljb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uI2dldEljb24gPGVtPkljb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JY29uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uI2dldEljb24oKQorCSAqIEBzZWUgI2dldFRhYmxlSWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVJY29uX0ljb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVHJlbmQgPGVtPlRhYmxlIFRyZW5kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhYmxlIFRyZW5kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUcmVuZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0VGFibGVUcmVuZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kI2dldEljb24gPGVtPkljb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JY29uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUcmVuZCNnZXRJY29uKCkKKwkgKiBAc2VlICNnZXRUYWJsZVRyZW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUYWJsZVRyZW5kX0ljb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVG9vbHRpcCA8ZW0+VGFibGUgVG9vbHRpcDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYWJsZSBUb29sdGlwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUb29sdGlwCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUYWJsZVRvb2x0aXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUb29sdGlwI2dldFRvb2x0aXAgPGVtPlRvb2x0aXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub29sdGlwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUb29sdGlwI2dldFRvb2x0aXAoKQorCSAqIEBzZWUgI2dldFRhYmxlVG9vbHRpcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGFibGVUb29sdGlwX1Rvb2x0aXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWQgPGVtPkdyaWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JpZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEdyaWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3cgPGVtPkdyaWQgUm93PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyaWQgUm93PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0R3JpZFJvdygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3cjZ2V0Q2VsbHMgPGVtPkNlbGxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DZWxsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3cjZ2V0Q2VsbHMoKQorCSAqIEBzZWUgI2dldEdyaWRSb3coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEdyaWRSb3dfQ2VsbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsIDxlbT5HcmlkIENlbGw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JpZCBDZWxsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEdyaWRDZWxsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsI2dldENvbHVtbnNwYW4gPGVtPkNvbHVtbnNwYW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2x1bW5zcGFuPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGwjZ2V0Q29sdW1uc3BhbigpCisJICogQHNlZSAjZ2V0R3JpZENlbGwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEdyaWRDZWxsX0NvbHVtbnNwYW4oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW0gPGVtPlVuaXQgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlVuaXQgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFVuaXRFbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bSA8ZW0+UGFnZSBTaXplIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QYWdlIFNpemUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRQYWdlU2l6ZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuT3JpZW50YXRpb25FbnVtIDxlbT5PcmllbnRhdGlvbiBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+T3JpZW50YXRpb24gRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk9yaWVudGF0aW9uRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRPcmllbnRhdGlvbkVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bSA8ZW0+Rm9udCBTdHlsZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Rm9udCBTdHlsZSBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRGb250U3R5bGVFbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bSA8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHkgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5IEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtIDxlbT5Cb3JkZXIgVHlwZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Qm9yZGVyIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldEJvcmRlclR5cGVFbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW0gPGVtPlRleHQgQWxpZ24gRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRleHQgQWxpZ24gRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VGV4dEFsaWduRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gPGVtPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0gPGVtPkN1cnJlbmN5IEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5IEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIDxlbT5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGF0ZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXRDYXRlZ29yeUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0RGF0ZUZvcm1hdENhdGVnb3J5RW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+VGltZSBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtIDxlbT5BdXRvIFRleHQgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkF1dG8gVGV4dCBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldEF1dG9UZXh0RW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtIDxlbT5JbWFnZSBTaXplIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5JbWFnZSBTaXplIEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldEltYWdlU2l6ZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtIDxlbT5JbWFnZSBTb3VyY2UgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkltYWdlIFNvdXJjZSBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldEltYWdlU291cmNlRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlRW51bSA8ZW0+UHVyZSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5QdXJlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSA8ZW0+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIDxlbT5CaW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QmluYXJ5IEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0QmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gPGVtPk11bHRpcGxlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk11bHRpcGxlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bSA8ZW0+VHJlbmQgSWNvbiBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VHJlbmQgSWNvbiBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRUcmVuZEljb25FbnVtKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlbmRlcmluZ0VudW0gPGVtPlJlbmRlcmluZyBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVuZGVyaW5nIEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFJlbmRlcmluZ0VudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IDxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXBvcnREU0xGYWN0b3J5IGdldFJlcG9ydERTTEZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0TW9kZWxJbXBsIDxlbT5SZXBvcnQgTW9kZWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydE1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0TW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVQT1JUX01PREVMID0gZUlOU1RBTkNFLmdldFJlcG9ydE1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QY2tnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVBPUlRfTU9ERUxfX1BDS0cgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0TW9kZWxfUGNrZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIDxlbT5SZXBvcnQgTGF6eSBSZXNvbHZlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0TGF6eVJlc29sdmVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFUE9SVF9MQVpZX1JFU09MVkVSID0gZUlOU1RBTkNFLmdldFJlcG9ydExhenlSZXNvbHZlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RVJlc29sdmUgUHJveHk8L2I+PC9lbT4nIG9wZXJhdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVPcGVyYXRpb24gUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gZUlOU1RBTkNFLmdldFJlcG9ydExhenlSZXNvbHZlcl9fRVJlc29sdmVQcm94eV9fSW50ZXJuYWxFT2JqZWN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydEJhc2VJbXBsIDxlbT5SZXBvcnQgQmFzZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0QmFzZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFJlcG9ydEJhc2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVQT1JUX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0QmFzZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFUE9SVF9CQVNFX19OQU1FID0gZUlOU1RBTkNFLmdldFJlcG9ydEJhc2VfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCA8ZW0+UmVwb3J0IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydFBhY2thZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnRQYWNrYWdlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFUE9SVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcG9ydCBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX1BBQ0tBR0VfX0lNUE9SVF9TRUNUSU9OID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2VfSW1wb3J0U2VjdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgQ3NzIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2VfRXh0ZXJuYWxDc3NVUkkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUkVQT1JUX1BBQ0tBR0VfX0VYVEVSTkFMX0NTU19VUklfQlVORExFID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2VfRXh0ZXJuYWxDc3NVUklCdW5kbGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZ2V0ZW1wbGF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVBPUlRfUEFDS0FHRV9fUEFHRVRFTVBMQVRFUyA9IGVJTlNUQU5DRS5nZXRSZXBvcnRQYWNrYWdlX1BhZ2V0ZW1wbGF0ZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVBPUlRfUEFDS0FHRV9fRk9STUFUVEVSUyA9IGVJTlNUQU5DRS5nZXRSZXBvcnRQYWNrYWdlX0Zvcm1hdHRlcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFUE9SVF9QQUNLQUdFX19DT0xPUlMgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0UGFja2FnZV9Db2xvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX1BBQ0tBR0VfX0ZPTlRTID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2VfRm9udHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lZGlhczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFUE9SVF9QQUNLQUdFX19NRURJQVMgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0UGFja2FnZV9NZWRpYXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0eWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFUE9SVF9QQUNLQUdFX19TVFlMRVMgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0UGFja2FnZV9TdHlsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFUE9SVF9QQUNLQUdFX19SRVBPUlRTID0gZUlOU1RBTkNFLmdldFJlcG9ydFBhY2thZ2VfUmVwb3J0cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVzSW1wbCA8ZW0+UGFnZSBUZW1wbGF0ZXM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZXNJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRQYWdlVGVtcGxhdGVzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBBR0VfVEVNUExBVEVTID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZ2V0ZW1wbGF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBBR0VfVEVNUExBVEVTX19QQUdFVEVNUExBVEVTID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZXNfUGFnZXRlbXBsYXRlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0c0ltcGwgPGVtPlNvbWUgRm9ybWF0czwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUZvcm1hdHNJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRTb21lRm9ybWF0cygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTT01FX0ZPUk1BVFMgPSBlSU5TVEFOQ0UuZ2V0U29tZUZvcm1hdHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNPTUVfRk9STUFUU19fRk9STUFUVEVSUyA9IGVJTlNUQU5DRS5nZXRTb21lRm9ybWF0c19Gb3JtYXR0ZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9yc0ltcGwgPGVtPkNvbG9yczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JzSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0Q29sb3JzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPTE9SUyA9IGVJTlNUQU5DRS5nZXRDb2xvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09MT1JTX19DT0xPUlMgPSBlSU5TVEFOQ0UuZ2V0Q29sb3JzX0NvbG9ycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Gb250c0ltcGwgPGVtPkZvbnRzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Gb250c0ltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnRzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEZPTlRTID0gZUlOU1RBTkNFLmdldEZvbnRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gb250czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRk9OVFNfX0ZPTlRTID0gZUlOU1RBTkNFLmdldEZvbnRzX0ZvbnRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLk1lZGlhc0ltcGwgPGVtPk1lZGlhczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFzSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0TWVkaWFzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1FRElBUyA9IGVJTlNUQU5DRS5nZXRNZWRpYXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lZGlhczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTUVESUFTX19NRURJQVMgPSBlSU5TVEFOQ0UuZ2V0TWVkaWFzX01lZGlhcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZXNJbXBsIDxlbT5TdHlsZXM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlc0ltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFN0eWxlcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVFlMRVMgPSBlSU5TVEFOQ0UuZ2V0U3R5bGVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdHlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNUWUxFU19fU1RZTEVTID0gZUlOU1RBTkNFLmdldFN0eWxlc19TdHlsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UGFnZVRlbXBsYXRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFBBR0VfVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0UGFnZVRlbXBsYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFHRV9URU1QTEFURV9fU0laRSA9IGVJTlNUQU5DRS5nZXRQYWdlVGVtcGxhdGVfU2l6ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JpZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX1RFTVBMQVRFX19PUklFTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRQYWdlVGVtcGxhdGVfT3JpZW50YXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvcCBNYXJnaW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1ZBTFVFID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZV9Ub3BNYXJnaW5WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9wIE1hcmdpbiBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFHRV9URU1QTEFURV9fVE9QX01BUkdJTl9VTklUID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZV9Ub3BNYXJnaW5Vbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MZWZ0IE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1ZBTFVFID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZV9MZWZ0TWFyZ2luVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxlZnQgTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX1RFTVBMQVRFX19MRUZUX01BUkdJTl9VTklUID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZV9MZWZ0TWFyZ2luVW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Qm90dG9tIE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBR0VfVEVNUExBVEVfX0JPVFRPTV9NQVJHSU5fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Cb3R0b20gTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblVuaXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBR0VfVEVNUExBVEVfX1JJR0hUX01BUkdJTl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYWdlVGVtcGxhdGVfUmlnaHRNYXJnaW5WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlnaHQgTWFyZ2luIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVU5JVCA9IGVJTlNUQU5DRS5nZXRQYWdlVGVtcGxhdGVfUmlnaHRNYXJnaW5Vbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBQQUdFX1RFTVBMQVRFX19IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0UGFnZVRlbXBsYXRlX0hlYWRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUEFHRV9URU1QTEFURV9fRk9PVEVSID0gZUlOU1RBTkNFLmdldFBhZ2VUZW1wbGF0ZV9Gb290ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JJbXBsIDxlbT5Db2xvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRDb2xvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDT0xPUiA9IGVJTlNUQU5DRS5nZXRDb2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT0xPUl9fQ09MT1IgPSBlSU5TVEFOQ0UuZ2V0Q29sb3JfQ29sb3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2Vjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTE9SX19CQVNFQ09MT1IgPSBlSU5TVEFOQ0UuZ2V0Q29sb3JfQmFzZWNvbG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXJrZW5zYnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT0xPUl9fREFSS0VOU0JZID0gZUlOU1RBTkNFLmdldENvbG9yX0RhcmtlbnNieSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlnaHRlbnNieTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTE9SX19MSUdIVEVOU0JZID0gZUlOU1RBTkNFLmdldENvbG9yX0xpZ2h0ZW5zYnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybXNieTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTE9SX19UUkFOU0ZPUk1TQlkgPSBlSU5TVEFOQ0UuZ2V0Q29sb3JfVHJhbnNmb3Jtc2J5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXRjb2xvcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTE9SX19UQVJHRVRDT0xPUiA9IGVJTlNUQU5DRS5nZXRDb2xvcl9UYXJnZXRjb2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Gb250SW1wbCA8ZW0+Rm9udDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRm9udEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRk9OVCA9IGVJTlNUQU5DRS5nZXRGb250KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRk9OVF9fRVhURU5EUyA9IGVJTlNUQU5DRS5nZXRGb250X0V4dGVuZHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZhbWlseTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEZPTlRfX0ZBTUlMWSA9IGVJTlNUQU5DRS5nZXRGb250X0ZhbWlseSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBGT05UX19TVFlMRSA9IGVJTlNUQU5DRS5nZXRGb250X1N0eWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Cb2xkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRk9OVF9fQk9MRCA9IGVJTlNUQU5DRS5nZXRGb250X0JvbGQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemV2YWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEZPTlRfX1NJWkVWQUxVRSA9IGVJTlNUQU5DRS5nZXRGb250X1NpemV2YWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZXVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBGT05UX19TSVpFVU5JVCA9IGVJTlNUQU5DRS5nZXRGb250X1NpemV1bml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250RmFtaWx5IDxlbT5Gb250IEZhbWlseTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRGYW1pbHkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEZvbnRGYW1pbHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgRk9OVF9GQU1JTFkgPSBlSU5TVEFOQ0UuZ2V0Rm9udEZhbWlseSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CdWlsZEluRm9udEZhbWlseUltcGwgPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CdWlsZEluRm9udEZhbWlseUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEJ1aWxkSW5Gb250RmFtaWx5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEJVSUxEX0lOX0ZPTlRfRkFNSUxZID0gZUlOU1RBTkNFLmdldEJ1aWxkSW5Gb250RmFtaWx5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCVUlMRF9JTl9GT05UX0ZBTUlMWV9fQ1VTVE9NID0gZUlOU1RBTkNFLmdldEJ1aWxkSW5Gb250RmFtaWx5X0N1c3RvbSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXN0b21Gb250RmFtaWx5SW1wbCA8ZW0+Q3VzdG9tIEZvbnQgRmFtaWx5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXN0b21Gb250RmFtaWx5SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0Q3VzdG9tRm9udEZhbWlseSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDVVNUT01fRk9OVF9GQU1JTFkgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tRm9udEZhbWlseSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT00gPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tRm9udEZhbWlseV9DdXN0b20oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFJbXBsIDxlbT5NZWRpYTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRNZWRpYSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNRURJQSA9IGVJTlNUQU5DRS5nZXRNZWRpYSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Cb3JkZXJTdHlsZUltcGwgPGVtPkJvcmRlciBTdHlsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQm9yZGVyU3R5bGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRCb3JkZXJTdHlsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBCT1JERVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0Qm9yZGVyU3R5bGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCT1JERVJfU1RZTEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Qm9yZGVyU3R5bGVfVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGh2YWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEJPUkRFUl9TVFlMRV9fV0lEVEhWQUxVRSA9IGVJTlNUQU5DRS5nZXRCb3JkZXJTdHlsZV9XaWR0aHZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XaWR0aHVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCT1JERVJfU1RZTEVfX1dJRFRIVU5JVCA9IGVJTlNUQU5DRS5nZXRCb3JkZXJTdHlsZV9XaWR0aHVuaXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQk9SREVSX1NUWUxFX19DT0xPUiA9IGVJTlNUQU5DRS5nZXRCb3JkZXJTdHlsZV9Db2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsIDxlbT5CYXNlIFN0eWxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRCYXNlU3R5bGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQkFTRV9TVFlMRSA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEJBU0VfU1RZTEVfX0ZPUk1BVCA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfRm9ybWF0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Gb250PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQkFTRV9TVFlMRV9fRk9OVCA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfRm9udCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZGNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQkFTRV9TVFlMRV9fQkFDS0dST1VORENPTE9SID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9CYWNrZ3JvdW5kY29sb3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBCQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1JfQUxURVJOQVRFID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9CYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXh0Y29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBCQVNFX1NUWUxFX19URVhUQ09MT1IgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX1RleHRjb2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGV4dGFsaWduPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fVEVYVEFMSUdOID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9UZXh0YWxpZ24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBUb3A8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBCQVNFX1NUWUxFX19CT1JERVJfVE9QID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9Cb3JkZXJUb3AoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBCb3R0b208L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBCQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9Cb3JkZXJCb3R0b20oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBMZWZ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQkFTRV9TVFlMRV9fQk9SREVSX0xFRlQgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX0JvcmRlckxlZnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvcmRlciBSaWdodDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVCA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfQm9yZGVyUmlnaHQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgVG9wIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX1BhZGRpbmdUb3BWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX1BhZGRpbmdUb3BVbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9VTklUID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBMZWZ0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nTGVmdFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWRkaW5nIExlZnQgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nTGVmdFVuaXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1ZBTFVFID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nUmlnaHRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFkZGluZyBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9QYWRkaW5nUmlnaHRVbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gVG9wIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfTWFyZ2luVG9wVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBUb3AgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVU5JVCA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfTWFyZ2luVG9wVW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIExlZnQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gTGVmdCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVCA9IGVJTlNUQU5DRS5nZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFVuaXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBCb3R0b20gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9NYXJnaW5Cb3R0b21WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFyZ2luIEJvdHRvbSBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fTUFSR0lOX0JPVFRPTV9VTklUID0gZUlOU1RBTkNFLmdldEJhc2VTdHlsZV9NYXJnaW5Cb3R0b21Vbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXJnaW4gUmlnaHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBCQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX01hcmdpblJpZ2h0VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcmdpbiBSaWdodCBVbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0QmFzZVN0eWxlX01hcmdpblJpZ2h0VW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5NZWRpYVN0eWxlSW1wbCA8ZW0+TWVkaWEgU3R5bGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLk1lZGlhU3R5bGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRNZWRpYVN0eWxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1FRElBX1NUWUxFID0gZUlOU1RBTkNFLmdldE1lZGlhU3R5bGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lZGlhPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTUVESUFfU1RZTEVfX01FRElBID0gZUlOU1RBTkNFLmdldE1lZGlhU3R5bGVfTWVkaWEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsIDxlbT5TdHlsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRTdHlsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTVFlMRSA9IGVJTlNUQU5DRS5nZXRTdHlsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNUWUxFX19FWFRFTkRTID0gZUlOU1RBTkNFLmdldFN0eWxlX0V4dGVuZHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lZGlhc3R5bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTVFlMRV9fTUVESUFTVFlMRVMgPSBlSU5TVEFOQ0UuZ2V0U3R5bGVfTWVkaWFzdHlsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUZvcm1hdEltcGwgPGVtPlNvbWUgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0U29tZUZvcm1hdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTT01FX0ZPUk1BVCA9IGVJTlNUQU5DRS5nZXRTb21lRm9ybWF0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VaSBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0U29tZUZvcm1hdF9VaV9wYXR0ZXJuKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQgcGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRTb21lRm9ybWF0X1JlcG9ydF9wYXR0ZXJuKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXh0YWxpZ248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTT01FX0ZPUk1BVF9fVEVYVEFMSUdOID0gZUlOU1RBTkNFLmdldFNvbWVGb3JtYXRfVGV4dGFsaWduKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlVvbW9Gb3JtYXRJbXBsIDxlbT5Vb21vIEZvcm1hdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVW9tb0Zvcm1hdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFVvbW9Gb3JtYXQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVU9NT19GT1JNQVQgPSBlSU5TVEFOQ0UuZ2V0VW9tb0Zvcm1hdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5OdW1iZXJGb3JtYXRJbXBsIDxlbT5OdW1iZXIgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5OdW1iZXJGb3JtYXRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXROdW1iZXJGb3JtYXQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTlVNQkVSX0ZPUk1BVCA9IGVJTlNUQU5DRS5nZXROdW1iZXJGb3JtYXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE5VTUJFUl9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXROdW1iZXJGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkN1cnJlbmN5Rm9ybWF0SW1wbCA8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXJyZW5jeUZvcm1hdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEN1cnJlbmN5Rm9ybWF0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENVUlJFTkNZX0ZPUk1BVCA9IGVJTlNUQU5DRS5nZXRDdXJyZW5jeUZvcm1hdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IGNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ1VSUkVOQ1lfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q3VycmVuY3lGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGVGb3JtYXRJbXBsIDxlbT5EYXRlIEZvcm1hdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0ZUZvcm1hdEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGVGb3JtYXQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREFURV9GT1JNQVQgPSBlSU5TVEFOQ0UuZ2V0RGF0ZUZvcm1hdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IGNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFURV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXREYXRlRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRlVGltZUZvcm1hdEltcGwgPGVtPkRhdGUgVGltZSBGb3JtYXQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGVUaW1lRm9ybWF0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RGF0ZVRpbWVGb3JtYXQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREFURV9USU1FX0ZPUk1BVCA9IGVJTlNUQU5DRS5nZXREYXRlVGltZUZvcm1hdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0IGNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFURV9USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldERhdGVUaW1lRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UaW1lRm9ybWF0SW1wbCA8ZW0+VGltZSBGb3JtYXQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRpbWVGb3JtYXRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUaW1lRm9ybWF0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRJTUVfRk9STUFUID0gZUlOU1RBTkNFLmdldFRpbWVGb3JtYXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0VGltZUZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVQT1JUID0gZUlOU1RBTkNFLmdldFJlcG9ydCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVBPUlRfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlcG9ydF9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVBPUlRfX0RFU0NSSVBUSU9OX1ZBTFVFID0gZUlOU1RBTkNFLmdldFJlcG9ydF9EZXNjcmlwdGlvblZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhbWFydCBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVBPUlRfX0RBVEFNQVJUX1JFRiA9IGVJTlNUQU5DRS5nZXRSZXBvcnRfRGF0YW1hcnRSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlbmRlcmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFUE9SVF9fUkVOREVSSU5HID0gZUlOU1RBTkNFLmdldFJlcG9ydF9SZW5kZXJpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVBPUlRfX0VYVEVSTkFMX0NTU19VUkkgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEUgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJQnVuZGxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWdlIFRlbXBsYXRlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX19QQUdFX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFJlcG9ydF9QYWdlVGVtcGxhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lZGlhPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX19NRURJQSA9IGVJTlNUQU5DRS5nZXRSZXBvcnRfTWVkaWEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2xiYXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVBPUlRfX1RPT0xCQVIgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0X1Rvb2xiYXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2lnbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFUE9SVF9fREVTSUdOID0gZUlOU1RBTkNFLmdldFJlcG9ydF9EZXNpZ24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbiA8ZW0+UmVwb3J0IERlc2lnbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0RGVzaWduKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFUE9SVF9ERVNJR04gPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0RGVzaWduKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnbkZpbGVJbXBsIDxlbT5SZXBvcnQgRGVzaWduIEZpbGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnbkZpbGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRSZXBvcnREZXNpZ25GaWxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFUE9SVF9ERVNJR05fRklMRSA9IGVJTlNUQU5DRS5nZXRSZXBvcnREZXNpZ25GaWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUkVQT1JUX0RFU0lHTl9GSUxFX19OQU1FID0gZUlOU1RBTkNFLmdldFJlcG9ydERlc2lnbkZpbGVfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREZXNpZ25UZW1wbGF0ZUltcGwgPGVtPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnblRlbXBsYXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVQT1JUX0RFU0lHTl9URU1QTEFURSA9IGVJTlNUQU5DRS5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVBPUlRfREVTSUdOX1RFTVBMQVRFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fSEVBREVSID0gZUlOU1RBTkNFLmdldFJlcG9ydERlc2lnblRlbXBsYXRlX0hlYWRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVUQUlMID0gZUlOU1RBTkNFLmdldFJlcG9ydERlc2lnblRlbXBsYXRlX0RldGFpbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSID0gZUlOU1RBTkNFLmdldFJlcG9ydERlc2lnblRlbXBsYXRlX0Zvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db250YWluZXJJbXBsIDxlbT5Db250YWluZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbnRhaW5lckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldENvbnRhaW5lcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09OVEFJTkVSX19FTEVNRU5UUyA9IGVJTlNUQU5DRS5nZXRDb250YWluZXJfRWxlbWVudHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUhlYWRlckltcGwgPGVtPlBhZ2UgSGVhZGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlSGVhZGVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UGFnZUhlYWRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQQUdFX0hFQURFUiA9IGVJTlNUQU5DRS5nZXRQYWdlSGVhZGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaG93IE9uIEZpcnN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFHRV9IRUFERVJfX1NIT1dfT05fRklSU1QgPSBlSU5TVEFOQ0UuZ2V0UGFnZUhlYWRlcl9TaG93T25GaXJzdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFHRV9IRUFERVJfX0hFSUdIVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRQYWdlSGVhZGVyX0hlaWdodFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQgVW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBR0VfSEVBREVSX19IRUlHSFRfVU5JVCA9IGVJTlNUQU5DRS5nZXRQYWdlSGVhZGVyX0hlaWdodFVuaXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZURldGFpbEltcGwgPGVtPlBhZ2UgRGV0YWlsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlRGV0YWlsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UGFnZURldGFpbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBQQUdFX0RFVEFJTCA9IGVJTlNUQU5DRS5nZXRQYWdlRGV0YWlsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VGb290ZXJJbXBsIDxlbT5QYWdlIEZvb3RlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUZvb3RlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFBhZ2VGb290ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUEFHRV9GT09URVIgPSBlSU5TVEFOQ0UuZ2V0UGFnZUZvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hvdyBPbiBMYXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUEFHRV9GT09URVJfX1NIT1dfT05fTEFTVCA9IGVJTlNUQU5DRS5nZXRQYWdlRm9vdGVyX1Nob3dPbkxhc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlaWdodCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBBR0VfRk9PVEVSX19IRUlHSFRfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UGFnZUZvb3Rlcl9IZWlnaHRWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0IFVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBQQUdFX0ZPT1RFUl9fSEVJR0hUX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0UGFnZUZvb3Rlcl9IZWlnaHRVbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRWxlbWVudAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aFN0eWxlSW1wbCA8ZW0+V2l0aCBTdHlsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aFN0eWxlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0V2l0aFN0eWxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFdJVEhfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0V2l0aFN0eWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdJVEhfU1RZTEVfX1NUWUxFID0gZUlOU1RBTkNFLmdldFdpdGhTdHlsZV9TdHlsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UZXh0RWxlbWVudEltcGwgPGVtPlRleHQgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGV4dEVsZW1lbnRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVhUX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBURVhUX0VMRU1FTlRfX1RFWFQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnRfVGV4dCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UaXRsZUltcGwgPGVtPlRpdGxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UaXRsZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRpdGxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRJVExFID0gZUlOU1RBTkNFLmdldFRpdGxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN1YlRpdGxlSW1wbCA8ZW0+U3ViIFRpdGxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdWJUaXRsZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFN1YlRpdGxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNVQl9USVRMRSA9IGVJTlNUQU5DRS5nZXRTdWJUaXRsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdWJTdWJUaXRsZUltcGwgPGVtPlN1YiBTdWIgVGl0bGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN1YlN1YlRpdGxlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0U3ViU3ViVGl0bGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1VCX1NVQl9USVRMRSA9IGVJTlNUQU5DRS5nZXRTdWJTdWJUaXRsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5MYWJlbEltcGwgPGVtPkxhYmVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5MYWJlbEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldExhYmVsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIExBQkVMID0gZUlOU1RBTkNFLmdldExhYmVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRleHRJbXBsIDxlbT5UZXh0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UZXh0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGV4dCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBURVhUID0gZUlOU1RBTkNFLmdldFRleHQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQXV0b1RleHRJbXBsIDxlbT5BdXRvIFRleHQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkF1dG9UZXh0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0QXV0b1RleHQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQVVUT19URVhUID0gZUlOU1RBTkNFLmdldEF1dG9UZXh0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQVVUT19URVhUX19UWVBFID0gZUlOU1RBTkNFLmdldEF1dG9UZXh0X1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuSW1hZ2VJbXBsIDxlbT5JbWFnZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuSW1hZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRJbWFnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBJTUFHRSA9IGVJTlNUQU5DRS5nZXRJbWFnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElNQUdFX19TSVpFID0gZUlOU1RBTkNFLmdldEltYWdlX1NpemUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgSU1BR0VfX1NDQUxFID0gZUlOU1RBTkNFLmdldEltYWdlX1NjYWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElNQUdFX19TT1VSQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9Tb3VyY2VUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlbmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElNQUdFX19GSUxFTkFNRSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9GaWxlbmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5XaXRoSGVhZGVyRm9vdGVySW1wbCA8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5XaXRoSGVhZGVyRm9vdGVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0V2l0aEhlYWRlckZvb3RlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBXSVRIX0hFQURFUl9GT09URVIgPSBlSU5TVEFOQ0UuZ2V0V2l0aEhlYWRlckZvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGV0YWlsaGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVIgPSBlSU5TVEFOQ0UuZ2V0V2l0aEhlYWRlckZvb3Rlcl9EZXRhaWxoZWFkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcnN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRSA9IGVJTlNUQU5DRS5nZXRXaXRoSGVhZGVyRm9vdGVyX0hlYWRlcnN0eWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXRhaWxmb290ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBXSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEZPT1RFUiA9IGVJTlNUQU5DRS5nZXRXaXRoSGVhZGVyRm9vdGVyX0RldGFpbGZvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Rm9vdGVyc3R5bGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXSVRIX0hFQURFUl9GT09URVJfX0ZPT1RFUlNUWUxFID0gZUlOU1RBTkNFLmdldFdpdGhIZWFkZXJGb290ZXJfRm9vdGVyc3R5bGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RGF0YW1hcnRUYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBTUFSVF9UQUJMRSA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFNQVJUX1RBQkxFX19HUk9VUFMgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZV9Hcm91cHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRldGFpbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFNQVJUX1RBQkxFX19ERVRBSUwgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZV9EZXRhaWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwSW1wbCA8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldERhdGFtYXJ0VGFibGVHcm91cCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBTUFSVF9UQUJMRV9HUk9VUCA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlR3JvdXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwaW5nIFJlZjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFNQVJUX1RBQkxFX0dST1VQX19HUk9VUElOR19SRUYgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwX0dyb3VwaW5nUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBEQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSID0gZUlOU1RBTkNFLmdldERhdGFtYXJ0VGFibGVHcm91cF9IZWFkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvb3RlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVIgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwX0Zvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lR3JpZEltcGwgPGVtPlNvbWUgR3JpZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUdyaWRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRTb21lR3JpZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBTT01FX0dSSUQgPSBlSU5TVEFOQ0UuZ2V0U29tZUdyaWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvd3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNPTUVfR1JJRF9fUk9XUyA9IGVJTlNUQU5DRS5nZXRTb21lR3JpZF9Sb3dzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlckltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUiA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVySW1wbCA8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXAgRm9vdGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSID0gZUlOU1RBTkNFLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlRGV0YWlsSW1wbCA8ZW0+RGF0YW1hcnQgVGFibGUgRGV0YWlsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlRGV0YWlsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RGF0YW1hcnRUYWJsZURldGFpbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBTUFSVF9UQUJMRV9ERVRBSUwgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZURldGFpbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIEZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlMgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZURldGFpbF9Db2x1bW5Gb3JtYXR0ZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eUltcGwgPGVtPkRhdGFtYXJ0IFRhYmxlIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlUHJvcGVydHlJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fQ09MVU1OID0gZUlOU1RBTkNFLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9Db2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVydmFsczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lOVEVSVkFMUyA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSW50ZXJ2YWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IaWRlIExhYmVsIEludGVydmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hJREVfTEFCRUxfSU5URVJWQUwgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0hpZGVMYWJlbEludGVydmFsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fTE9PS1VQUyA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlfTG9va3VwcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGlkZSBMYWJlbCBMb29rdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9MT09LVVAgPSBlSU5TVEFOQ0UuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0hpZGVMYWJlbExvb2t1cCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIEltYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hBU19JTUFHRSA9IGVJTlNUQU5DRS5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGFzSW1hZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFID0gZUlOU1RBTkNFLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9JbWFnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUZvcm1hdHRlckltcGwgPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVGb3JtYXR0ZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUZvcm1hdHRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUQUJMRV9GT1JNQVRURVIgPSBlSU5TVEFOQ0UuZ2V0VGFibGVGb3JtYXR0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUID0gZUlOU1RBTkNFLmdldFRhYmxlRm9ybWF0dGVyX0Zvcm1hdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUltYWdlSW1wbCA8ZW0+VGFibGUgSW1hZ2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlSW1hZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUltYWdlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRBQkxFX0lNQUdFID0gZUlOU1RBTkNFLmdldFRhYmxlSW1hZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltYWdlIFBhdGggUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0VGFibGVJbWFnZV9JbWFnZVBhdGhQYXR0ZXJuKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IaWRlIEltYWdlIExhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEFCTEVfSU1BR0VfX0hJREVfSU1BR0VfTEFCRUwgPSBlSU5TVEFOQ0UuZ2V0VGFibGVJbWFnZV9IaWRlSW1hZ2VMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIFBhcmFtZXRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX0lNQUdFX19IQVNfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFRhYmxlSW1hZ2VfSGFzUGFyYW1ldGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9JTUFHRV9fUkVTSVpFID0gZUlOU1RBTkNFLmdldFRhYmxlSW1hZ2VfUmVzaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNpemUgU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEFCTEVfSU1BR0VfX1JFU0laRV9TVFJJTkcgPSBlSU5TVEFOQ0UuZ2V0VGFibGVJbWFnZV9SZXNpemVTdHJpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltYWdlIFBhdGggUGFyYW1ldGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVEFCTEVfSU1BR0VfX0lNQUdFX1BBVEhfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFRhYmxlSW1hZ2VfSW1hZ2VQYXRoUGFyYW1ldGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudCA8ZW0+VGFibGUgVmFsdWUgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVmFsdWVFbGVtZW50CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVZhbHVlRWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUQUJMRV9WQUxVRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFRhYmxlVmFsdWVFbGVtZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlUHJvcGVydHlJbXBsIDxlbT5UYWJsZSBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVQcm9wZXJ0eUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlUHJvcGVydHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0VGFibGVQcm9wZXJ0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVEFCTEVfUFJPUEVSVFlfX1ZBTFVFX1JFRiA9IGVJTlNUQU5DRS5nZXRUYWJsZVByb3BlcnR5X1ZhbHVlUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQWdncmVnYXRpb25JbXBsIDxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVBZ2dyZWdhdGlvbkltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlQWdncmVnYXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfQUdHUkVHQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFibGVBZ2dyZWdhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX0FHR1JFR0FUSU9OX19URVhUID0gZUlOU1RBTkNFLmdldFRhYmxlQWdncmVnYXRpb25fVGV4dCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFibGVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T24gR3JvdXA8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9BR0dSRUdBVElPTl9fT05fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0VGFibGVBZ2dyZWdhdGlvbl9Pbkdyb3VwKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbCA8ZW0+VGFibGUgQmFzZSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVCYXNlQWdncmVnYXRpb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUQUJMRV9CQVNFX0FHR1JFR0FUSU9OID0gZUlOU1RBTkNFLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBSZWZzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9CQVNFX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTID0gZUlOU1RBTkNFLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uX1ZhbHVlUmVmcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbkltcGwgPGVtPlRhYmxlIFB1cmUgQWdncmVnYXRpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVQdXJlQWdncmVnYXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfUFVSRV9BR0dSRUdBVElPTiA9IGVJTlNUQU5DRS5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9QVVJFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiA9IGVJTlNUQU5DRS5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsIDxlbT5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVVbmFyeUFnZ3JlZ2F0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OID0gZUlOU1RBTkNFLmdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9VTkFSWV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwgPGVtPlRhYmxlIE11bHRpcGxlIEFnZ3JlZ2F0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiA9IGVJTlNUQU5DRS5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25fQWdncmVnYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkltcGwgPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlQmluYXJ5QWdncmVnYXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OID0gZUlOU1RBTkNFLmdldFRhYmxlQmluYXJ5QWdncmVnYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiA9IGVJTlNUQU5DRS5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUludGVydmFsIDxlbT5UYWJsZSBJbnRlcnZhbDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlSW50ZXJ2YWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfSU5URVJWQUwgPSBlSU5TVEFOQ0UuZ2V0VGFibGVJbnRlcnZhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckludGVydmFsSW1wbCA8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckludGVydmFsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVOdW1iZXJJbnRlcnZhbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUQUJMRV9OVU1CRVJfSU5URVJWQUwgPSBlSU5TVEFOQ0UuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyIEludGVydmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW1iZXIgUmFuZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSA9IGVJTlNUQU5DRS5nZXRUYWJsZU51bWJlckludGVydmFsX051bWJlclJhbmdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRGF0ZURheUludGVydmFsSW1wbCA8ZW0+VGFibGUgRGF0ZSBEYXkgSW50ZXJ2YWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRGF0ZURheUludGVydmFsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfREFURV9EQVlfSU5URVJWQUwgPSBlSU5TVEFOQ0UuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9JTlRFUlZBTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUYWJsZURhdGVEYXlJbnRlcnZhbF9EYXRlSW50ZXJ2YWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0ZSBSYW5nZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFID0gZUlOU1RBTkNFLmdldFRhYmxlRGF0ZURheUludGVydmFsX0RhdGVSYW5nZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVMb29rdXAgPGVtPlRhYmxlIExvb2t1cDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTG9va3VwCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUxvb2t1cCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBUQUJMRV9MT09LVVAgPSBlSU5TVEFOQ0UuZ2V0VGFibGVMb29rdXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVOdW1iZXJMb29rdXBJbXBsIDxlbT5UYWJsZSBOdW1iZXIgTG9va3VwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckxvb2t1cEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlTnVtYmVyTG9va3VwKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRBQkxFX05VTUJFUl9MT09LVVAgPSBlSU5TVEFOQ0UuZ2V0VGFibGVOdW1iZXJMb29rdXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX05VTUJFUl9MT09LVVBfX0xPT0tVUF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRUYWJsZU51bWJlckxvb2t1cF9Mb29rdXBWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JldGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURSA9IGVJTlNUQU5DRS5nZXRUYWJsZU51bWJlckxvb2t1cF9EaXNjcmV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVN0cmluZ0xvb2t1cEltcGwgPGVtPlRhYmxlIFN0cmluZyBMb29rdXA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlU3RyaW5nTG9va3VwSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVTdHJpbmdMb29rdXAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfU1RSSU5HX0xPT0tVUCA9IGVJTlNUQU5DRS5nZXRUYWJsZVN0cmluZ0xvb2t1cCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFID0gZUlOU1RBTkNFLmdldFRhYmxlU3RyaW5nTG9va3VwX0xvb2t1cFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFID0gZUlOU1RBTkNFLmdldFRhYmxlU3RyaW5nTG9va3VwX0Rpc2NyZXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRGF0ZURheUxvb2t1cEltcGwgPGVtPlRhYmxlIERhdGUgRGF5IExvb2t1cDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVEYXRlRGF5TG9va3VwSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVEYXRlRGF5TG9va3VwKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRBQkxFX0RBVEVfREFZX0xPT0tVUCA9IGVJTlNUQU5DRS5nZXRUYWJsZURhdGVEYXlMb29rdXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX0RBVEVfREFZX0xPT0tVUF9fTE9PS1VQX1ZBTFVFID0gZUlOU1RBTkNFLmdldFRhYmxlRGF0ZURheUxvb2t1cF9Mb29rdXBWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JldGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFID0gZUlOU1RBTkNFLmdldFRhYmxlRGF0ZURheUxvb2t1cF9EaXNjcmV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQgPGVtPlRhYmxlIFJhbmdlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVJhbmdlRWxlbWVudAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVSYW5nZUVsZW1lbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfUkFOR0VfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRUYWJsZVJhbmdlRWxlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRleHRDb2xvckltcGwgPGVtPlRhYmxlIFRleHQgQ29sb3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlVGV4dENvbG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVUZXh0Q29sb3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfVEVYVF9DT0xPUiA9IGVJTlNUQU5DRS5nZXRUYWJsZVRleHRDb2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9URVhUX0NPTE9SX19DT0xPUiA9IGVJTlNUQU5DRS5nZXRUYWJsZVRleHRDb2xvcl9Db2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUNlbGxDb2xvckltcGwgPGVtPlRhYmxlIENlbGwgQ29sb3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQ2VsbENvbG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGFibGVDZWxsQ29sb3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfQ0VMTF9DT0xPUiA9IGVJTlNUQU5DRS5nZXRUYWJsZUNlbGxDb2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUQUJMRV9DRUxMX0NPTE9SX19DT0xPUiA9IGVJTlNUQU5DRS5nZXRUYWJsZUNlbGxDb2xvcl9Db2xvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUljb25JbXBsIDxlbT5UYWJsZSBJY29uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUljb25JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZUljb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfSUNPTiA9IGVJTlNUQU5DRS5nZXRUYWJsZUljb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9JQ09OX19JQ09OID0gZUlOU1RBTkNFLmdldFRhYmxlSWNvbl9JY29uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlVHJlbmRJbXBsIDxlbT5UYWJsZSBUcmVuZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVUcmVuZEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRhYmxlVHJlbmQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfVFJFTkQgPSBlSU5TVEFOQ0UuZ2V0VGFibGVUcmVuZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRBQkxFX1RSRU5EX19JQ09OID0gZUlOU1RBTkNFLmdldFRhYmxlVHJlbmRfSWNvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRvb2x0aXBJbXBsIDxlbT5UYWJsZSBUb29sdGlwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRvb2x0aXBJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRUYWJsZVRvb2x0aXAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVEFCTEVfVE9PTFRJUCA9IGVJTlNUQU5DRS5nZXRUYWJsZVRvb2x0aXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2x0aXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUQUJMRV9UT09MVElQX19UT09MVElQID0gZUlOU1RBTkNFLmdldFRhYmxlVG9vbHRpcF9Ub29sdGlwKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRJbXBsIDxlbT5HcmlkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5HcmlkSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0R3JpZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHUklEID0gZUlOU1RBTkNFLmdldEdyaWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZFJvd0ltcGwgPGVtPkdyaWQgUm93PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5HcmlkUm93SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0R3JpZFJvdygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBHUklEX1JPVyA9IGVJTlNUQU5DRS5nZXRHcmlkUm93KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DZWxsczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgR1JJRF9ST1dfX0NFTExTID0gZUlOU1RBTkNFLmdldEdyaWRSb3dfQ2VsbHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZENlbGxJbXBsIDxlbT5HcmlkIENlbGw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRDZWxsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0R3JpZENlbGwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgR1JJRF9DRUxMID0gZUlOU1RBTkNFLmdldEdyaWRDZWxsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zcGFuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgR1JJRF9DRUxMX19DT0xVTU5TUEFOID0gZUlOU1RBTkNFLmdldEdyaWRDZWxsX0NvbHVtbnNwYW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtIDxlbT5Vbml0IEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRVbml0RW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFVOSVRfRU5VTSA9IGVJTlNUQU5DRS5nZXRVbml0RW51bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVNpemVFbnVtIDxlbT5QYWdlIFNpemUgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVNpemVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRQYWdlU2l6ZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBQQUdFX1NJWkVfRU5VTSA9IGVJTlNUQU5DRS5nZXRQYWdlU2l6ZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk9yaWVudGF0aW9uRW51bSA8ZW0+T3JpZW50YXRpb24gRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuT3JpZW50YXRpb25FbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRPcmllbnRhdGlvbkVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBPUklFTlRBVElPTl9FTlVNID0gZUlOU1RBTkNFLmdldE9yaWVudGF0aW9uRW51bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udFN0eWxlRW51bSA8ZW0+Rm9udCBTdHlsZSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRGb250U3R5bGVFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gRk9OVF9TVFlMRV9FTlVNID0gZUlOU1RBTkNFLmdldEZvbnRTdHlsZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bSA8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHkgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHlFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRCdWlsZEluRm9udEZhbWlseUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBCVUlMRF9JTl9GT05UX0ZBTUlMWV9FTlVNID0gZUlOU1RBTkNFLmdldEJ1aWxkSW5Gb250RmFtaWx5RW51bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyVHlwZUVudW0gPGVtPkJvcmRlciBUeXBlIEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRCb3JkZXJUeXBlRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIEJPUkRFUl9UWVBFX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0Qm9yZGVyVHlwZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW0gPGVtPlRleHQgQWxpZ24gRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VGV4dEFsaWduRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFRFWFRfQUxJR05fRU5VTSA9IGVJTlNUQU5DRS5nZXRUZXh0QWxpZ25FbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gPGVtPk51bWJlciBGb3JtYXQgQ2F0ZWdvcnkgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBOVU1CRVJfRk9STUFUX0NBVEVHT1JZX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+Q3VycmVuY3kgRm9ybWF0IENhdGVnb3J5IEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIENVUlJFTkNZX0ZPUk1BVF9DQVRFR09SWV9FTlVNID0gZUlOU1RBTkNFLmdldEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIDxlbT5EYXRlIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXREYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gREFURV9GT1JNQVRfQ0FURUdPUllfRU5VTSA9IGVJTlNUQU5DRS5nZXREYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSA8ZW0+RGF0ZSBUaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBEQVRFX1RJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXRDYXRlZ29yeUVudW0gPGVtPlRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBUSU1FX0ZPUk1BVF9DQVRFR09SWV9FTlVNID0gZUlOU1RBTkNFLmdldFRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bSA8ZW0+QXV0byBUZXh0IEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0QXV0b1RleHRFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQVVUT19URVhUX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0QXV0b1RleHRFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtIDxlbT5JbWFnZSBTaXplIEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU2l6ZUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEltYWdlU2l6ZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBJTUFHRV9TSVpFX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0SW1hZ2VTaXplRW51bSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtIDxlbT5JbWFnZSBTb3VyY2UgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTb3VyY2VFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRJbWFnZVNvdXJjZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBJTUFHRV9TT1VSQ0VfRU5VTSA9IGVJTlNUQU5DRS5nZXRJbWFnZVNvdXJjZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIDxlbT5QdXJlIEFnZ3JlZ2F0aW9uIFR5cGUgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUFVSRV9BR0dSRUdBVElPTl9UWVBFX0VOVU0gPSBlSU5TVEFOQ0UuZ2V0UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSA8ZW0+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFVOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSA9IGVJTlNUQU5DRS5nZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gPGVtPkJpbmFyeSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBCSU5BUllfQUdHUkVHQVRJT05fVFlQRV9FTlVNID0gZUlOU1RBTkNFLmdldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSA8ZW0+TXVsdGlwbGUgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERTTFBhY2thZ2VJbXBsI2dldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIE1VTFRJUExFX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSA9IGVJTlNUQU5DRS5nZXRNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRyZW5kSWNvbkVudW0gPGVtPlRyZW5kIEljb24gRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVHJlbmRJY29uRW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0VHJlbmRJY29uRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFRSRU5EX0lDT05fRU5VTSA9IGVJTlNUQU5DRS5nZXRUcmVuZEljb25FbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtIDxlbT5SZW5kZXJpbmcgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVuZGVyaW5nRW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RFNMUGFja2FnZUltcGwjZ2V0UmVuZGVyaW5nRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFJFTkRFUklOR19FTlVNID0gZUlOU1RBTkNFLmdldFJlbmRlcmluZ0VudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREU0xQYWNrYWdlSW1wbCNnZXRJbnRlcm5hbEVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgSU5URVJOQUxfRU9CSkVDVCA9IGVJTlNUQU5DRS5nZXRJbnRlcm5hbEVPYmplY3QoKTsKKworCX0KKworfSAvL1JlcG9ydERTTFBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RGVzaWduLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERlc2lnbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOGY4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERlc2lnbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0IERlc2lnbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydERlc2lnbigpCisgKiBAbW9kZWwgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnREZXNpZ24gZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworfSAvLyBSZXBvcnREZXNpZ24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RGVzaWduRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREZXNpZ25GaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwNTVmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RGVzaWduRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0IERlc2lnbiBGaWxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnREZXNpZ25GaWxlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcG9ydERlc2lnbkZpbGUgZXh0ZW5kcyBSZXBvcnREZXNpZ24geworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydERlc2lnbkZpbGVfTmFtZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBSZXBvcnREZXNpZ25GaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERlc2lnblRlbXBsYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERlc2lnblRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0OWJjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RGVzaWduVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgRGVzaWduIFRlbXBsYXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlI2dldERldGFpbCA8ZW0+RGV0YWlsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnREZXNpZ25UZW1wbGF0ZSBleHRlbmRzIFJlcG9ydERlc2lnbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydERlc2lnblRlbXBsYXRlX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SGVhZGVyKFBhZ2VIZWFkZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydERlc2lnblRlbXBsYXRlX0hlYWRlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQYWdlSGVhZGVyIGdldEhlYWRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduVGVtcGxhdGUjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0SGVhZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRIZWFkZXIoUGFnZUhlYWRlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXRhaWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRldGFpbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXRhaWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERldGFpbChQYWdlRGV0YWlsKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXRhaWwoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUGFnZURldGFpbCBnZXREZXRhaWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlI2dldERldGFpbCA8ZW0+RGV0YWlsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXRhaWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldERldGFpbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGV0YWlsKFBhZ2VEZXRhaWwgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9vdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Gb290ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9vdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRGb290ZXIoUGFnZUZvb3RlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVfRm9vdGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVBhZ2VGb290ZXIgZ2V0Rm9vdGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZSNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9vdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvb3RlcihQYWdlRm9vdGVyIHZhbHVlKTsKKworfSAvLyBSZXBvcnREZXNpZ25UZW1wbGF0ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnRMYXp5UmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0TGF6eVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzMDZlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0TGF6eVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydCBMYXp5IFJlc29sdmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcG9ydExhenlSZXNvbHZlciBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHByb3h5RGF0YVR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkludGVybmFsRU9iamVjdCIgcHJveHlVbmlxdWU9ImZhbHNlIgorCSAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIGJvZHk9Jzwlb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlJT4gX2VSZXNvdXJjZSA9IHRoaXMuZVJlc291cmNlKCk7XG48JW9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCU+IF9yZXNvdXJjZVNldCA9IF9lUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTtcbnJldHVybiA8JW9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5hcGkuRWNvcmVVdGlsMyU+LnJlc29sdmUocHJveHksIF9yZXNvdXJjZVNldCk7JyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSk7CisKK30gLy8gUmVwb3J0TGF6eVJlc29sdmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydE1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyYjg4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0TW9kZWwuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydCBNb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbCNnZXRQY2tnIDxlbT5QY2tnPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydE1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcG9ydE1vZGVsIGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGNrZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2V9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGNrZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBja2c8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydE1vZGVsX1Bja2coKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8UmVwb3J0UGFja2FnZT4gZ2V0UGNrZygpOworCit9IC8vIFJlcG9ydE1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0UGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjRlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlhJbXBvcnRTZWN0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgUGFja2FnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEltcG9ydFNlY3Rpb24gPGVtPkltcG9ydCBTZWN0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEV4dGVybmFsQ3NzVVJJIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlIDxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRQYWdldGVtcGxhdGVzIDxlbT5QYWdldGVtcGxhdGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEZvcm1hdHRlcnMgPGVtPkZvcm1hdHRlcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Q29sb3JzIDxlbT5Db2xvcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Rm9udHMgPGVtPkZvbnRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldE1lZGlhcyA8ZW0+TWVkaWFzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldFN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0UGFja2FnZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXBvcnRQYWNrYWdlIGV4dGVuZHMgTFBhY2thZ2UgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcG9ydCBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBvcnQgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBvcnQgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SW1wb3J0U2VjdGlvbihYSW1wb3J0U2VjdGlvbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0UGFja2FnZV9JbXBvcnRTZWN0aW9uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVhJbXBvcnRTZWN0aW9uIGdldEltcG9ydFNlY3Rpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0SW1wb3J0U2VjdGlvbiA8ZW0+SW1wb3J0IFNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcG9ydCBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJbXBvcnRTZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbXBvcnRTZWN0aW9uKFhJbXBvcnRTZWN0aW9uIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIENzcyBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXh0ZXJuYWxDc3NVUkkoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRQYWNrYWdlX0V4dGVybmFsQ3NzVVJJKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEV4dGVybmFsQ3NzVVJJKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEV4dGVybmFsQ3NzVVJJIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RXh0ZXJuYWxDc3NVUkkoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRQYWNrYWdlX0V4dGVybmFsQ3NzVVJJQnVuZGxlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlIDxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFeHRlcm5hbENzc1VSSUJ1bmRsZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFnZXRlbXBsYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFnZXRlbXBsYXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYWdldGVtcGxhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQYWdldGVtcGxhdGVzKFBhZ2VUZW1wbGF0ZXMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydFBhY2thZ2VfUGFnZXRlbXBsYXRlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQYWdlVGVtcGxhdGVzIGdldFBhZ2V0ZW1wbGF0ZXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0UGFnZXRlbXBsYXRlcyA8ZW0+UGFnZXRlbXBsYXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFnZXRlbXBsYXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UGFnZXRlbXBsYXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGFnZXRlbXBsYXRlcyhQYWdlVGVtcGxhdGVzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvcm1hdHRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybWF0dGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Rm9ybWF0dGVycyhTb21lRm9ybWF0cykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0UGFja2FnZV9Gb3JtYXR0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVNvbWVGb3JtYXRzIGdldEZvcm1hdHRlcnMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Rm9ybWF0dGVycyA8ZW0+Rm9ybWF0dGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybWF0dGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Rm9ybWF0dGVycygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Rm9ybWF0dGVycyhTb21lRm9ybWF0cyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2xvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbG9ycyhDb2xvcnMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydFBhY2thZ2VfQ29sb3JzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9ycyBnZXRDb2xvcnMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Q29sb3JzIDxlbT5Db2xvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29sb3JzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb2xvcnMoQ29sb3JzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Gb250czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb250czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Rm9udHMoRm9udHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFJlcG9ydFBhY2thZ2VfRm9udHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRm9udHMgZ2V0Rm9udHMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2UjZ2V0Rm9udHMgPGVtPkZvbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb250czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Rm9udHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvbnRzKEZvbnRzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lZGlhczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVkaWFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lZGlhczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWVkaWFzKE1lZGlhcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0UmVwb3J0UGFja2FnZV9NZWRpYXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWVkaWFzIGdldE1lZGlhcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZSNnZXRNZWRpYXMgPGVtPk1lZGlhczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVkaWFzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRNZWRpYXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1lZGlhcyhNZWRpYXMgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3R5bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHlsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdHlsZXMoU3R5bGVzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRQYWNrYWdlX1N0eWxlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZXMgZ2V0U3R5bGVzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlI2dldFN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFN0eWxlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3R5bGVzKFN0eWxlcyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRSZXBvcnRQYWNrYWdlX1JlcG9ydHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8UmVwb3J0PiBnZXRSZXBvcnRzKCk7CisKK30gLy8gUmVwb3J0UGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1NvbWVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVlYTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lRm9ybWF0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U29tZSBGb3JtYXQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRVaV9wYXR0ZXJuIDxlbT5VaSBwYXR0ZXJuPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0I2dldFJlcG9ydF9wYXR0ZXJuIDxlbT5SZXBvcnQgcGF0dGVybjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRUZXh0YWxpZ24gPGVtPlRleHRhbGlnbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTb21lRm9ybWF0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNvbWVGb3JtYXQgZXh0ZW5kcyBSZXBvcnRCYXNlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VaSBwYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VaSBwYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVpIHBhdHRlcm48L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFVpX3BhdHRlcm4oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTb21lRm9ybWF0X1VpX3BhdHRlcm4oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VWlfcGF0dGVybigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRVaV9wYXR0ZXJuIDxlbT5VaSBwYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VaSBwYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRVaV9wYXR0ZXJuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRVaV9wYXR0ZXJuKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQgcGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0IHBhdHRlcm48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0IHBhdHRlcm48L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlcG9ydF9wYXR0ZXJuKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0U29tZUZvcm1hdF9SZXBvcnRfcGF0dGVybigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRSZXBvcnRfcGF0dGVybigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdCNnZXRSZXBvcnRfcGF0dGVybiA8ZW0+UmVwb3J0IHBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBwYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZXBvcnRfcGF0dGVybigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVwb3J0X3BhdHRlcm4oU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRleHRhbGlnbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGV4dGFsaWduPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHRhbGlnbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0QWxpZ25FbnVtCisJICogQHNlZSAjc2V0VGV4dGFsaWduKFRleHRBbGlnbkVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFNvbWVGb3JtYXRfVGV4dGFsaWduKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGV4dEFsaWduRW51bSBnZXRUZXh0YWxpZ24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQjZ2V0VGV4dGFsaWduIDxlbT5UZXh0YWxpZ248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRleHRhbGlnbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0QWxpZ25FbnVtCisJICogQHNlZSAjZ2V0VGV4dGFsaWduKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUZXh0YWxpZ24oVGV4dEFsaWduRW51bSB2YWx1ZSk7CisKK30gLy8gU29tZUZvcm1hdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lRm9ybWF0cy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lRm9ybWF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTVlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1NvbWVGb3JtYXRzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U29tZSBGb3JtYXRzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXRzI2dldEZvcm1hdHRlcnMgPGVtPkZvcm1hdHRlcnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0U29tZUZvcm1hdHMoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU29tZUZvcm1hdHMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvcm1hdHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZvcm1hdHRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtYXR0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTb21lRm9ybWF0c19Gb3JtYXR0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFNvbWVGb3JtYXQ+IGdldEZvcm1hdHRlcnMoKTsKKworfSAvLyBTb21lRm9ybWF0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lR3JpZC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Tb21lR3JpZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGYyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1NvbWVHcmlkLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U29tZSBHcmlkPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVHcmlkI2dldFJvd3MgPGVtPlJvd3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0U29tZUdyaWQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU29tZUdyaWQgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvd3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvd3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3dzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTb21lR3JpZF9Sb3dzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PEdyaWRSb3c+IGdldFJvd3MoKTsKKworfSAvLyBTb21lR3JpZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9TdHlsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9TdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGM2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1N0eWxlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUjZ2V0RXh0ZW5kcyA8ZW0+RXh0ZW5kczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUjZ2V0TWVkaWFzdHlsZXMgPGVtPk1lZGlhc3R5bGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFN0eWxlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0eWxlIGV4dGVuZHMgUmVwb3J0QmFzZSwgQmFzZVN0eWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlbmRzPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZHM8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEV4dGVuZHMoU3R5bGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFN0eWxlX0V4dGVuZHMoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZSBnZXRFeHRlbmRzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZSNnZXRFeHRlbmRzIDxlbT5FeHRlbmRzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFeHRlbmRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFeHRlbmRzKFN0eWxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lZGlhc3R5bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZWRpYXN0eWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lZGlhc3R5bGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTdHlsZV9NZWRpYXN0eWxlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxNZWRpYVN0eWxlPiBnZXRNZWRpYXN0eWxlcygpOworCit9IC8vIFN0eWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1N0eWxlcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9TdHlsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRhOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9TdHlsZXMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHlsZXM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzI2dldFN0eWxlcyA8ZW0+U3R5bGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFN0eWxlcygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBTdHlsZXMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0eWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0eWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0eWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0U3R5bGVzX1N0eWxlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxTdHlsZT4gZ2V0U3R5bGVzKCk7CisKK30gLy8gU3R5bGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1N1YlN1YlRpdGxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1N1YlN1YlRpdGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0YmUwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvU3ViU3ViVGl0bGUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN1YiBTdWIgVGl0bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRTdWJTdWJUaXRsZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBTdWJTdWJUaXRsZSBleHRlbmRzIFRleHRFbGVtZW50IHsKK30gLy8gU3ViU3ViVGl0bGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvU3ViVGl0bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvU3ViVGl0bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhkYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9TdWJUaXRsZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3ViIFRpdGxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0U3ViVGl0bGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3ViVGl0bGUgZXh0ZW5kcyBUZXh0RWxlbWVudCB7Cit9IC8vIFN1YlRpdGxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQWdncmVnYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVBZ2dyZWdhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTllNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQWdncmVnYXRpb24uamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBBZ2dyZWdhdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uI2dldFRleHQgPGVtPlRleHQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24gPGVtPkFnZ3JlZ2F0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uI2dldE9uR3JvdXAgPGVtPk9uIEdyb3VwPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlQWdncmVnYXRpb24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVBZ2dyZWdhdGlvbiBleHRlbmRzIFRhYmxlVmFsdWVFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRleHQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUFnZ3JlZ2F0aW9uX1RleHQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VGV4dCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbiNnZXRUZXh0IDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFnZ3JlZ2F0aW9uKFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVRhYmxlQmFzZUFnZ3JlZ2F0aW9uIGdldEFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBZ2dyZWdhdGlvbihUYWJsZUJhc2VBZ2dyZWdhdGlvbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PbiBHcm91cDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T24gR3JvdXA8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T24gR3JvdXA8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9uR3JvdXAoRGF0YW1hcnRUYWJsZUdyb3VwKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUFnZ3JlZ2F0aW9uX09uR3JvdXAoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhbWFydFRhYmxlR3JvdXAgZ2V0T25Hcm91cCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbiNnZXRPbkdyb3VwIDxlbT5PbiBHcm91cDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T24gR3JvdXA8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9uR3JvdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9uR3JvdXAoRGF0YW1hcnRUYWJsZUdyb3VwIHZhbHVlKTsKKworfSAvLyBUYWJsZUFnZ3JlZ2F0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlYjkyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVCYXNlQWdncmVnYXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmFzZUFnZ3JlZ2F0aW9uI2dldFZhbHVlUmVmcyA8ZW0+VmFsdWUgUmVmczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZUJhc2VBZ2dyZWdhdGlvbiBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUmVmczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBSZWZzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUmVmczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVCYXNlQWdncmVnYXRpb25fVmFsdWVSZWZzKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4gZ2V0VmFsdWVSZWZzKCk7CisKK30gLy8gVGFibGVCYXNlQWdncmVnYXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVCaW5hcnlBZ2dyZWdhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmMjJhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVCaW5hcnlBZ2dyZWdhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgQmluYXJ5IEFnZ3JlZ2F0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmluYXJ5QWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24gPGVtPkFnZ3JlZ2F0aW9uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlQmluYXJ5QWdncmVnYXRpb24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiBleHRlbmRzIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bQorCSAqIEBzZWUgI3NldEFnZ3JlZ2F0aW9uKEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlQmluYXJ5QWdncmVnYXRpb25fQWdncmVnYXRpb24oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIGdldEFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bQorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBZ2dyZWdhdGlvbihCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHZhbHVlKTsKKworfSAvLyBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQ2VsbENvbG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlQ2VsbENvbG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhZGE5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVDZWxsQ29sb3IuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIENlbGwgQ29sb3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVDZWxsQ29sb3IjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlQ2VsbENvbG9yKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ2VsbENvbG9yIGV4dGVuZHMgVGFibGVSYW5nZUVsZW1lbnQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbG9yPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2xvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2xvcjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29sb3IoQ29sb3IpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlQ2VsbENvbG9yX0NvbG9yKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29sb3IgZ2V0Q29sb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQ2VsbENvbG9yI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb2xvcihDb2xvciB2YWx1ZSk7CisKK30gLy8gVGFibGVDZWxsQ29sb3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVEYXRlRGF5SW50ZXJ2YWwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVEYXRlRGF5SW50ZXJ2YWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ0ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZURhdGVEYXlJbnRlcnZhbC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgRGF0ZSBEYXkgSW50ZXJ2YWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5SW50ZXJ2YWwjZ2V0RGF0ZUludGVydmFsVmFsdWUgPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsI2dldERhdGVSYW5nZSA8ZW0+RGF0ZSBSYW5nZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZURhdGVEYXlJbnRlcnZhbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZURhdGVEYXlJbnRlcnZhbCBleHRlbmRzIFRhYmxlSW50ZXJ2YWwgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0ZSBJbnRlcnZhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGF0ZUludGVydmFsVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZURhdGVEYXlJbnRlcnZhbF9EYXRlSW50ZXJ2YWxWYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWRvdWJsZSBnZXREYXRlSW50ZXJ2YWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5SW50ZXJ2YWwjZ2V0RGF0ZUludGVydmFsVmFsdWUgPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERhdGVJbnRlcnZhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREYXRlSW50ZXJ2YWxWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0ZSBSYW5nZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0ZSBSYW5nZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRlIFJhbmdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREYXRlUmFuZ2UoVGFibGVSYW5nZUVsZW1lbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlRGF0ZURheUludGVydmFsX0RhdGVSYW5nZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVJhbmdlRWxlbWVudCBnZXREYXRlUmFuZ2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsI2dldERhdGVSYW5nZSA8ZW0+RGF0ZSBSYW5nZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0ZSBSYW5nZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGF0ZVJhbmdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREYXRlUmFuZ2UoVGFibGVSYW5nZUVsZW1lbnQgdmFsdWUpOworCit9IC8vIFRhYmxlRGF0ZURheUludGVydmFsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlRGF0ZURheUxvb2t1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZURhdGVEYXlMb29rdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRhMGJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZURhdGVEYXlMb29rdXAuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIERhdGUgRGF5IExvb2t1cDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXAjZ2V0TG9va3VwVmFsdWUgPGVtPkxvb2t1cCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5TG9va3VwI2dldERpc2NyZXRlIDxlbT5EaXNjcmV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZURhdGVEYXlMb29rdXAoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVEYXRlRGF5TG9va3VwIGV4dGVuZHMgVGFibGVMb29rdXAgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9va3VwIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9va3VwVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZURhdGVEYXlMb29rdXBfTG9va3VwVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TG9va3VwVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cCNnZXRMb29rdXBWYWx1ZSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvb2t1cFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb29rdXBWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY3JldGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NyZXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyZXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREaXNjcmV0ZShUYWJsZVJhbmdlRWxlbWVudCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVEYXRlRGF5TG9va3VwX0Rpc2NyZXRlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVRhYmxlUmFuZ2VFbGVtZW50IGdldERpc2NyZXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXAjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGlzY3JldGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50IHZhbHVlKTsKKworfSAvLyBUYWJsZURhdGVEYXlMb29rdXAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNiMDAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgRm9ybWF0dGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRm9ybWF0dGVyI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlRm9ybWF0dGVyKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlRm9ybWF0dGVyIGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Gb3JtYXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGb3JtYXQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUZvcm1hdHRlcl9Gb3JtYXQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Rm9ybWF0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUZvcm1hdHRlciNnZXRGb3JtYXQgPGVtPkZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZvcm1hdChTdHJpbmcgdmFsdWUpOworCit9IC8vIFRhYmxlRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlSWNvbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUljb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDEwMmZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUljb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIEljb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uI2dldEljb24gPGVtPkljb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVJY29uKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlSWNvbiBleHRlbmRzIFRhYmxlUmFuZ2VFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEljb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZUljb25fSWNvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJY29uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb24jZ2V0SWNvbiA8ZW0+SWNvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWNvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFRhYmxlSWNvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUltYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlSW1hZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUltYWdlLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgSW1hZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNnZXRJbWFnZVBhdGhQYXR0ZXJuIDxlbT5JbWFnZSBQYXRoIFBhdHRlcm48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UjaXNIaWRlSW1hZ2VMYWJlbCA8ZW0+SGlkZSBJbWFnZSBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc0hhc1BhcmFtZXRlciA8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc1Jlc2l6ZSA8ZW0+UmVzaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldFJlc2l6ZVN0cmluZyA8ZW0+UmVzaXplIFN0cmluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNnZXRJbWFnZVBhdGhQYXJhbWV0ZXIgPGVtPkltYWdlIFBhdGggUGFyYW1ldGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlSW1hZ2UoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVJbWFnZSBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1hZ2UgUGF0aCBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbWFnZSBQYXRoIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1hZ2UgUGF0aCBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbWFnZVBhdGhQYXR0ZXJuKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVJbWFnZV9JbWFnZVBhdGhQYXR0ZXJuKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEltYWdlUGF0aFBhdHRlcm4oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2UjZ2V0SW1hZ2VQYXRoUGF0dGVybiA8ZW0+SW1hZ2UgUGF0aCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbWFnZSBQYXRoIFBhdHRlcm48L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEltYWdlUGF0aFBhdHRlcm4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEltYWdlUGF0aFBhdHRlcm4oU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpZGUgSW1hZ2UgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhpZGUgSW1hZ2UgTGFiZWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBJbWFnZSBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SGlkZUltYWdlTGFiZWwoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVJbWFnZV9IaWRlSW1hZ2VMYWJlbCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNIaWRlSW1hZ2VMYWJlbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc0hpZGVJbWFnZUxhYmVsIDxlbT5IaWRlIEltYWdlIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEltYWdlIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0hpZGVJbWFnZUxhYmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRIaWRlSW1hZ2VMYWJlbChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhcyBQYXJhbWV0ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SGFzUGFyYW1ldGVyKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlSW1hZ2VfSGFzUGFyYW1ldGVyKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0hhc1BhcmFtZXRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc0hhc1BhcmFtZXRlciA8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNIYXNQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhhc1BhcmFtZXRlcihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmVzaXplKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlSW1hZ2VfUmVzaXplKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1Jlc2l6ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNpc1Jlc2l6ZSA8ZW0+UmVzaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzUmVzaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZXNpemUoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNpemUgU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNpemUgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc2l6ZSBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlc2l6ZVN0cmluZyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlSW1hZ2VfUmVzaXplU3RyaW5nKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFJlc2l6ZVN0cmluZygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSNnZXRSZXNpemVTdHJpbmcgPGVtPlJlc2l6ZSBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc2l6ZSBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJlc2l6ZVN0cmluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVzaXplU3RyaW5nKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbWFnZSBQYXRoIFBhcmFtZXRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1hZ2UgUGF0aCBQYXJhbWV0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1hZ2UgUGF0aCBQYXJhbWV0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEltYWdlUGF0aFBhcmFtZXRlcihUYWJsZVZhbHVlRWxlbWVudCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVJbWFnZV9JbWFnZVBhdGhQYXJhbWV0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGFibGVWYWx1ZUVsZW1lbnQgZ2V0SW1hZ2VQYXRoUGFyYW1ldGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlI2dldEltYWdlUGF0aFBhcmFtZXRlciA8ZW0+SW1hZ2UgUGF0aCBQYXJhbWV0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltYWdlIFBhdGggUGFyYW1ldGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJbWFnZVBhdGhQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEltYWdlUGF0aFBhcmFtZXRlcihUYWJsZVZhbHVlRWxlbWVudCB2YWx1ZSk7CisKK30gLy8gVGFibGVJbWFnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUludGVydmFsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlSW50ZXJ2YWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JkYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUludGVydmFsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBJbnRlcnZhbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlSW50ZXJ2YWwoKQorICogQG1vZGVsIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVJbnRlcnZhbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7Cit9IC8vIFRhYmxlSW50ZXJ2YWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVMb29rdXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVMb29rdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjBiZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZUxvb2t1cC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgTG9va3VwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVMb29rdXAoKQorICogQG1vZGVsIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVMb29rdXAgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworfSAvLyBUYWJsZUxvb2t1cApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZU11bHRpcGxlQWdncmVnYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzOWFiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBNdWx0aXBsZSBBZ2dyZWdhdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb24jZ2V0QWdncmVnYXRpb24gPGVtPkFnZ3JlZ2F0aW9uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZU11bHRpcGxlQWdncmVnYXRpb24gZXh0ZW5kcyBUYWJsZUJhc2VBZ2dyZWdhdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSAjc2V0QWdncmVnYXRpb24oTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25fQWdncmVnYXRpb24oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0QWdncmVnYXRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bQorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBZ2dyZWdhdGlvbihNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gdmFsdWUpOworCit9IC8vIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZU51bWJlckludGVydmFsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlTnVtYmVySW50ZXJ2YWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjVlMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZU51bWJlckludGVydmFsLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBOdW1iZXIgSW50ZXJ2YWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJJbnRlcnZhbFZhbHVlIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVyUmFuZ2UgPGVtPk51bWJlciBSYW5nZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZU51bWJlckludGVydmFsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlTnVtYmVySW50ZXJ2YWwgZXh0ZW5kcyBUYWJsZUludGVydmFsIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE51bWJlckludGVydmFsVmFsdWUoZG91YmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZU51bWJlckludGVydmFsX051bWJlckludGVydmFsVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJJbnRlcnZhbFZhbHVlIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TnVtYmVySW50ZXJ2YWxWYWx1ZShkb3VibGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVtYmVyIFJhbmdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdW1iZXIgUmFuZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyIFJhbmdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXROdW1iZXJSYW5nZShUYWJsZVJhbmdlRWxlbWVudCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJSYW5nZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVJhbmdlRWxlbWVudCBnZXROdW1iZXJSYW5nZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJSYW5nZSA8ZW0+TnVtYmVyIFJhbmdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXIgUmFuZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE51bWJlclJhbmdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROdW1iZXJSYW5nZShUYWJsZVJhbmdlRWxlbWVudCB2YWx1ZSk7CisKK30gLy8gVGFibGVOdW1iZXJJbnRlcnZhbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZU51bWJlckxvb2t1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZU51bWJlckxvb2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlTnVtYmVyTG9va3VwLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBOdW1iZXIgTG9va3VwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwI2dldERpc2NyZXRlIDxlbT5EaXNjcmV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZU51bWJlckxvb2t1cCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZU51bWJlckxvb2t1cCBleHRlbmRzIFRhYmxlTG9va3VwIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb29rdXAgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvb2t1cCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvb2t1cFZhbHVlKGRvdWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVOdW1iZXJMb29rdXBfTG9va3VwVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlkb3VibGUgZ2V0TG9va3VwVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TG9va3VwVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvb2t1cFZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjcmV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY3JldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZU51bWJlckxvb2t1cF9EaXNjcmV0ZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVJhbmdlRWxlbWVudCBnZXREaXNjcmV0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXAjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGlzY3JldGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50IHZhbHVlKTsKKworfSAvLyBUYWJsZU51bWJlckxvb2t1cApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVByb3BlcnR5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY3YjgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgUHJvcGVydHk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eSNnZXRWYWx1ZVJlZiA8ZW0+VmFsdWUgUmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlUHJvcGVydHkoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVQcm9wZXJ0eSBleHRlbmRzIFRhYmxlVmFsdWVFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBSZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFZhbHVlUmVmKERhdGFtYXJ0UHJvcGVydHkpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlUHJvcGVydHlfVmFsdWVSZWYoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEYXRhbWFydFByb3BlcnR5IGdldFZhbHVlUmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5I2dldFZhbHVlUmVmIDxlbT5WYWx1ZSBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VmFsdWVSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbHVlUmVmKERhdGFtYXJ0UHJvcGVydHkgdmFsdWUpOworCit9IC8vIFRhYmxlUHJvcGVydHkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVQdXJlQWdncmVnYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVQdXJlQWdncmVnYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGMxMjhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVB1cmVBZ2dyZWdhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVQdXJlQWdncmVnYXRpb24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVQdXJlQWdncmVnYXRpb24gZXh0ZW5kcyBUYWJsZUJhc2VBZ2dyZWdhdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWdncmVnYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZ2dyZWdhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QdXJlQWdncmVnYXRpb25UeXBlRW51bQorCSAqIEBzZWUgI3NldEFnZ3JlZ2F0aW9uKFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIGdldEFnZ3JlZ2F0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFnZ3JlZ2F0aW9uKFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIHZhbHVlKTsKKworfSAvLyBUYWJsZVB1cmVBZ2dyZWdhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVJhbmdlRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVJhbmdlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODRlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlUmFuZ2VFbGVtZW50LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBSYW5nZSBFbGVtZW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVSYW5nZUVsZW1lbnQoKQorICogQG1vZGVsIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVSYW5nZUVsZW1lbnQgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworfSAvLyBUYWJsZVJhbmdlRWxlbWVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVN0cmluZ0xvb2t1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVN0cmluZ0xvb2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjU0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlU3RyaW5nTG9va3VwLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBTdHJpbmcgTG9va3VwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwI2dldERpc2NyZXRlIDxlbT5EaXNjcmV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVN0cmluZ0xvb2t1cCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZVN0cmluZ0xvb2t1cCBleHRlbmRzIFRhYmxlTG9va3VwIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb29rdXAgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvb2t1cCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvb2t1cFZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVTdHJpbmdMb29rdXBfTG9va3VwVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TG9va3VwVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TG9va3VwVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvb2t1cFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjcmV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY3JldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JldGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVN0cmluZ0xvb2t1cF9EaXNjcmV0ZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUYWJsZVJhbmdlRWxlbWVudCBnZXREaXNjcmV0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGlzY3JldGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50IHZhbHVlKTsKKworfSAvLyBUYWJsZVN0cmluZ0xvb2t1cApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRleHRDb2xvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRleHRDb2xvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTA3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVGV4dENvbG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBUZXh0IENvbG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVGV4dENvbG9yI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVRleHRDb2xvcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZVRleHRDb2xvciBleHRlbmRzIFRhYmxlUmFuZ2VFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xvcjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sb3I8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbG9yKENvbG9yKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVRleHRDb2xvcl9Db2xvcigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbG9yIGdldENvbG9yKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvciNnZXRDb2xvciA8ZW0+Q29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbG9yPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29sb3IoQ29sb3IgdmFsdWUpOworCit9IC8vIFRhYmxlVGV4dENvbG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVG9vbHRpcC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRvb2x0aXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhjYTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRvb2x0aXAuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFRvb2x0aXA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVUb29sdGlwI2dldFRvb2x0aXAgPGVtPlRvb2x0aXA8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVUb29sdGlwKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlVG9vbHRpcCBleHRlbmRzIFRhYmxlUmFuZ2VFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sdGlwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sdGlwPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2x0aXA8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRvb2x0aXAoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVRvb2x0aXBfVG9vbHRpcCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRUb29sdGlwKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRvb2x0aXAjZ2V0VG9vbHRpcCA8ZW0+VG9vbHRpcDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbHRpcDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VG9vbHRpcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VG9vbHRpcChTdHJpbmcgdmFsdWUpOworCit9IC8vIFRhYmxlVG9vbHRpcApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRyZW5kLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVHJlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJhOGIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVRyZW5kLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBUcmVuZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kI2dldEljb24gPGVtPkljb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVUcmVuZCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZVRyZW5kIGV4dGVuZHMgVGFibGVSYW5nZUVsZW1lbnQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtCisJICogQHNlZSAjc2V0SWNvbihUcmVuZEljb25FbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVRyZW5kX0ljb24oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUcmVuZEljb25FbnVtIGdldEljb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVHJlbmQjZ2V0SWNvbiA8ZW0+SWNvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UcmVuZEljb25FbnVtCisJICogQHNlZSAjZ2V0SWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWNvbihUcmVuZEljb25FbnVtIHZhbHVlKTsKKworfSAvLyBUYWJsZVRyZW5kCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVW5hcnlBZ2dyZWdhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVVuYXJ5QWdncmVnYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdiZWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UYWJsZVVuYXJ5QWdncmVnYXRpb24uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFVuYXJ5IEFnZ3JlZ2F0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbiNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbiBleHRlbmRzIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZ2dyZWdhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkgKiBAc2VlICNzZXRBZ2dyZWdhdGlvbihVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSBnZXRBZ2dyZWdhdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVVbmFyeUFnZ3JlZ2F0aW9uI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFnZ3JlZ2F0aW9uKFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSB2YWx1ZSk7CisKK30gLy8gVGFibGVVbmFyeUFnZ3JlZ2F0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVmFsdWVFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RhYmxlVmFsdWVFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmVmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGFibGVWYWx1ZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFZhbHVlIEVsZW1lbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUYWJsZVZhbHVlRWxlbWVudCgpCisgKiBAbW9kZWwgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZVZhbHVlRWxlbWVudCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7Cit9IC8vIFRhYmxlVmFsdWVFbGVtZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWNjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUZXh0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRleHQgZXh0ZW5kcyBUZXh0RWxlbWVudCB7Cit9IC8vIFRleHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGV4dEFsaWduLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRBbGlnbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjg3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRBbGlnbi5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRleHQgQWxpZ248L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUZXh0QWxpZ24oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFRleHRBbGlnbiBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5VTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTlVMTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5VTEwoMCwgIk5VTEwiLCAiIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5MRUZUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0xFRlRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMRUZUKDAsICJMRUZUIiwgImxlZnQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNFTlRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDRU5URVJfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDRU5URVIoMCwgIkNFTlRFUiIsICJjZW50ZXIiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJJR0hUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JJR0hUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUklHSFQoMCwgIlJJR0hUIiwgInJpZ2h0Iik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OVUxMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OVUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05VTEwKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TEVGVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TEVGVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMRUZUCisJICogQG1vZGVsIGxpdGVyYWw9ImxlZnQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DRU5URVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNFTlRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDRU5URVIKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY2VudGVyIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SSUdIVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UklHSFQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUklHSFQKKwkgKiBAbW9kZWwgbGl0ZXJhbD0icmlnaHQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRleHQgQWxpZ248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRleHRBbGlnbltdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBUZXh0QWxpZ25bXSB7CisJCQlOVUxMLAorCQkJTEVGVCwKKwkJCUNFTlRFUiwKKwkJCVJJR0hULAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRleHQgQWxpZ248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUZXh0QWxpZ24+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VGV4dCBBbGlnbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRleHRBbGlnbiBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRleHRBbGlnbiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRleHQgQWxpZ248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0QWxpZ24gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUZXh0QWxpZ24gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRleHQgQWxpZ248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0QWxpZ24gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIE5VTExfVkFMVUU6IHJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUZXh0QWxpZ24oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vVGV4dEFsaWduCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRBbGlnbkVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGV4dEFsaWduRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWNjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRBbGlnbkVudW0uamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRleHQgQWxpZ24gRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRleHRBbGlnbkVudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFRleHRBbGlnbkVudW0gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OVUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05VTExfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOVUxMKDAsICJOVUxMIiwgIiIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TEVGVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMRUZUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTEVGVCgwLCAiTEVGVCIsICJsZWZ0IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DRU5URVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0VOVEVSX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ0VOVEVSKDAsICJDRU5URVIiLCAiY2VudGVyIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SSUdIVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSSUdIVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJJR0hUKDAsICJSSUdIVCIsICJyaWdodCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOVUxMCisJICogQG1vZGVsIGxpdGVyYWw9IiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxFRlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxFRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTEVGVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJsZWZ0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q0VOVEVSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DRU5URVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0VOVEVSCisJICogQG1vZGVsIGxpdGVyYWw9ImNlbnRlciIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UklHSFQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJJR0hUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JJR0hUCisJICogQG1vZGVsIGxpdGVyYWw9InJpZ2h0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UZXh0IEFsaWduIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRleHRBbGlnbkVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgVGV4dEFsaWduRW51bVtdIHsKKwkJCU5VTEwsCisJCQlMRUZULAorCQkJQ0VOVEVSLAorCQkJUklHSFQsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VGV4dCBBbGlnbiBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VGV4dEFsaWduRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UZXh0IEFsaWduIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0QWxpZ25FbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVGV4dEFsaWduRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRleHQgQWxpZ24gRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRleHRBbGlnbkVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUZXh0QWxpZ25FbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UZXh0IEFsaWduIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUZXh0QWxpZ25FbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBOVUxMX1ZBTFVFOiByZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVGV4dEFsaWduRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9UZXh0QWxpZ25FbnVtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RleHRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0NDlmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGV4dEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRleHQgRWxlbWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRleHRFbGVtZW50KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRleHRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCwgV2l0aFN0eWxlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRleHQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUZXh0RWxlbWVudF9UZXh0KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFRleHQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRFbGVtZW50I2dldFRleHQgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRleHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBUZXh0RWxlbWVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UaW1lRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RpbWVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE0NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UaW1lRm9ybWF0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lIEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0I2dldFJlcG9ydF9jYXRlZ29yeSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRpbWVGb3JtYXQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGltZUZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydCBjYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXRDYXRlZ29yeUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCisJICogQHNlZSAjc2V0UmVwb3J0X2NhdGVnb3J5KFRpbWVGb3JtYXRDYXRlZ29yeUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRpbWVGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXRSZXBvcnRfY2F0ZWdvcnkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCisJICogQHNlZSAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZXBvcnRfY2F0ZWdvcnkoVGltZUZvcm1hdENhdGVnb3J5RW51bSB2YWx1ZSk7CisKK30gLy8gVGltZUZvcm1hdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UaW1lRm9ybWF0Q2F0ZWdvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGltZUZvcm1hdENhdGVnb3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiYmViMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGltZUZvcm1hdENhdGVnb3J5LmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VGltZSBGb3JtYXQgQ2F0ZWdvcnk8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUaW1lRm9ybWF0Q2F0ZWdvcnkoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFRpbWVGb3JtYXRDYXRlZ29yeSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDVVNUT01fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDVVNUT00oMCwgIkNVU1RPTSIsICJjdXN0b20iKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNVU1RPTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJjdXN0b20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VTVE9NX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZUZvcm1hdENhdGVnb3J5W10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFRpbWVGb3JtYXRDYXRlZ29yeVtdIHsKKwkJCUNVU1RPTSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFRpbWVGb3JtYXRDYXRlZ29yeT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRpbWVGb3JtYXRDYXRlZ29yeSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRpbWVGb3JtYXRDYXRlZ29yeSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRpbWUgRm9ybWF0IENhdGVnb3J5PC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGltZUZvcm1hdENhdGVnb3J5IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVGltZUZvcm1hdENhdGVnb3J5IHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRpbWVGb3JtYXRDYXRlZ29yeSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgQ1VTVE9NX1ZBTFVFOiByZXR1cm4gQ1VTVE9NOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUaW1lRm9ybWF0Q2F0ZWdvcnkoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vVGltZUZvcm1hdENhdGVnb3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RpbWVGb3JtYXRDYXRlZ29yeUVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVGltZUZvcm1hdENhdGVnb3J5RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzk3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RpbWVGb3JtYXRDYXRlZ29yeUVudW0uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NVU1RPTV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNVU1RPTSgwLCAiQ1VTVE9NIiwgImN1c3RvbSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q1VTVE9NPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DVVNUT008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ1VTVE9NCisJICogQG1vZGVsIGxpdGVyYWw9ImN1c3RvbSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVNUT01fVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVGb3JtYXRDYXRlZ29yeUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgVGltZUZvcm1hdENhdGVnb3J5RW51bVtdIHsKKwkJCUNVU1RPTSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VGltZUZvcm1hdENhdGVnb3J5RW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UaW1lIEZvcm1hdCBDYXRlZ29yeSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRpbWUgRm9ybWF0IENhdGVnb3J5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBDVVNUT01fVkFMVUU6IHJldHVybiBDVVNUT007CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFRpbWVGb3JtYXRDYXRlZ29yeUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vVGltZUZvcm1hdENhdGVnb3J5RW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UaXRsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UaXRsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjZkODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RpdGxlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFRpdGxlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRpdGxlIGV4dGVuZHMgVGV4dEVsZW1lbnQgeworfSAvLyBUaXRsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UcmVuZEljb25FbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1RyZW5kSWNvbkVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFkMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9UcmVuZEljb25FbnVtLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5UcmVuZCBJY29uIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRUcmVuZEljb25FbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBUcmVuZEljb25FbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+UklTSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JJU0lOR19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJJU0lORygwLCAiUklTSU5HIiwgInJpc2luZyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+QkFEUklTSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0JBRFJJU0lOR19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUJBRFJJU0lORygwLCAiQkFEUklTSU5HIiwgImJhZC1yaXNpbmciKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNMT1BJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0xPUElOR19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNMT1BJTkcoMCwgIlNMT1BJTkciLCAic2xvcGluZyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+R09PRFNMT1BJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjR09PRFNMT1BJTkdfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlHT09EU0xPUElORygwLCAiR09PRFNMT1BJTkciLCAiZ29vZC1zbG9waW5nIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TVEFHTkFUSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NUQUdOQVRJTkdfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTVEFHTkFUSU5HKDAsICJTVEFHTkFUSU5HIiwgInN0YWduYXRpbmciKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJJU0lORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UklTSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JJU0lORworCSAqIEBtb2RlbCBsaXRlcmFsPSJyaXNpbmciCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklTSU5HX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkJBRFJJU0lORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QkFEUklTSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0JBRFJJU0lORworCSAqIEBtb2RlbCBsaXRlcmFsPSJiYWQtcmlzaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRFJJU0lOR19WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TTE9QSU5HPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TTE9QSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NMT1BJTkcKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ic2xvcGluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTE9QSU5HX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkdPT0RTTE9QSU5HPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5HT09EU0xPUElORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNHT09EU0xPUElORworCSAqIEBtb2RlbCBsaXRlcmFsPSJnb29kLXNsb3BpbmciCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR09PRFNMT1BJTkdfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U1RBR05BVElORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U1RBR05BVElORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVEFHTkFUSU5HCisJICogQG1vZGVsIGxpdGVyYWw9InN0YWduYXRpbmciCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBR05BVElOR19WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJlbmQgSWNvbiBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmVuZEljb25FbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFRyZW5kSWNvbkVudW1bXSB7CisJCQlSSVNJTkcsCisJCQlCQURSSVNJTkcsCisJCQlTTE9QSU5HLAorCQkJR09PRFNMT1BJTkcsCisJCQlTVEFHTkFUSU5HLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyZW5kIEljb24gRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFRyZW5kSWNvbkVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJlbmQgSWNvbiBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJlbmRJY29uRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRyZW5kSWNvbkVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmVuZCBJY29uIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUcmVuZEljb25FbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVHJlbmRJY29uRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJlbmQgSWNvbiBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJlbmRJY29uRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgUklTSU5HX1ZBTFVFOiByZXR1cm4gUklTSU5HOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUcmVuZEljb25FbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1RyZW5kSWNvbkVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmE3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TVU08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU1VNX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU1VNKDAsICJTVU0iLCAic3VtIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BVkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQVZFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQVZFKDAsICJBVkUiLCAiYXZlcmFnZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TUlOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI01JTl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU1JTigwLCAiTUlOIiwgIm1pbmltdW0iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1BWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNNQVhfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlNQVgoMCwgIk1BWCIsICJtYXhpbXVtIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SVU5OSU5HU1VNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JVTk5JTkdTVU1fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlSVU5OSU5HU1VNKDAsICJSVU5OSU5HU1VNIiwgInJ1bm5pbmctc3VtIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TVU08L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNVTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVU0KKwkgKiBAbW9kZWwgbGl0ZXJhbD0ic3VtIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BVkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFWRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBVkUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iYXZlcmFnZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkVfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TUlOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUlOCisJICogQG1vZGVsIGxpdGVyYWw9Im1pbmltdW0iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1BWDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TUFYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI01BWAorCSAqIEBtb2RlbCBsaXRlcmFsPSJtYXhpbXVtIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SVU5OSU5HU1VNPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SVU5OSU5HU1VNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JVTk5JTkdTVU0KKwkgKiBAbW9kZWwgbGl0ZXJhbD0icnVubmluZy1zdW0iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklOR1NVTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtW10geworCQkJU1VNLAorCQkJQVZFLAorCQkJTUlOLAorCQkJTUFYLAorCQkJUlVOTklOR1NVTSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5VbmFyeSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VW5hcnkgQWdncmVnYXRpb24gVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5VbmFyeSBBZ2dyZWdhdGlvbiBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFNVTV9WQUxVRTogcmV0dXJuIFNVTTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Vbml0RW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9Vbml0RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjIyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1VuaXRFbnVtLmphdmEKQEAgLTAsMCArMSw0MjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Vbml0IEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNnZXRVbml0RW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gVW5pdEVudW0gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OVUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05VTExfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOVUxMKDAsICJOVUxMIiwgIiIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TU08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTU1fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlNTSgwLCAiTU0iLCAibW0iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NNX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ00oMCwgIkNNIiwgImNtIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBUKDAsICJQVCIsICJwdCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSU5fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTigwLCAiSU4iLCAiaW5jaCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUENfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlQQygwLCAiUEMiLCAicGMiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkVNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VNX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRU0oMCwgIkVNIiwgImVtIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFWF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUVYKDAsICJFWCIsICJleCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UFg8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUFhfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlQWCgwLCAiUFgiLCAicHgiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBFUkNFTlRBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEVSQ0VOVEFHRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBFUkNFTlRBR0UoMCwgIlBFUkNFTlRBR0UiLCAiJSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOVUxMCisJICogQG1vZGVsIGxpdGVyYWw9IiIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1NPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNNTQorCSAqIEBtb2RlbCBsaXRlcmFsPSJtbSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNTV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q008L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ00KKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY20iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UFQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BUCisJICogQG1vZGVsIGxpdGVyYWw9InB0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTgorCSAqIEBtb2RlbCBsaXRlcmFsPSJpbmNoIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQQworCSAqIEBtb2RlbCBsaXRlcmFsPSJwYyIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQ19WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FTTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRU0KKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZW0iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+RVg8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VYCisJICogQG1vZGVsIGxpdGVyYWw9ImV4IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBYPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQWAorCSAqIEBtb2RlbCBsaXRlcmFsPSJweCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQWF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QRVJDRU5UQUdFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QRVJDRU5UQUdFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BFUkNFTlRBR0UKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iJSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJDRU5UQUdFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Vbml0IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVuaXRFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFVuaXRFbnVtW10geworCQkJTlVMTCwKKwkJCU1NLAorCQkJQ00sCisJCQlQVCwKKwkJCUlOLAorCQkJUEMsCisJCQlFTSwKKwkJCUVYLAorCQkJUFgsCisJCQlQRVJDRU5UQUdFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlVuaXQgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFVuaXRFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlVuaXQgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVuaXRFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVW5pdEVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Vbml0IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBVbml0RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVVuaXRFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Vbml0IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBVbml0RW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgTlVMTF9WQUxVRTogcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFVuaXRFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1VuaXRFbnVtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1VvbW9Gb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvVW9tb0Zvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODVkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1VvbW9Gb3JtYXQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVvbW8gRm9ybWF0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0VW9tb0Zvcm1hdCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBVb21vRm9ybWF0IGV4dGVuZHMgU29tZUZvcm1hdCB7Cit9IC8vIFVvbW9Gb3JtYXQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvV2l0aEhlYWRlckZvb3Rlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9XaXRoSGVhZGVyRm9vdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4ZTFmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvV2l0aEhlYWRlckZvb3Rlci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldpdGggSGVhZGVyIEZvb3RlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2lzRGV0YWlsaGVhZGVyIDxlbT5EZXRhaWxoZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjZ2V0SGVhZGVyc3R5bGUgPGVtPkhlYWRlcnN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2lzRGV0YWlsZm9vdGVyIDxlbT5EZXRhaWxmb290ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIjZ2V0Rm9vdGVyc3R5bGUgPGVtPkZvb3RlcnN0eWxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFdpdGhIZWFkZXJGb290ZXIoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgV2l0aEhlYWRlckZvb3RlciBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGV0YWlsaGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXRhaWxoZWFkZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGV0YWlsaGVhZGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXRhaWxoZWFkZXIoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0V2l0aEhlYWRlckZvb3Rlcl9EZXRhaWxoZWFkZXIoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRGV0YWlsaGVhZGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2lzRGV0YWlsaGVhZGVyIDxlbT5EZXRhaWxoZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRldGFpbGhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZXRhaWxoZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERldGFpbGhlYWRlcihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlcnN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWFkZXJzdHlsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXJzdHlsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SGVhZGVyc3R5bGUoU3R5bGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFdpdGhIZWFkZXJGb290ZXJfSGVhZGVyc3R5bGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZSBnZXRIZWFkZXJzdHlsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlciNnZXRIZWFkZXJzdHlsZSA8ZW0+SGVhZGVyc3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcnN0eWxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRIZWFkZXJzdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SGVhZGVyc3R5bGUoU3R5bGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGV0YWlsZm9vdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXRhaWxmb290ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGV0YWlsZm9vdGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXRhaWxmb290ZXIoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UjZ2V0V2l0aEhlYWRlckZvb3Rlcl9EZXRhaWxmb290ZXIoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRGV0YWlsZm9vdGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyI2lzRGV0YWlsZm9vdGVyIDxlbT5EZXRhaWxmb290ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRldGFpbGZvb3RlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZXRhaWxmb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERldGFpbGZvb3Rlcihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZvb3RlcnN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Gb290ZXJzdHlsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb290ZXJzdHlsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Rm9vdGVyc3R5bGUoU3R5bGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFdpdGhIZWFkZXJGb290ZXJfRm9vdGVyc3R5bGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHlsZSBnZXRGb290ZXJzdHlsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlciNnZXRGb290ZXJzdHlsZSA8ZW0+Rm9vdGVyc3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvb3RlcnN0eWxlPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRGb290ZXJzdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Rm9vdGVyc3R5bGUoU3R5bGUgdmFsdWUpOworCit9IC8vIFdpdGhIZWFkZXJGb290ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvV2l0aFN0eWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1dpdGhTdHlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGE0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1dpdGhTdHlsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2l0aCBTdHlsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGUjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFdpdGhTdHlsZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBXaXRoU3R5bGUgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U3R5bGUoU3R5bGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlI2dldFdpdGhTdHlsZV9TdHlsZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0eWxlIGdldFN0eWxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGUjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN0eWxlKFN0eWxlIHZhbHVlKTsKKworfSAvLyBXaXRoU3R5bGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9BdXRvVGV4dEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9BdXRvVGV4dEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZmMTAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0F1dG9UZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dG8gVGV4dDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5BdXRvVGV4dEltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkF1dG9UZXh0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXV0b1RleHRJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIEF1dG9UZXh0IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBzdHlsZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXV0b1RleHRFbnVtIFRZUEVfRURFRkFVTFQgPSBBdXRvVGV4dEVudW0uUEFHRV9OVU1CRVI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBBdXRvVGV4dEVudW0gdHlwZSA9IFRZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXV0b1RleHRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5BVVRPX1RFWFQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldFN0eWxlKCkgeworCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KXN0eWxlOworCQkJc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRTdHlsZSk7CisJCQlpZiAoc3R5bGUgIT0gb2xkU3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOworCQkJfQorCQl9CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgYmFzaWNHZXRTdHlsZSgpIHsKKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIG5ld1N0eWxlKSB7CisJCVN0eWxlIG9sZFN0eWxlID0gc3R5bGU7CisJCXN0eWxlID0gbmV3U3R5bGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQVVUT19URVhUX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dG9UZXh0RW51bSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKEF1dG9UZXh0RW51bSBuZXdUeXBlKSB7CisJCUF1dG9UZXh0RW51bSBvbGRUeXBlID0gdHlwZTsKKwkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5BVVRPX1RFWFRfX1NUWUxFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U3R5bGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTdHlsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fVFlQRToKKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQVVUT19URVhUX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5BVVRPX1RFWFRfX1RZUEU6CisJCQkJc2V0VHlwZSgoQXV0b1RleHRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5BVVRPX1RFWFRfX1RZUEU6CisJCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5BVVRPX1RFWFRfX1NUWUxFOgorCQkJCXJldHVybiBzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fVFlQRToKKwkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gV2l0aFN0eWxlLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQVVUT19URVhUX19TVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9TVFlMRV9fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gV2l0aFN0eWxlLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9TVFlMRV9fU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQodHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0F1dG9UZXh0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0Jhc2VTdHlsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9CYXNlU3R5bGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3M2MxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9CYXNlU3R5bGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjIxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0QWxpZ25FbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZSBTdHlsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0Rm9udCA8ZW0+Rm9udDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldEJhY2tncm91bmRjb2xvciA8ZW0+QmFja2dyb3VuZGNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldFRleHRjb2xvciA8ZW0+VGV4dGNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0VGV4dGFsaWduIDxlbT5UZXh0YWxpZ248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRCb3JkZXJUb3AgPGVtPkJvcmRlciBUb3A8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRCb3JkZXJCb3R0b20gPGVtPkJvcmRlciBCb3R0b208L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRCb3JkZXJMZWZ0IDxlbT5Cb3JkZXIgTGVmdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldEJvcmRlclJpZ2h0IDxlbT5Cb3JkZXIgUmlnaHQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRQYWRkaW5nVG9wVmFsdWUgPGVtPlBhZGRpbmcgVG9wIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0UGFkZGluZ1RvcFVuaXQgPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRQYWRkaW5nQm90dG9tVmFsdWUgPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0UGFkZGluZ0JvdHRvbVVuaXQgPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRQYWRkaW5nTGVmdFZhbHVlIDxlbT5QYWRkaW5nIExlZnQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRQYWRkaW5nTGVmdFVuaXQgPGVtPlBhZGRpbmcgTGVmdCBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRQYWRkaW5nUmlnaHRVbml0IDxlbT5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRNYXJnaW5Ub3BWYWx1ZSA8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldE1hcmdpblRvcFVuaXQgPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldE1hcmdpbkxlZnRWYWx1ZSA8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQmFzZVN0eWxlSW1wbCNnZXRNYXJnaW5MZWZ0VW5pdCA8ZW0+TWFyZ2luIExlZnQgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5CYXNlU3R5bGVJbXBsI2dldE1hcmdpbkJvdHRvbVZhbHVlIDxlbT5NYXJnaW4gQm90dG9tIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0TWFyZ2luQm90dG9tVW5pdCA8ZW0+TWFyZ2luIEJvdHRvbSBVbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0TWFyZ2luUmlnaHRWYWx1ZSA8ZW0+TWFyZ2luIFJpZ2h0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJhc2VTdHlsZUltcGwjZ2V0TWFyZ2luUmlnaHRVbml0IDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEJhc2VTdHlsZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQmFzZVN0eWxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtYXQoKSA8ZW0+Rm9ybWF0PC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb3JtYXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTb21lRm9ybWF0IGZvcm1hdDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvbnQoKSA8ZW0+Rm9udDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9udCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEZvbnQgZm9udDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmRjb2xvcigpIDxlbT5CYWNrZ3JvdW5kY29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJhY2tncm91bmRjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRjb2xvcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSA8ZW0+QmFja2dyb3VuZGNvbG9yIGFsdGVybmF0ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0Y29sb3IoKSA8ZW0+VGV4dGNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUZXh0Y29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvciB0ZXh0Y29sb3I7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dGFsaWduKCkgPGVtPlRleHRhbGlnbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGV4dGFsaWduKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRleHRBbGlnbkVudW0gVEVYVEFMSUdOX0VERUZBVUxUID0gVGV4dEFsaWduRW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dGFsaWduKCkgPGVtPlRleHRhbGlnbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGV4dGFsaWduKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dEFsaWduRW51bSB0ZXh0YWxpZ24gPSBURVhUQUxJR05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb3JkZXJUb3AoKSA8ZW0+Qm9yZGVyIFRvcDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Qm9yZGVyVG9wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9yZGVyU3R5bGUgYm9yZGVyVG9wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9yZGVyQm90dG9tKCkgPGVtPkJvcmRlciBCb3R0b208L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJvcmRlckJvdHRvbSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvcmRlclN0eWxlIGJvcmRlckJvdHRvbTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvcmRlckxlZnQoKSA8ZW0+Qm9yZGVyIExlZnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJvcmRlckxlZnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb3JkZXJTdHlsZSBib3JkZXJMZWZ0OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9yZGVyUmlnaHQoKSA8ZW0+Qm9yZGVyIFJpZ2h0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3JkZXJSaWdodCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvcmRlclN0eWxlIGJvcmRlclJpZ2h0OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdUb3BWYWx1ZSgpIDxlbT5QYWRkaW5nIFRvcCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1RvcFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBQQURESU5HX1RPUF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdUb3BWYWx1ZSgpIDxlbT5QYWRkaW5nIFRvcCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1RvcFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHBhZGRpbmdUb3BWYWx1ZSA9IFBBRERJTkdfVE9QX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdUb3BVbml0KCkgPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdUb3BVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIFBBRERJTkdfVE9QX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ1RvcFVuaXQoKSA8ZW0+UGFkZGluZyBUb3AgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1RvcFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBwYWRkaW5nVG9wVW5pdCA9IFBBRERJTkdfVE9QX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0JvdHRvbVZhbHVlKCkgPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nQm90dG9tVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFBBRERJTkdfQk9UVE9NX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0JvdHRvbVZhbHVlKCkgPGVtPlBhZGRpbmcgQm90dG9tIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nQm90dG9tVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcGFkZGluZ0JvdHRvbVZhbHVlID0gUEFERElOR19CT1RUT01fVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKSA8ZW0+UGFkZGluZyBCb3R0b20gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gUEFERElOR19CT1RUT01fVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nQm90dG9tVW5pdCgpIDxlbT5QYWRkaW5nIEJvdHRvbSBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nQm90dG9tVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIHBhZGRpbmdCb3R0b21Vbml0ID0gUEFERElOR19CT1RUT01fVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nTGVmdFZhbHVlKCkgPGVtPlBhZGRpbmcgTGVmdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ0xlZnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEFERElOR19MRUZUX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0xlZnRWYWx1ZSgpIDxlbT5QYWRkaW5nIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdMZWZ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcGFkZGluZ0xlZnRWYWx1ZSA9IFBBRERJTkdfTEVGVF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nTGVmdFVuaXQoKSA8ZW0+UGFkZGluZyBMZWZ0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdMZWZ0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBQQURESU5HX0xFRlRfVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nTGVmdFVuaXQoKSA8ZW0+UGFkZGluZyBMZWZ0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdMZWZ0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIHBhZGRpbmdMZWZ0VW5pdCA9IFBBRERJTkdfTEVGVF9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdSaWdodFZhbHVlKCkgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdSaWdodFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUoKSA8ZW0+UGFkZGluZyBSaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcGFkZGluZ1JpZ2h0VmFsdWUgPSBQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdSaWdodFVuaXQoKSA8ZW0+UGFkZGluZyBSaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nUmlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIFBBRERJTkdfUklHSFRfVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nUmlnaHRVbml0KCkgPGVtPlBhZGRpbmcgUmlnaHQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1JpZ2h0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIHBhZGRpbmdSaWdodFVuaXQgPSBQQURESU5HX1JJR0hUX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luVG9wVmFsdWUoKSA8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luVG9wVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1BUkdJTl9UT1BfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5Ub3BWYWx1ZSgpIDxlbT5NYXJnaW4gVG9wIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5Ub3BWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtYXJnaW5Ub3BWYWx1ZSA9IE1BUkdJTl9UT1BfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luVG9wVW5pdCgpIDxlbT5NYXJnaW4gVG9wIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpblRvcFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblRvcFVuaXQoKSA8ZW0+TWFyZ2luIFRvcCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5Ub3BVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gbWFyZ2luVG9wVW5pdCA9IE1BUkdJTl9UT1BfVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5MZWZ0VmFsdWUoKSA8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkxlZnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFSR0lOX0xFRlRfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5MZWZ0VmFsdWUoKSA8ZW0+TWFyZ2luIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkxlZnRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtYXJnaW5MZWZ0VmFsdWUgPSBNQVJHSU5fTEVGVF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5MZWZ0VW5pdCgpIDxlbT5NYXJnaW4gTGVmdCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5MZWZ0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpbkxlZnRVbml0KCkgPGVtPk1hcmdpbiBMZWZ0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkxlZnRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gbWFyZ2luTGVmdFVuaXQgPSBNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpbkJvdHRvbVZhbHVlKCkgPGVtPk1hcmdpbiBCb3R0b20gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkJvdHRvbVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luQm90dG9tVmFsdWUoKSA8ZW0+TWFyZ2luIEJvdHRvbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luQm90dG9tVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWFyZ2luQm90dG9tVmFsdWUgPSBNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpbkJvdHRvbVVuaXQoKSA8ZW0+TWFyZ2luIEJvdHRvbSBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5Cb3R0b21Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIE1BUkdJTl9CT1RUT01fVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5Cb3R0b21Vbml0KCkgPGVtPk1hcmdpbiBCb3R0b20gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luQm90dG9tVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIG1hcmdpbkJvdHRvbVVuaXQgPSBNQVJHSU5fQk9UVE9NX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpIDxlbT5NYXJnaW4gUmlnaHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpblJpZ2h0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1BUkdJTl9SSUdIVF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblJpZ2h0VmFsdWUoKSA8ZW0+TWFyZ2luIFJpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5SaWdodFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1hcmdpblJpZ2h0VmFsdWUgPSBNQVJHSU5fUklHSFRfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luUmlnaHRVbml0KCkgPGVtPk1hcmdpbiBSaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5SaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gTUFSR0lOX1JJR0hUX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luUmlnaHRVbml0KCkgPGVtPk1hcmdpbiBSaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5SaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBtYXJnaW5SaWdodFVuaXQgPSBNQVJHSU5fUklHSFRfVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBCYXNlU3R5bGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5CQVNFX1NUWUxFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTb21lRm9ybWF0IGdldEZvcm1hdCgpIHsKKwkJaWYgKGZvcm1hdCAhPSBudWxsICYmIGZvcm1hdC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9ybWF0ID0gKEludGVybmFsRU9iamVjdClmb3JtYXQ7CisJCQlmb3JtYXQgPSAoU29tZUZvcm1hdCllUmVzb2x2ZVByb3h5KG9sZEZvcm1hdCk7CisJCQlpZiAoZm9ybWF0ICE9IG9sZEZvcm1hdCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9STUFULCBvbGRGb3JtYXQsIGZvcm1hdCkpOworCQkJfQorCQl9CisJCXJldHVybiBmb3JtYXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNvbWVGb3JtYXQgYmFzaWNHZXRGb3JtYXQoKSB7CisJCXJldHVybiBmb3JtYXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9ybWF0KFNvbWVGb3JtYXQgbmV3Rm9ybWF0KSB7CisJCVNvbWVGb3JtYXQgb2xkRm9ybWF0ID0gZm9ybWF0OworCQlmb3JtYXQgPSBuZXdGb3JtYXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9STUFULCBvbGRGb3JtYXQsIGZvcm1hdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250IGdldEZvbnQoKSB7CisJCWlmIChmb250ICE9IG51bGwgJiYgZm9udC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9udCA9IChJbnRlcm5hbEVPYmplY3QpZm9udDsKKwkJCWZvbnQgPSAoRm9udCllUmVzb2x2ZVByb3h5KG9sZEZvbnQpOworCQkJaWYgKGZvbnQgIT0gb2xkRm9udCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9OVCwgb2xkRm9udCwgZm9udCkpOworCQkJfQorCQl9CisJCXJldHVybiBmb250OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250IGJhc2ljR2V0Rm9udCgpIHsKKwkJcmV0dXJuIGZvbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9udChGb250IG5ld0ZvbnQpIHsKKwkJRm9udCBvbGRGb250ID0gZm9udDsKKwkJZm9udCA9IG5ld0ZvbnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9OVCwgb2xkRm9udCwgZm9udCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kY29sb3IoKSB7CisJCWlmIChiYWNrZ3JvdW5kY29sb3IgIT0gbnVsbCAmJiBiYWNrZ3JvdW5kY29sb3IuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhY2tncm91bmRjb2xvciA9IChJbnRlcm5hbEVPYmplY3QpYmFja2dyb3VuZGNvbG9yOworCQkJYmFja2dyb3VuZGNvbG9yID0gKENvbG9yKWVSZXNvbHZlUHJveHkob2xkQmFja2dyb3VuZGNvbG9yKTsKKwkJCWlmIChiYWNrZ3JvdW5kY29sb3IgIT0gb2xkQmFja2dyb3VuZGNvbG9yKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1IsIG9sZEJhY2tncm91bmRjb2xvciwgYmFja2dyb3VuZGNvbG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhY2tncm91bmRjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgYmFzaWNHZXRCYWNrZ3JvdW5kY29sb3IoKSB7CisJCXJldHVybiBiYWNrZ3JvdW5kY29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZGNvbG9yKENvbG9yIG5ld0JhY2tncm91bmRjb2xvcikgeworCQlDb2xvciBvbGRCYWNrZ3JvdW5kY29sb3IgPSBiYWNrZ3JvdW5kY29sb3I7CisJCWJhY2tncm91bmRjb2xvciA9IG5ld0JhY2tncm91bmRjb2xvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1IsIG9sZEJhY2tncm91bmRjb2xvciwgYmFja2dyb3VuZGNvbG9yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGdldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSB7CisJCWlmIChiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlICE9IG51bGwgJiYgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA9IChJbnRlcm5hbEVPYmplY3QpYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZTsKKwkJCWJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUgPSAoQ29sb3IpZVJlc29sdmVQcm94eShvbGRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKTsKKwkJCWlmIChiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlICE9IG9sZEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEUsIG9sZEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUsIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgYmFzaWNHZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCkgeworCQlyZXR1cm4gYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKENvbG9yIG5ld0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUpIHsKKwkJQ29sb3Igb2xkQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA9IGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU7CisJCWJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUgPSBuZXdCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEUsIG9sZEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUsIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgZ2V0VGV4dGNvbG9yKCkgeworCQlpZiAodGV4dGNvbG9yICE9IG51bGwgJiYgdGV4dGNvbG9yLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRUZXh0Y29sb3IgPSAoSW50ZXJuYWxFT2JqZWN0KXRleHRjb2xvcjsKKwkJCXRleHRjb2xvciA9IChDb2xvcillUmVzb2x2ZVByb3h5KG9sZFRleHRjb2xvcik7CisJCQlpZiAodGV4dGNvbG9yICE9IG9sZFRleHRjb2xvcikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fVEVYVENPTE9SLCBvbGRUZXh0Y29sb3IsIHRleHRjb2xvcikpOworCQkJfQorCQl9CisJCXJldHVybiB0ZXh0Y29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGJhc2ljR2V0VGV4dGNvbG9yKCkgeworCQlyZXR1cm4gdGV4dGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRleHRjb2xvcihDb2xvciBuZXdUZXh0Y29sb3IpIHsKKwkJQ29sb3Igb2xkVGV4dGNvbG9yID0gdGV4dGNvbG9yOworCQl0ZXh0Y29sb3IgPSBuZXdUZXh0Y29sb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fVEVYVENPTE9SLCBvbGRUZXh0Y29sb3IsIHRleHRjb2xvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXh0QWxpZ25FbnVtIGdldFRleHRhbGlnbigpIHsKKwkJcmV0dXJuIHRleHRhbGlnbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZXh0YWxpZ24oVGV4dEFsaWduRW51bSBuZXdUZXh0YWxpZ24pIHsKKwkJVGV4dEFsaWduRW51bSBvbGRUZXh0YWxpZ24gPSB0ZXh0YWxpZ247CisJCXRleHRhbGlnbiA9IG5ld1RleHRhbGlnbiA9PSBudWxsID8gVEVYVEFMSUdOX0VERUZBVUxUIDogbmV3VGV4dGFsaWduOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRBTElHTiwgb2xkVGV4dGFsaWduLCB0ZXh0YWxpZ24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9yZGVyU3R5bGUgZ2V0Qm9yZGVyVG9wKCkgeworCQlyZXR1cm4gYm9yZGVyVG9wOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJvcmRlclRvcChCb3JkZXJTdHlsZSBuZXdCb3JkZXJUb3AsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQm9yZGVyU3R5bGUgb2xkQm9yZGVyVG9wID0gYm9yZGVyVG9wOworCQlib3JkZXJUb3AgPSBuZXdCb3JkZXJUb3A7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1RPUCwgb2xkQm9yZGVyVG9wLCBuZXdCb3JkZXJUb3ApOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcChCb3JkZXJTdHlsZSBuZXdCb3JkZXJUb3ApIHsKKwkJaWYgKG5ld0JvcmRlclRvcCAhPSBib3JkZXJUb3ApIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGJvcmRlclRvcCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClib3JkZXJUb3ApLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9UT1AsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0JvcmRlclRvcCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCb3JkZXJUb3ApLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9UT1AsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Qm9yZGVyVG9wKG5ld0JvcmRlclRvcCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9UT1AsIG5ld0JvcmRlclRvcCwgbmV3Qm9yZGVyVG9wKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvcmRlclN0eWxlIGdldEJvcmRlckJvdHRvbSgpIHsKKwkJcmV0dXJuIGJvcmRlckJvdHRvbTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCb3JkZXJCb3R0b20oQm9yZGVyU3R5bGUgbmV3Qm9yZGVyQm90dG9tLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUJvcmRlclN0eWxlIG9sZEJvcmRlckJvdHRvbSA9IGJvcmRlckJvdHRvbTsKKwkJYm9yZGVyQm90dG9tID0gbmV3Qm9yZGVyQm90dG9tOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9CT1RUT00sIG9sZEJvcmRlckJvdHRvbSwgbmV3Qm9yZGVyQm90dG9tKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b20oQm9yZGVyU3R5bGUgbmV3Qm9yZGVyQm90dG9tKSB7CisJCWlmIChuZXdCb3JkZXJCb3R0b20gIT0gYm9yZGVyQm90dG9tKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChib3JkZXJCb3R0b20gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYm9yZGVyQm90dG9tKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdCb3JkZXJCb3R0b20gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Qm9yZGVyQm90dG9tKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEJvcmRlckJvdHRvbShuZXdCb3JkZXJCb3R0b20sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NLCBuZXdCb3JkZXJCb3R0b20sIG5ld0JvcmRlckJvdHRvbSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb3JkZXJTdHlsZSBnZXRCb3JkZXJMZWZ0KCkgeworCQlyZXR1cm4gYm9yZGVyTGVmdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCb3JkZXJMZWZ0KEJvcmRlclN0eWxlIG5ld0JvcmRlckxlZnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQm9yZGVyU3R5bGUgb2xkQm9yZGVyTGVmdCA9IGJvcmRlckxlZnQ7CisJCWJvcmRlckxlZnQgPSBuZXdCb3JkZXJMZWZ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9MRUZULCBvbGRCb3JkZXJMZWZ0LCBuZXdCb3JkZXJMZWZ0KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0KEJvcmRlclN0eWxlIG5ld0JvcmRlckxlZnQpIHsKKwkJaWYgKG5ld0JvcmRlckxlZnQgIT0gYm9yZGVyTGVmdCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYm9yZGVyTGVmdCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClib3JkZXJMZWZ0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Qm9yZGVyTGVmdCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCb3JkZXJMZWZ0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRCb3JkZXJMZWZ0KG5ld0JvcmRlckxlZnQsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVCwgbmV3Qm9yZGVyTGVmdCwgbmV3Qm9yZGVyTGVmdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb3JkZXJTdHlsZSBnZXRCb3JkZXJSaWdodCgpIHsKKwkJcmV0dXJuIGJvcmRlclJpZ2h0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJvcmRlclJpZ2h0KEJvcmRlclN0eWxlIG5ld0JvcmRlclJpZ2h0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUJvcmRlclN0eWxlIG9sZEJvcmRlclJpZ2h0ID0gYm9yZGVyUmlnaHQ7CisJCWJvcmRlclJpZ2h0ID0gbmV3Qm9yZGVyUmlnaHQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1JJR0hULCBvbGRCb3JkZXJSaWdodCwgbmV3Qm9yZGVyUmlnaHQpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0KEJvcmRlclN0eWxlIG5ld0JvcmRlclJpZ2h0KSB7CisJCWlmIChuZXdCb3JkZXJSaWdodCAhPSBib3JkZXJSaWdodCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYm9yZGVyUmlnaHQgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYm9yZGVyUmlnaHQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Qm9yZGVyUmlnaHQgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Qm9yZGVyUmlnaHQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRCb3JkZXJSaWdodChuZXdCb3JkZXJSaWdodCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVCwgbmV3Qm9yZGVyUmlnaHQsIG5ld0JvcmRlclJpZ2h0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQYWRkaW5nVG9wVmFsdWUoKSB7CisJCXJldHVybiBwYWRkaW5nVG9wVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ1RvcFZhbHVlKGRvdWJsZSBuZXdQYWRkaW5nVG9wVmFsdWUpIHsKKwkJZG91YmxlIG9sZFBhZGRpbmdUb3BWYWx1ZSA9IHBhZGRpbmdUb3BWYWx1ZTsKKwkJcGFkZGluZ1RvcFZhbHVlID0gbmV3UGFkZGluZ1RvcFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFLCBvbGRQYWRkaW5nVG9wVmFsdWUsIHBhZGRpbmdUb3BWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRQYWRkaW5nVG9wVW5pdCgpIHsKKwkJcmV0dXJuIHBhZGRpbmdUb3BVbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdUb3BVbml0KFVuaXRFbnVtIG5ld1BhZGRpbmdUb3BVbml0KSB7CisJCVVuaXRFbnVtIG9sZFBhZGRpbmdUb3BVbml0ID0gcGFkZGluZ1RvcFVuaXQ7CisJCXBhZGRpbmdUb3BVbml0ID0gbmV3UGFkZGluZ1RvcFVuaXQgPT0gbnVsbCA/IFBBRERJTkdfVE9QX1VOSVRfRURFRkFVTFQgOiBuZXdQYWRkaW5nVG9wVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1RPUF9VTklULCBvbGRQYWRkaW5nVG9wVW5pdCwgcGFkZGluZ1RvcFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFBhZGRpbmdCb3R0b21WYWx1ZSgpIHsKKwkJcmV0dXJuIHBhZGRpbmdCb3R0b21WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nQm90dG9tVmFsdWUoZG91YmxlIG5ld1BhZGRpbmdCb3R0b21WYWx1ZSkgeworCQlkb3VibGUgb2xkUGFkZGluZ0JvdHRvbVZhbHVlID0gcGFkZGluZ0JvdHRvbVZhbHVlOworCQlwYWRkaW5nQm90dG9tVmFsdWUgPSBuZXdQYWRkaW5nQm90dG9tVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUUsIG9sZFBhZGRpbmdCb3R0b21WYWx1ZSwgcGFkZGluZ0JvdHRvbVZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldFBhZGRpbmdCb3R0b21Vbml0KCkgeworCQlyZXR1cm4gcGFkZGluZ0JvdHRvbVVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ0JvdHRvbVVuaXQoVW5pdEVudW0gbmV3UGFkZGluZ0JvdHRvbVVuaXQpIHsKKwkJVW5pdEVudW0gb2xkUGFkZGluZ0JvdHRvbVVuaXQgPSBwYWRkaW5nQm90dG9tVW5pdDsKKwkJcGFkZGluZ0JvdHRvbVVuaXQgPSBuZXdQYWRkaW5nQm90dG9tVW5pdCA9PSBudWxsID8gUEFERElOR19CT1RUT01fVU5JVF9FREVGQVVMVCA6IG5ld1BhZGRpbmdCb3R0b21Vbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQsIG9sZFBhZGRpbmdCb3R0b21Vbml0LCBwYWRkaW5nQm90dG9tVW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UGFkZGluZ0xlZnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHBhZGRpbmdMZWZ0VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnRWYWx1ZShkb3VibGUgbmV3UGFkZGluZ0xlZnRWYWx1ZSkgeworCQlkb3VibGUgb2xkUGFkZGluZ0xlZnRWYWx1ZSA9IHBhZGRpbmdMZWZ0VmFsdWU7CisJCXBhZGRpbmdMZWZ0VmFsdWUgPSBuZXdQYWRkaW5nTGVmdFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRSwgb2xkUGFkZGluZ0xlZnRWYWx1ZSwgcGFkZGluZ0xlZnRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRQYWRkaW5nTGVmdFVuaXQoKSB7CisJCXJldHVybiBwYWRkaW5nTGVmdFVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnRVbml0KFVuaXRFbnVtIG5ld1BhZGRpbmdMZWZ0VW5pdCkgeworCQlVbml0RW51bSBvbGRQYWRkaW5nTGVmdFVuaXQgPSBwYWRkaW5nTGVmdFVuaXQ7CisJCXBhZGRpbmdMZWZ0VW5pdCA9IG5ld1BhZGRpbmdMZWZ0VW5pdCA9PSBudWxsID8gUEFERElOR19MRUZUX1VOSVRfRURFRkFVTFQgOiBuZXdQYWRkaW5nTGVmdFVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQsIG9sZFBhZGRpbmdMZWZ0VW5pdCwgcGFkZGluZ0xlZnRVbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQYWRkaW5nUmlnaHRWYWx1ZSgpIHsKKwkJcmV0dXJuIHBhZGRpbmdSaWdodFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdSaWdodFZhbHVlKGRvdWJsZSBuZXdQYWRkaW5nUmlnaHRWYWx1ZSkgeworCQlkb3VibGUgb2xkUGFkZGluZ1JpZ2h0VmFsdWUgPSBwYWRkaW5nUmlnaHRWYWx1ZTsKKwkJcGFkZGluZ1JpZ2h0VmFsdWUgPSBuZXdQYWRkaW5nUmlnaHRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1ZBTFVFLCBvbGRQYWRkaW5nUmlnaHRWYWx1ZSwgcGFkZGluZ1JpZ2h0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0UGFkZGluZ1JpZ2h0VW5pdCgpIHsKKwkJcmV0dXJuIHBhZGRpbmdSaWdodFVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ1JpZ2h0VW5pdChVbml0RW51bSBuZXdQYWRkaW5nUmlnaHRVbml0KSB7CisJCVVuaXRFbnVtIG9sZFBhZGRpbmdSaWdodFVuaXQgPSBwYWRkaW5nUmlnaHRVbml0OworCQlwYWRkaW5nUmlnaHRVbml0ID0gbmV3UGFkZGluZ1JpZ2h0VW5pdCA9PSBudWxsID8gUEFERElOR19SSUdIVF9VTklUX0VERUZBVUxUIDogbmV3UGFkZGluZ1JpZ2h0VW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1VOSVQsIG9sZFBhZGRpbmdSaWdodFVuaXQsIHBhZGRpbmdSaWdodFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1hcmdpblRvcFZhbHVlKCkgeworCQlyZXR1cm4gbWFyZ2luVG9wVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFyZ2luVG9wVmFsdWUoZG91YmxlIG5ld01hcmdpblRvcFZhbHVlKSB7CisJCWRvdWJsZSBvbGRNYXJnaW5Ub3BWYWx1ZSA9IG1hcmdpblRvcFZhbHVlOworCQltYXJnaW5Ub3BWYWx1ZSA9IG5ld01hcmdpblRvcFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVkFMVUUsIG9sZE1hcmdpblRvcFZhbHVlLCBtYXJnaW5Ub3BWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRNYXJnaW5Ub3BVbml0KCkgeworCQlyZXR1cm4gbWFyZ2luVG9wVW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Ub3BVbml0KFVuaXRFbnVtIG5ld01hcmdpblRvcFVuaXQpIHsKKwkJVW5pdEVudW0gb2xkTWFyZ2luVG9wVW5pdCA9IG1hcmdpblRvcFVuaXQ7CisJCW1hcmdpblRvcFVuaXQgPSBuZXdNYXJnaW5Ub3BVbml0ID09IG51bGwgPyBNQVJHSU5fVE9QX1VOSVRfRURFRkFVTFQgOiBuZXdNYXJnaW5Ub3BVbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVU5JVCwgb2xkTWFyZ2luVG9wVW5pdCwgbWFyZ2luVG9wVW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TWFyZ2luTGVmdFZhbHVlKCkgeworCQlyZXR1cm4gbWFyZ2luTGVmdFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcmdpbkxlZnRWYWx1ZShkb3VibGUgbmV3TWFyZ2luTGVmdFZhbHVlKSB7CisJCWRvdWJsZSBvbGRNYXJnaW5MZWZ0VmFsdWUgPSBtYXJnaW5MZWZ0VmFsdWU7CisJCW1hcmdpbkxlZnRWYWx1ZSA9IG5ld01hcmdpbkxlZnRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRSwgb2xkTWFyZ2luTGVmdFZhbHVlLCBtYXJnaW5MZWZ0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0TWFyZ2luTGVmdFVuaXQoKSB7CisJCXJldHVybiBtYXJnaW5MZWZ0VW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0VW5pdChVbml0RW51bSBuZXdNYXJnaW5MZWZ0VW5pdCkgeworCQlVbml0RW51bSBvbGRNYXJnaW5MZWZ0VW5pdCA9IG1hcmdpbkxlZnRVbml0OworCQltYXJnaW5MZWZ0VW5pdCA9IG5ld01hcmdpbkxlZnRVbml0ID09IG51bGwgPyBNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUIDogbmV3TWFyZ2luTGVmdFVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVCwgb2xkTWFyZ2luTGVmdFVuaXQsIG1hcmdpbkxlZnRVbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXJnaW5Cb3R0b21WYWx1ZSgpIHsKKwkJcmV0dXJuIG1hcmdpbkJvdHRvbVZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcmdpbkJvdHRvbVZhbHVlKGRvdWJsZSBuZXdNYXJnaW5Cb3R0b21WYWx1ZSkgeworCQlkb3VibGUgb2xkTWFyZ2luQm90dG9tVmFsdWUgPSBtYXJnaW5Cb3R0b21WYWx1ZTsKKwkJbWFyZ2luQm90dG9tVmFsdWUgPSBuZXdNYXJnaW5Cb3R0b21WYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFLCBvbGRNYXJnaW5Cb3R0b21WYWx1ZSwgbWFyZ2luQm90dG9tVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0TWFyZ2luQm90dG9tVW5pdCgpIHsKKwkJcmV0dXJuIG1hcmdpbkJvdHRvbVVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFyZ2luQm90dG9tVW5pdChVbml0RW51bSBuZXdNYXJnaW5Cb3R0b21Vbml0KSB7CisJCVVuaXRFbnVtIG9sZE1hcmdpbkJvdHRvbVVuaXQgPSBtYXJnaW5Cb3R0b21Vbml0OworCQltYXJnaW5Cb3R0b21Vbml0ID0gbmV3TWFyZ2luQm90dG9tVW5pdCA9PSBudWxsID8gTUFSR0lOX0JPVFRPTV9VTklUX0VERUZBVUxUIDogbmV3TWFyZ2luQm90dG9tVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1VOSVQsIG9sZE1hcmdpbkJvdHRvbVVuaXQsIG1hcmdpbkJvdHRvbVVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1hcmdpblJpZ2h0VmFsdWUoKSB7CisJCXJldHVybiBtYXJnaW5SaWdodFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0VmFsdWUoZG91YmxlIG5ld01hcmdpblJpZ2h0VmFsdWUpIHsKKwkJZG91YmxlIG9sZE1hcmdpblJpZ2h0VmFsdWUgPSBtYXJnaW5SaWdodFZhbHVlOworCQltYXJnaW5SaWdodFZhbHVlID0gbmV3TWFyZ2luUmlnaHRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVkFMVUUsIG9sZE1hcmdpblJpZ2h0VmFsdWUsIG1hcmdpblJpZ2h0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0TWFyZ2luUmlnaHRVbml0KCkgeworCQlyZXR1cm4gbWFyZ2luUmlnaHRVbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0VW5pdChVbml0RW51bSBuZXdNYXJnaW5SaWdodFVuaXQpIHsKKwkJVW5pdEVudW0gb2xkTWFyZ2luUmlnaHRVbml0ID0gbWFyZ2luUmlnaHRVbml0OworCQltYXJnaW5SaWdodFVuaXQgPSBuZXdNYXJnaW5SaWdodFVuaXQgPT0gbnVsbCA/IE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUIDogbmV3TWFyZ2luUmlnaHRVbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9SSUdIVF9VTklULCBvbGRNYXJnaW5SaWdodFVuaXQsIG1hcmdpblJpZ2h0VW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfVE9QOgorCQkJCXJldHVybiBiYXNpY1NldEJvcmRlclRvcChudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXJldHVybiBiYXNpY1NldEJvcmRlckJvdHRvbShudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRCb3JkZXJMZWZ0KG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRCb3JkZXJSaWdodChudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPUk1BVDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZvcm1hdCgpOworCQkJCXJldHVybiBiYXNpY0dldEZvcm1hdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPTlQ6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGb250KCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0Rm9udCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEJhY2tncm91bmRjb2xvcigpOworCQkJCXJldHVybiBiYXNpY0dldEJhY2tncm91bmRjb2xvcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRDT0xPUjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRleHRjb2xvcigpOworCQkJCXJldHVybiBiYXNpY0dldFRleHRjb2xvcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRBTElHTjoKKwkJCQlyZXR1cm4gZ2V0VGV4dGFsaWduKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1RPUDoKKwkJCQlyZXR1cm4gZ2V0Qm9yZGVyVG9wKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX0JPVFRPTToKKwkJCQlyZXR1cm4gZ2V0Qm9yZGVyQm90dG9tKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJcmV0dXJuIGdldEJvcmRlckxlZnQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfUklHSFQ6CisJCQkJcmV0dXJuIGdldEJvcmRlclJpZ2h0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVkFMVUU6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdUb3BWYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdUb3BVbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUU6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdCb3R0b21WYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQ6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdCb3R0b21Vbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFOgorCQkJCXJldHVybiBnZXRQYWRkaW5nTGVmdFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQ6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdMZWZ0VW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUU6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdSaWdodFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOgorCQkJCXJldHVybiBnZXRQYWRkaW5nUmlnaHRVbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luVG9wVmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fVE9QX1VOSVQ6CisJCQkJcmV0dXJuIGdldE1hcmdpblRvcFVuaXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luTGVmdFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVDoKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luTGVmdFVuaXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFOgorCQkJCXJldHVybiBnZXRNYXJnaW5Cb3R0b21WYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDoKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luQm90dG9tVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9SSUdIVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9SSUdIVF9VTklUOgorCQkJCXJldHVybiBnZXRNYXJnaW5SaWdodFVuaXQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPUk1BVDoKKwkJCQlzZXRGb3JtYXQoKFNvbWVGb3JtYXQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19GT05UOgorCQkJCXNldEZvbnQoKEZvbnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1I6CisJCQkJc2V0QmFja2dyb3VuZGNvbG9yKChDb2xvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEU6CisJCQkJc2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgoQ29sb3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19URVhUQ09MT1I6CisJCQkJc2V0VGV4dGNvbG9yKChDb2xvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRBTElHTjoKKwkJCQlzZXRUZXh0YWxpZ24oKFRleHRBbGlnbkVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfVE9QOgorCQkJCXNldEJvcmRlclRvcCgoQm9yZGVyU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXNldEJvcmRlckJvdHRvbSgoQm9yZGVyU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDoKKwkJCQlzZXRCb3JkZXJMZWZ0KChCb3JkZXJTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVDoKKwkJCQlzZXRCb3JkZXJSaWdodCgoQm9yZGVyU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1RPUF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nVG9wVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6CisJCQkJc2V0UGFkZGluZ1RvcFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUU6CisJCQkJc2V0UGFkZGluZ0JvdHRvbVZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9VTklUOgorCQkJCXNldFBhZGRpbmdCb3R0b21Vbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nTGVmdFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0xFRlRfVU5JVDoKKwkJCQlzZXRQYWRkaW5nTGVmdFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nUmlnaHRWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOgorCQkJCXNldFBhZGRpbmdSaWdodFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRToKKwkJCQlzZXRNYXJnaW5Ub3BWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9VTklUOgorCQkJCXNldE1hcmdpblRvcFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVkFMVUU6CisJCQkJc2V0TWFyZ2luTGVmdFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9VTklUOgorCQkJCXNldE1hcmdpbkxlZnRVbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUU6CisJCQkJc2V0TWFyZ2luQm90dG9tVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDoKKwkJCQlzZXRNYXJnaW5Cb3R0b21Vbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9SSUdIVF9WQUxVRToKKwkJCQlzZXRNYXJnaW5SaWdodFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVU5JVDoKKwkJCQlzZXRNYXJnaW5SaWdodFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPUk1BVDoKKwkJCQlzZXRGb3JtYXQoKFNvbWVGb3JtYXQpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPTlQ6CisJCQkJc2V0Rm9udCgoRm9udCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQkFDS0dST1VORENPTE9SOgorCQkJCXNldEJhY2tncm91bmRjb2xvcigoQ29sb3IpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEU6CisJCQkJc2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgoQ29sb3IpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRDT0xPUjoKKwkJCQlzZXRUZXh0Y29sb3IoKENvbG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19URVhUQUxJR046CisJCQkJc2V0VGV4dGFsaWduKFRFWFRBTElHTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9UT1A6CisJCQkJc2V0Qm9yZGVyVG9wKChCb3JkZXJTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX0JPVFRPTToKKwkJCQlzZXRCb3JkZXJCb3R0b20oKEJvcmRlclN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDoKKwkJCQlzZXRCb3JkZXJMZWZ0KChCb3JkZXJTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1JJR0hUOgorCQkJCXNldEJvcmRlclJpZ2h0KChCb3JkZXJTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVkFMVUU6CisJCQkJc2V0UGFkZGluZ1RvcFZhbHVlKFBBRERJTkdfVE9QX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVU5JVDoKKwkJCQlzZXRQYWRkaW5nVG9wVW5pdChQQURESU5HX1RPUF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUU6CisJCQkJc2V0UGFkZGluZ0JvdHRvbVZhbHVlKFBBRERJTkdfQk9UVE9NX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVDoKKwkJCQlzZXRQYWRkaW5nQm90dG9tVW5pdChQQURESU5HX0JPVFRPTV9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFOgorCQkJCXNldFBhZGRpbmdMZWZ0VmFsdWUoUEFERElOR19MRUZUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQ6CisJCQkJc2V0UGFkZGluZ0xlZnRVbml0KFBBRERJTkdfTEVGVF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nUmlnaHRWYWx1ZShQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOgorCQkJCXNldFBhZGRpbmdSaWdodFVuaXQoUEFERElOR19SSUdIVF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRToKKwkJCQlzZXRNYXJnaW5Ub3BWYWx1ZShNQVJHSU5fVE9QX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9VTklUOgorCQkJCXNldE1hcmdpblRvcFVuaXQoTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVkFMVUU6CisJCQkJc2V0TWFyZ2luTGVmdFZhbHVlKE1BUkdJTl9MRUZUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVDoKKwkJCQlzZXRNYXJnaW5MZWZ0VW5pdChNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0JPVFRPTV9WQUxVRToKKwkJCQlzZXRNYXJnaW5Cb3R0b21WYWx1ZShNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0JPVFRPTV9VTklUOgorCQkJCXNldE1hcmdpbkJvdHRvbVVuaXQoTUFSR0lOX0JPVFRPTV9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOgorCQkJCXNldE1hcmdpblJpZ2h0VmFsdWUoTUFSR0lOX1JJR0hUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQ6CisJCQkJc2V0TWFyZ2luUmlnaHRVbml0KE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19GT1JNQVQ6CisJCQkJcmV0dXJuIGZvcm1hdCAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPTlQ6CisJCQkJcmV0dXJuIGZvbnQgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1I6CisJCQkJcmV0dXJuIGJhY2tncm91bmRjb2xvciAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEU6CisJCQkJcmV0dXJuIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19URVhUQ09MT1I6CisJCQkJcmV0dXJuIHRleHRjb2xvciAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRBTElHTjoKKwkJCQlyZXR1cm4gdGV4dGFsaWduICE9IFRFWFRBTElHTl9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfVE9QOgorCQkJCXJldHVybiBib3JkZXJUb3AgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXJldHVybiBib3JkZXJCb3R0b20gIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDoKKwkJCQlyZXR1cm4gYm9yZGVyTGVmdCAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9SSUdIVDoKKwkJCQlyZXR1cm4gYm9yZGVyUmlnaHQgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1RPUF9WQUxVRToKKwkJCQlyZXR1cm4gcGFkZGluZ1RvcFZhbHVlICE9IFBBRERJTkdfVE9QX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6CisJCQkJcmV0dXJuIHBhZGRpbmdUb3BVbml0ICE9IFBBRERJTkdfVE9QX1VOSVRfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUU6CisJCQkJcmV0dXJuIHBhZGRpbmdCb3R0b21WYWx1ZSAhPSBQQURESU5HX0JPVFRPTV9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9VTklUOgorCQkJCXJldHVybiBwYWRkaW5nQm90dG9tVW5pdCAhPSBQQURESU5HX0JPVFRPTV9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRToKKwkJCQlyZXR1cm4gcGFkZGluZ0xlZnRWYWx1ZSAhPSBQQURESU5HX0xFRlRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQ6CisJCQkJcmV0dXJuIHBhZGRpbmdMZWZ0VW5pdCAhPSBQQURESU5HX0xFRlRfVU5JVF9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1ZBTFVFOgorCQkJCXJldHVybiBwYWRkaW5nUmlnaHRWYWx1ZSAhPSBQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVDoKKwkJCQlyZXR1cm4gcGFkZGluZ1JpZ2h0VW5pdCAhPSBQQURESU5HX1JJR0hUX1VOSVRfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRToKKwkJCQlyZXR1cm4gbWFyZ2luVG9wVmFsdWUgIT0gTUFSR0lOX1RPUF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fVE9QX1VOSVQ6CisJCQkJcmV0dXJuIG1hcmdpblRvcFVuaXQgIT0gTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFOgorCQkJCXJldHVybiBtYXJnaW5MZWZ0VmFsdWUgIT0gTUFSR0lOX0xFRlRfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVDoKKwkJCQlyZXR1cm4gbWFyZ2luTGVmdFVuaXQgIT0gTUFSR0lOX0xFRlRfVU5JVF9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFOgorCQkJCXJldHVybiBtYXJnaW5Cb3R0b21WYWx1ZSAhPSBNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDoKKwkJCQlyZXR1cm4gbWFyZ2luQm90dG9tVW5pdCAhPSBNQVJHSU5fQk9UVE9NX1VOSVRfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOgorCQkJCXJldHVybiBtYXJnaW5SaWdodFZhbHVlICE9IE1BUkdJTl9SSUdIVF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVU5JVDoKKwkJCQlyZXR1cm4gbWFyZ2luUmlnaHRVbml0ICE9IE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodGV4dGFsaWduOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0ZXh0YWxpZ24pOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhZGRpbmdUb3BWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ1RvcFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nVG9wVW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ1RvcFVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhZGRpbmdCb3R0b21WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ0JvdHRvbVZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nQm90dG9tVW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ0JvdHRvbVVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhZGRpbmdMZWZ0VmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdMZWZ0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhZGRpbmdMZWZ0VW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ0xlZnRVbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nUmlnaHRWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQocGFkZGluZ1JpZ2h0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhZGRpbmdSaWdodFVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdSaWdodFVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcmdpblRvcFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5Ub3BWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luVG9wVW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luVG9wVW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luTGVmdFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5MZWZ0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcmdpbkxlZnRVbml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5MZWZ0VW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luQm90dG9tVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1hcmdpbkJvdHRvbVZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJnaW5Cb3R0b21Vbml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5Cb3R0b21Vbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJnaW5SaWdodFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5SaWdodFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJnaW5SaWdodFVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1hcmdpblJpZ2h0VW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Jhc2VTdHlsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Cb3JkZXJTdHlsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Cb3JkZXJTdHlsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzViMTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0JvcmRlclN0eWxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW07CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb3JkZXIgU3R5bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQm9yZGVyU3R5bGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQm9yZGVyU3R5bGVJbXBsI2dldFdpZHRodmFsdWUgPGVtPldpZHRodmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQm9yZGVyU3R5bGVJbXBsI2dldFdpZHRodW5pdCA8ZW0+V2lkdGh1bml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJvcmRlclN0eWxlSW1wbCNnZXRDb2xvciA8ZW0+Q29sb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBCb3JkZXJTdHlsZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQm9yZGVyU3R5bGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9yZGVyVHlwZUVudW0gVFlQRV9FREVGQVVMVCA9IEJvcmRlclR5cGVFbnVtLk5PTkU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb3JkZXJUeXBlRW51bSB0eXBlID0gVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aHZhbHVlKCkgPGVtPldpZHRodmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFdpZHRodmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFdJRFRIVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aHZhbHVlKCkgPGVtPldpZHRodmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFdpZHRodmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgd2lkdGh2YWx1ZSA9IFdJRFRIVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2lkdGh1bml0KCkgPGVtPldpZHRodW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0V2lkdGh1bml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIFdJRFRIVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aHVuaXQoKSA8ZW0+V2lkdGh1bml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRXaWR0aHVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSB3aWR0aHVuaXQgPSBXSURUSFVOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xvcigpIDxlbT5Db2xvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBCb3JkZXJTdHlsZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkJPUkRFUl9TVFlMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9yZGVyVHlwZUVudW0gZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZShCb3JkZXJUeXBlRW51bSBuZXdUeXBlKSB7CisJCUJvcmRlclR5cGVFbnVtIG9sZFR5cGUgPSB0eXBlOworCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRXaWR0aHZhbHVlKCkgeworCQlyZXR1cm4gd2lkdGh2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXaWR0aHZhbHVlKGRvdWJsZSBuZXdXaWR0aHZhbHVlKSB7CisJCWRvdWJsZSBvbGRXaWR0aHZhbHVlID0gd2lkdGh2YWx1ZTsKKwkJd2lkdGh2YWx1ZSA9IG5ld1dpZHRodmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19XSURUSFZBTFVFLCBvbGRXaWR0aHZhbHVlLCB3aWR0aHZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldFdpZHRodW5pdCgpIHsKKwkJcmV0dXJuIHdpZHRodW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXaWR0aHVuaXQoVW5pdEVudW0gbmV3V2lkdGh1bml0KSB7CisJCVVuaXRFbnVtIG9sZFdpZHRodW5pdCA9IHdpZHRodW5pdDsKKwkJd2lkdGh1bml0ID0gbmV3V2lkdGh1bml0ID09IG51bGwgPyBXSURUSFVOSVRfRURFRkFVTFQgOiBuZXdXaWR0aHVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19XSURUSFVOSVQsIG9sZFdpZHRodW5pdCwgd2lkdGh1bml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGdldENvbG9yKCkgeworCQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvci5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29sb3IgPSAoSW50ZXJuYWxFT2JqZWN0KWNvbG9yOworCQkJY29sb3IgPSAoQ29sb3IpZVJlc29sdmVQcm94eShvbGRDb2xvcik7CisJCQlpZiAoY29sb3IgIT0gb2xkQ29sb3IpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fQ09MT1IsIG9sZENvbG9yLCBjb2xvcikpOworCQkJfQorCQl9CisJCXJldHVybiBjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgYmFzaWNHZXRDb2xvcigpIHsKKwkJcmV0dXJuIGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIG5ld0NvbG9yKSB7CisJCUNvbG9yIG9sZENvbG9yID0gY29sb3I7CisJCWNvbG9yID0gbmV3Q29sb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19DT0xPUiwgb2xkQ29sb3IsIGNvbG9yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fVFlQRToKKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fV0lEVEhWQUxVRToKKwkJCQlyZXR1cm4gZ2V0V2lkdGh2YWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fV0lEVEhVTklUOgorCQkJCXJldHVybiBnZXRXaWR0aHVuaXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX0NPTE9SOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q29sb3IoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRDb2xvcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19UWVBFOgorCQkJCXNldFR5cGUoKEJvcmRlclR5cGVFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19XSURUSFZBTFVFOgorCQkJCXNldFdpZHRodmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fV0lEVEhVTklUOgorCQkJCXNldFdpZHRodW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX0NPTE9SOgorCQkJCXNldENvbG9yKChDb2xvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX1RZUEU6CisJCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1NUWUxFX19XSURUSFZBTFVFOgorCQkJCXNldFdpZHRodmFsdWUoV0lEVEhWQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9TVFlMRV9fV0lEVEhVTklUOgorCQkJCXNldFdpZHRodW5pdChXSURUSFVOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX0NPTE9SOgorCQkJCXNldENvbG9yKChDb2xvciludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX1RZUEU6CisJCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX1dJRFRIVkFMVUU6CisJCQkJcmV0dXJuIHdpZHRodmFsdWUgIT0gV0lEVEhWQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX1dJRFRIVU5JVDoKKwkJCQlyZXR1cm4gd2lkdGh1bml0ICE9IFdJRFRIVU5JVF9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEVfX0NPTE9SOgorCQkJCXJldHVybiBjb2xvciAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQodHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgd2lkdGh2YWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQod2lkdGh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgd2lkdGh1bml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh3aWR0aHVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Cb3JkZXJTdHlsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9CdWlsZEluRm9udEZhbWlseUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9CdWlsZEluRm9udEZhbWlseUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFiZjQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0J1aWxkSW5Gb250RmFtaWx5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkJ1aWxkSW5Gb250RmFtaWx5SW1wbCNnZXRDdXN0b20gPGVtPkN1c3RvbTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkSW5Gb250RmFtaWx5SW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBCdWlsZEluRm9udEZhbWlseSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbSgpIDxlbT5DdXN0b208L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN1c3RvbSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCdWlsZEluRm9udEZhbWlseUVudW0gQ1VTVE9NX0VERUZBVUxUID0gQnVpbGRJbkZvbnRGYW1pbHlFbnVtLk1PTk9TUEFDRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbSgpIDxlbT5DdXN0b208L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEN1c3RvbSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJ1aWxkSW5Gb250RmFtaWx5RW51bSBjdXN0b20gPSBDVVNUT01fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQnVpbGRJbkZvbnRGYW1pbHlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5CVUlMRF9JTl9GT05UX0ZBTUlMWTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQnVpbGRJbkZvbnRGYW1pbHlFbnVtIGdldEN1c3RvbSgpIHsKKwkJcmV0dXJuIGN1c3RvbTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDdXN0b20oQnVpbGRJbkZvbnRGYW1pbHlFbnVtIG5ld0N1c3RvbSkgeworCQlCdWlsZEluRm9udEZhbWlseUVudW0gb2xkQ3VzdG9tID0gY3VzdG9tOworCQljdXN0b20gPSBuZXdDdXN0b20gPT0gbnVsbCA/IENVU1RPTV9FREVGQVVMVCA6IG5ld0N1c3RvbTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWV9fQ1VTVE9NLCBvbGRDdXN0b20sIGN1c3RvbSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWV9fQ1VTVE9NOgorCQkJCXJldHVybiBnZXRDdXN0b20oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJVSUxEX0lOX0ZPTlRfRkFNSUxZX19DVVNUT006CisJCQkJc2V0Q3VzdG9tKChCdWlsZEluRm9udEZhbWlseUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQlVJTERfSU5fRk9OVF9GQU1JTFlfX0NVU1RPTToKKwkJCQlzZXRDdXN0b20oQ1VTVE9NX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWV9fQ1VTVE9NOgorCQkJCXJldHVybiBjdXN0b20gIT0gQ1VTVE9NX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoY3VzdG9tOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjdXN0b20pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9CdWlsZEluRm9udEZhbWlseUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Db2xvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Db2xvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZmNzJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0NvbG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDU2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2xvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db2xvckltcGwjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9ySW1wbCNnZXRCYXNlY29sb3IgPGVtPkJhc2Vjb2xvcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db2xvckltcGwjZ2V0RGFya2Vuc2J5IDxlbT5EYXJrZW5zYnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JJbXBsI2dldExpZ2h0ZW5zYnkgPGVtPkxpZ2h0ZW5zYnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JJbXBsI2dldFRyYW5zZm9ybXNieSA8ZW0+VHJhbnNmb3Jtc2J5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkNvbG9ySW1wbCNnZXRUYXJnZXRjb2xvciA8ZW0+VGFyZ2V0Y29sb3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xvckltcGwgZXh0ZW5kcyBSZXBvcnRCYXNlSW1wbCBpbXBsZW1lbnRzIENvbG9yIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sb3IoKSA8ZW0+Q29sb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xvcigpIDxlbT5Db2xvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY29sb3IgPSBDT0xPUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2Vjb2xvcigpIDxlbT5CYXNlY29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJhc2Vjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENvbG9yIGJhc2Vjb2xvcjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXJrZW5zYnkoKSA8ZW0+RGFya2Vuc2J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXJrZW5zYnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBEQVJLRU5TQllfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGFya2Vuc2J5KCkgPGVtPkRhcmtlbnNieTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGFya2Vuc2J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBkYXJrZW5zYnkgPSBEQVJLRU5TQllfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlnaHRlbnNieSgpIDxlbT5MaWdodGVuc2J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMaWdodGVuc2J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTElHSFRFTlNCWV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWdodGVuc2J5KCkgPGVtPkxpZ2h0ZW5zYnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExpZ2h0ZW5zYnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIGxpZ2h0ZW5zYnkgPSBMSUdIVEVOU0JZX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zZm9ybXNieSgpIDxlbT5UcmFuc2Zvcm1zYnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zZm9ybXNieSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFRSQU5TRk9STVNCWV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2Zvcm1zYnkoKSA8ZW0+VHJhbnNmb3Jtc2J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUcmFuc2Zvcm1zYnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIHRyYW5zZm9ybXNieSA9IFRSQU5TRk9STVNCWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldGNvbG9yKCkgPGVtPlRhcmdldGNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYXJnZXRjb2xvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENvbG9yIHRhcmdldGNvbG9yOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ09MT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKKwkJcmV0dXJuIGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBuZXdDb2xvcikgeworCQlTdHJpbmcgb2xkQ29sb3IgPSBjb2xvcjsKKwkJY29sb3IgPSBuZXdDb2xvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fQ09MT1IsIG9sZENvbG9yLCBjb2xvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBnZXRCYXNlY29sb3IoKSB7CisJCWlmIChiYXNlY29sb3IgIT0gbnVsbCAmJiBiYXNlY29sb3IuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhc2Vjb2xvciA9IChJbnRlcm5hbEVPYmplY3QpYmFzZWNvbG9yOworCQkJYmFzZWNvbG9yID0gKENvbG9yKWVSZXNvbHZlUHJveHkob2xkQmFzZWNvbG9yKTsKKwkJCWlmIChiYXNlY29sb3IgIT0gb2xkQmFzZWNvbG9yKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fQkFTRUNPTE9SLCBvbGRCYXNlY29sb3IsIGJhc2Vjb2xvcikpOworCQkJfQorCQl9CisJCXJldHVybiBiYXNlY29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGJhc2ljR2V0QmFzZWNvbG9yKCkgeworCQlyZXR1cm4gYmFzZWNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhc2Vjb2xvcihDb2xvciBuZXdCYXNlY29sb3IpIHsKKwkJQ29sb3Igb2xkQmFzZWNvbG9yID0gYmFzZWNvbG9yOworCQliYXNlY29sb3IgPSBuZXdCYXNlY29sb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0JBU0VDT0xPUiwgb2xkQmFzZWNvbG9yLCBiYXNlY29sb3IpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXREYXJrZW5zYnkoKSB7CisJCXJldHVybiBkYXJrZW5zYnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGFya2Vuc2J5KEludGVnZXIgbmV3RGFya2Vuc2J5KSB7CisJCUludGVnZXIgb2xkRGFya2Vuc2J5ID0gZGFya2Vuc2J5OworCQlkYXJrZW5zYnkgPSBuZXdEYXJrZW5zYnk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0RBUktFTlNCWSwgb2xkRGFya2Vuc2J5LCBkYXJrZW5zYnkpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRMaWdodGVuc2J5KCkgeworCQlyZXR1cm4gbGlnaHRlbnNieTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMaWdodGVuc2J5KEludGVnZXIgbmV3TGlnaHRlbnNieSkgeworCQlJbnRlZ2VyIG9sZExpZ2h0ZW5zYnkgPSBsaWdodGVuc2J5OworCQlsaWdodGVuc2J5ID0gbmV3TGlnaHRlbnNieTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fTElHSFRFTlNCWSwgb2xkTGlnaHRlbnNieSwgbGlnaHRlbnNieSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldFRyYW5zZm9ybXNieSgpIHsKKwkJcmV0dXJuIHRyYW5zZm9ybXNieTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1zYnkoSW50ZWdlciBuZXdUcmFuc2Zvcm1zYnkpIHsKKwkJSW50ZWdlciBvbGRUcmFuc2Zvcm1zYnkgPSB0cmFuc2Zvcm1zYnk7CisJCXRyYW5zZm9ybXNieSA9IG5ld1RyYW5zZm9ybXNieTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fVFJBTlNGT1JNU0JZLCBvbGRUcmFuc2Zvcm1zYnksIHRyYW5zZm9ybXNieSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBnZXRUYXJnZXRjb2xvcigpIHsKKwkJaWYgKHRhcmdldGNvbG9yICE9IG51bGwgJiYgdGFyZ2V0Y29sb3IuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhcmdldGNvbG9yID0gKEludGVybmFsRU9iamVjdCl0YXJnZXRjb2xvcjsKKwkJCXRhcmdldGNvbG9yID0gKENvbG9yKWVSZXNvbHZlUHJveHkob2xkVGFyZ2V0Y29sb3IpOworCQkJaWYgKHRhcmdldGNvbG9yICE9IG9sZFRhcmdldGNvbG9yKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fVEFSR0VUQ09MT1IsIG9sZFRhcmdldGNvbG9yLCB0YXJnZXRjb2xvcikpOworCQkJfQorCQl9CisJCXJldHVybiB0YXJnZXRjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgYmFzaWNHZXRUYXJnZXRjb2xvcigpIHsKKwkJcmV0dXJuIHRhcmdldGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhcmdldGNvbG9yKENvbG9yIG5ld1RhcmdldGNvbG9yKSB7CisJCUNvbG9yIG9sZFRhcmdldGNvbG9yID0gdGFyZ2V0Y29sb3I7CisJCXRhcmdldGNvbG9yID0gbmV3VGFyZ2V0Y29sb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX1RBUkdFVENPTE9SLCBvbGRUYXJnZXRjb2xvciwgdGFyZ2V0Y29sb3IpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0NPTE9SOgorCQkJCXJldHVybiBnZXRDb2xvcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19CQVNFQ09MT1I6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRCYXNlY29sb3IoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCYXNlY29sb3IoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fREFSS0VOU0JZOgorCQkJCXJldHVybiBnZXREYXJrZW5zYnkoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fTElHSFRFTlNCWToKKwkJCQlyZXR1cm4gZ2V0TGlnaHRlbnNieSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19UUkFOU0ZPUk1TQlk6CisJCQkJcmV0dXJuIGdldFRyYW5zZm9ybXNieSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19UQVJHRVRDT0xPUjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRhcmdldGNvbG9yKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0Y29sb3IoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19DT0xPUjoKKwkJCQlzZXRDb2xvcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0JBU0VDT0xPUjoKKwkJCQlzZXRCYXNlY29sb3IoKENvbG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0RBUktFTlNCWToKKwkJCQlzZXREYXJrZW5zYnkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fTElHSFRFTlNCWToKKwkJCQlzZXRMaWdodGVuc2J5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX1RSQU5TRk9STVNCWToKKwkJCQlzZXRUcmFuc2Zvcm1zYnkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fVEFSR0VUQ09MT1I6CisJCQkJc2V0VGFyZ2V0Y29sb3IoKENvbG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19DT0xPUjoKKwkJCQlzZXRDb2xvcihDT0xPUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SX19CQVNFQ09MT1I6CisJCQkJc2V0QmFzZWNvbG9yKChDb2xvciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0RBUktFTlNCWToKKwkJCQlzZXREYXJrZW5zYnkoREFSS0VOU0JZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0xJR0hURU5TQlk6CisJCQkJc2V0TGlnaHRlbnNieShMSUdIVEVOU0JZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX1RSQU5TRk9STVNCWToKKwkJCQlzZXRUcmFuc2Zvcm1zYnkoVFJBTlNGT1JNU0JZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX1RBUkdFVENPTE9SOgorCQkJCXNldFRhcmdldGNvbG9yKChDb2xvciludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fQ09MT1I6CisJCQkJcmV0dXJuIENPTE9SX0VERUZBVUxUID09IG51bGwgPyBjb2xvciAhPSBudWxsIDogIUNPTE9SX0VERUZBVUxULmVxdWFscyhjb2xvcik7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0JBU0VDT0xPUjoKKwkJCQlyZXR1cm4gYmFzZWNvbG9yICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0RBUktFTlNCWToKKwkJCQlyZXR1cm4gREFSS0VOU0JZX0VERUZBVUxUID09IG51bGwgPyBkYXJrZW5zYnkgIT0gbnVsbCA6ICFEQVJLRU5TQllfRURFRkFVTFQuZXF1YWxzKGRhcmtlbnNieSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JfX0xJR0hURU5TQlk6CisJCQkJcmV0dXJuIExJR0hURU5TQllfRURFRkFVTFQgPT0gbnVsbCA/IGxpZ2h0ZW5zYnkgIT0gbnVsbCA6ICFMSUdIVEVOU0JZX0VERUZBVUxULmVxdWFscyhsaWdodGVuc2J5KTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fVFJBTlNGT1JNU0JZOgorCQkJCXJldHVybiBUUkFOU0ZPUk1TQllfRURFRkFVTFQgPT0gbnVsbCA/IHRyYW5zZm9ybXNieSAhPSBudWxsIDogIVRSQU5TRk9STVNCWV9FREVGQVVMVC5lcXVhbHModHJhbnNmb3Jtc2J5KTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUl9fVEFSR0VUQ09MT1I6CisJCQkJcmV0dXJuIHRhcmdldGNvbG9yICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjb2xvcjogIik7CisJCXJlc3VsdC5hcHBlbmQoY29sb3IpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRhcmtlbnNieTogIik7CisJCXJlc3VsdC5hcHBlbmQoZGFya2Vuc2J5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsaWdodGVuc2J5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsaWdodGVuc2J5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2Zvcm1zYnk6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRyYW5zZm9ybXNieSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NvbG9ySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0NvbG9yc0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Db2xvcnNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Db2xvcnNJbXBsLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2xvcnM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ29sb3JzSW1wbCNnZXRDb2xvcnMgPGVtPkNvbG9yczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbG9yc0ltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ29sb3JzIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xvcnMoKSA8ZW0+Q29sb3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbG9ycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PENvbG9yPiBjb2xvcnM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sb3JzSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ09MT1JTOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxDb2xvcj4gZ2V0Q29sb3JzKCkgeworCQlpZiAoY29sb3JzID09IG51bGwpIHsKKwkJCWNvbG9ycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb2xvcj4oQ29sb3IuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JTX19DT0xPUlMpOworCQl9CisJCXJldHVybiBjb2xvcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SU19fQ09MT1JTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29sb3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SU19fQ09MT1JTOgorCQkJCXJldHVybiBnZXRDb2xvcnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SU19fQ09MT1JTOgorCQkJCWdldENvbG9ycygpLmNsZWFyKCk7CisJCQkJZ2V0Q29sb3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb2xvcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JTX19DT0xPUlM6CisJCQkJZ2V0Q29sb3JzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUlNfX0NPTE9SUzoKKwkJCQlyZXR1cm4gY29sb3JzICE9IG51bGwgJiYgIWNvbG9ycy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0NvbG9yc0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Db250YWluZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzQ3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Db250YWluZXJJbXBsI2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5lckltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29udGFpbmVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50cygpIDxlbT5FbGVtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbGVtZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbnRhaW5lckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNPTlRBSU5FUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8RWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisJCWlmIChlbGVtZW50cyA9PSBudWxsKSB7CisJCQllbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFbGVtZW50PihFbGVtZW50LmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLkNPTlRBSU5FUl9fRUxFTUVOVFMpOworCQl9CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09OVEFJTkVSX19FTEVNRU5UUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTlRBSU5FUl9fRUxFTUVOVFM6CisJCQkJcmV0dXJuIGdldEVsZW1lbnRzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT05UQUlORVJfX0VMRU1FTlRTOgorCQkJCWdldEVsZW1lbnRzKCkuY2xlYXIoKTsKKwkJCQlnZXRFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWxlbWVudD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09OVEFJTkVSX19FTEVNRU5UUzoKKwkJCQlnZXRFbGVtZW50cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09OVEFJTkVSX19FTEVNRU5UUzoKKwkJCQlyZXR1cm4gZWxlbWVudHMgIT0gbnVsbCAmJiAhZWxlbWVudHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9Db250YWluZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvQ3VycmVuY3lGb3JtYXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvQ3VycmVuY3lGb3JtYXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0YTQyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9DdXJyZW5jeUZvcm1hdEltcGwuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1cnJlbmN5IEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5DdXJyZW5jeUZvcm1hdEltcGwjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDdXJyZW5jeUZvcm1hdEltcGwgZXh0ZW5kcyBTb21lRm9ybWF0SW1wbCBpbXBsZW1lbnRzIEN1cnJlbmN5Rm9ybWF0IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA9IEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtLlVORk9STUFUVEVEOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X2NhdGVnb3J5ID0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEN1cnJlbmN5Rm9ybWF0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ1VSUkVOQ1lfRk9STUFUOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSBnZXRSZXBvcnRfY2F0ZWdvcnkoKSB7CisJCXJldHVybiByZXBvcnRfY2F0ZWdvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVwb3J0X2NhdGVnb3J5KEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIG5ld1JlcG9ydF9jYXRlZ29yeSkgeworCQlDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSBvbGRSZXBvcnRfY2F0ZWdvcnkgPSByZXBvcnRfY2F0ZWdvcnk7CisJCXJlcG9ydF9jYXRlZ29yeSA9IG5ld1JlcG9ydF9jYXRlZ29yeSA9PSBudWxsID8gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUIDogbmV3UmVwb3J0X2NhdGVnb3J5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkNVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZLCBvbGRSZXBvcnRfY2F0ZWdvcnksIHJlcG9ydF9jYXRlZ29yeSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DVVJSRU5DWV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlyZXR1cm4gZ2V0UmVwb3J0X2NhdGVnb3J5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DVVJSRU5DWV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlzZXRSZXBvcnRfY2F0ZWdvcnkoKEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXNldFJlcG9ydF9jYXRlZ29yeShSRVBPUlRfQ0FURUdPUllfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXJldHVybiByZXBvcnRfY2F0ZWdvcnkgIT0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVwb3J0X2NhdGVnb3J5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZXBvcnRfY2F0ZWdvcnkpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DdXJyZW5jeUZvcm1hdEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9DdXN0b21Gb250RmFtaWx5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0N1c3RvbUZvbnRGYW1pbHlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmYmE3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9DdXN0b21Gb250RmFtaWx5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gRm9udCBGYW1pbHk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuQ3VzdG9tRm9udEZhbWlseUltcGwjZ2V0Q3VzdG9tIDxlbT5DdXN0b208L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Gb250RmFtaWx5SW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBDdXN0b21Gb250RmFtaWx5IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tKCkgPGVtPkN1c3RvbTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VzdG9tKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tKCkgPGVtPkN1c3RvbTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VzdG9tKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbSA9IENVU1RPTV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDdXN0b21Gb250RmFtaWx5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0ZPTlRfRkFNSUxZOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworCQlyZXR1cm4gY3VzdG9tOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1c3RvbShTdHJpbmcgbmV3Q3VzdG9tKSB7CisJCVN0cmluZyBvbGRDdXN0b20gPSBjdXN0b207CisJCWN1c3RvbSA9IG5ld0N1c3RvbTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5DVVNUT01fRk9OVF9GQU1JTFlfX0NVU1RPTSwgb2xkQ3VzdG9tLCBjdXN0b20pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT006CisJCQkJcmV0dXJuIGdldEN1c3RvbSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT006CisJCQkJc2V0Q3VzdG9tKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT006CisJCQkJc2V0Q3VzdG9tKENVU1RPTV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT006CisJCQkJcmV0dXJuIENVU1RPTV9FREVGQVVMVCA9PSBudWxsID8gY3VzdG9tICE9IG51bGwgOiAhQ1VTVE9NX0VERUZBVUxULmVxdWFscyhjdXN0b20pOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoY3VzdG9tOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjdXN0b20pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DdXN0b21Gb250RmFtaWx5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVEZXRhaWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZURldGFpbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTAxYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVEZXRhaWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZURldGFpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlRGV0YWlsSW1wbCNnZXRDb2x1bW5Gb3JtYXR0ZXJzIDxlbT5Db2x1bW4gRm9ybWF0dGVyczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGFtYXJ0VGFibGVEZXRhaWxJbXBsIGV4dGVuZHMgV2l0aFN0eWxlSW1wbCBpbXBsZW1lbnRzIERhdGFtYXJ0VGFibGVEZXRhaWwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbkZvcm1hdHRlcnMoKSA8ZW0+Q29sdW1uIEZvcm1hdHRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sdW1uRm9ybWF0dGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERhdGFtYXJ0VGFibGVQcm9wZXJ0eT4gY29sdW1uRm9ybWF0dGVyczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydFRhYmxlRGV0YWlsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQU1BUlRfVEFCTEVfREVUQUlMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEYXRhbWFydFRhYmxlUHJvcGVydHk+IGdldENvbHVtbkZvcm1hdHRlcnMoKSB7CisJCWlmIChjb2x1bW5Gb3JtYXR0ZXJzID09IG51bGwpIHsKKwkJCWNvbHVtbkZvcm1hdHRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGF0YW1hcnRUYWJsZVByb3BlcnR5PihEYXRhbWFydFRhYmxlUHJvcGVydHkuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfREVUQUlMX19DT0xVTU5fRk9STUFUVEVSUyk7CisJCX0KKwkJcmV0dXJuIGNvbHVtbkZvcm1hdHRlcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb2x1bW5Gb3JtYXR0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlM6CisJCQkJcmV0dXJuIGdldENvbHVtbkZvcm1hdHRlcnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlM6CisJCQkJZ2V0Q29sdW1uRm9ybWF0dGVycygpLmNsZWFyKCk7CisJCQkJZ2V0Q29sdW1uRm9ybWF0dGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YW1hcnRUYWJsZVByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9ERVRBSUxfX0NPTFVNTl9GT1JNQVRURVJTOgorCQkJCWdldENvbHVtbkZvcm1hdHRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0RFVEFJTF9fQ09MVU1OX0ZPUk1BVFRFUlM6CisJCQkJcmV0dXJuIGNvbHVtbkZvcm1hdHRlcnMgIT0gbnVsbCAmJiAhY29sdW1uRm9ybWF0dGVycy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0RhdGFtYXJ0VGFibGVEZXRhaWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYzNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlckltcGwuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVHcmlkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXJJbXBsI2dldFJvd3MgPGVtPlJvd3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVySW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93cygpIDxlbT5Sb3dzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJvd3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxHcmlkUm93PiByb3dzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGUoKSA8ZW0+U3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGUgc3R5bGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxHcmlkUm93PiBnZXRSb3dzKCkgeworCQlpZiAocm93cyA9PSBudWxsKSB7CisJCQlyb3dzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEdyaWRSb3c+KEdyaWRSb3cuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTKTsKKwkJfQorCQlyZXR1cm4gcm93czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7CisJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTdHlsZSA9IChJbnRlcm5hbEVPYmplY3Qpc3R5bGU7CisJCQlzdHlsZSA9IChTdHlsZSllUmVzb2x2ZVByb3h5KG9sZFN0eWxlKTsKKwkJCWlmIChzdHlsZSAhPSBvbGRTdHlsZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldFN0eWxlKCkgeworCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgbmV3U3R5bGUpIHsKKwkJU3R5bGUgb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Um93cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfX1JPV1M6CisJCQkJcmV0dXJuIGdldFJvd3MoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfX1NUWUxFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U3R5bGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTdHlsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTOgorCQkJCWdldFJvd3MoKS5jbGVhcigpOworCQkJCWdldFJvd3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEdyaWRSb3c+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTOgorCQkJCWdldFJvd3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVJfX1JPV1M6CisJCQkJcmV0dXJuIHJvd3MgIT0gbnVsbCAmJiAhcm93cy5pc0VtcHR5KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19TVFlMRToKKwkJCQlyZXR1cm4gc3R5bGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFNvbWVHcmlkLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19ST1dTOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TT01FX0dSSURfX1JPV1M7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gV2l0aFN0eWxlLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19TVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9TVFlMRV9fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gU29tZUdyaWQuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0dSSURfX1JPV1M6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0ZPT1RFUl9fUk9XUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSX19TVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworfSAvL0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWJiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUdyaWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aFN0eWxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YW1hcnQgVGFibGUgR3JvdXAgSGVhZGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlckltcGwjZ2V0Um93cyA8ZW0+Um93czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJJbXBsI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3dzKCkgPGVtPlJvd3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Um93cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEdyaWRSb3c+IHJvd3M7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBzdHlsZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PEdyaWRSb3c+IGdldFJvd3MoKSB7CisJCWlmIChyb3dzID09IG51bGwpIHsKKwkJCXJvd3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8R3JpZFJvdz4oR3JpZFJvdy5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1JPV1MpOworCQl9CisJCXJldHVybiByb3dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN0eWxlID0gKEludGVybmFsRU9iamVjdClzdHlsZTsKKwkJCXN0eWxlID0gKFN0eWxlKWVSZXNvbHZlUHJveHkob2xkU3R5bGUpOworCQkJaWYgKHN0eWxlICE9IG9sZFN0eWxlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGJhc2ljR2V0U3R5bGUoKSB7CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZSBuZXdTdHlsZSkgeworCQlTdHlsZSBvbGRTdHlsZSA9IHN0eWxlOworCQlzdHlsZSA9IG5ld1N0eWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1JPV1M6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSb3dzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fUk9XUzoKKwkJCQlyZXR1cm4gZ2V0Um93cygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldFN0eWxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1JPV1M6CisJCQkJZ2V0Um93cygpLmNsZWFyKCk7CisJCQkJZ2V0Um93cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JpZFJvdz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1JPV1M6CisJCQkJZ2V0Um93cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX0hFQURFUl9fUk9XUzoKKwkJCQlyZXR1cm4gcm93cyAhPSBudWxsICYmICFyb3dzLmlzRW1wdHkoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1NUWUxFOgorCQkJCXJldHVybiBzdHlsZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gU29tZUdyaWQuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1JPV1M6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBTb21lR3JpZC5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSX19ST1dTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVJfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCit9IC8vRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVHcm91cEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9EYXRhbWFydFRhYmxlR3JvdXBJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMGQ4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9EYXRhbWFydFRhYmxlR3JvdXBJbXBsLmphdmEKQEAgLTAsMCArMSw1OTcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YW1hcnQgVGFibGUgR3JvdXA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwSW1wbCNpc0RldGFpbGhlYWRlciA8ZW0+RGV0YWlsaGVhZGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEltcGwjZ2V0SGVhZGVyc3R5bGUgPGVtPkhlYWRlcnN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVHcm91cEltcGwjaXNEZXRhaWxmb290ZXIgPGVtPkRldGFpbGZvb3RlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBJbXBsI2dldEZvb3RlcnN0eWxlIDxlbT5Gb290ZXJzdHlsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBJbXBsI2dldEdyb3VwaW5nUmVmIDxlbT5Hcm91cGluZyBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZUdyb3VwSW1wbCNnZXRIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlR3JvdXBJbXBsI2dldEZvb3RlciA8ZW0+Rm9vdGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRGF0YW1hcnRUYWJsZUdyb3VwSW1wbCBleHRlbmRzIFJlcG9ydEJhc2VJbXBsIGltcGxlbWVudHMgRGF0YW1hcnRUYWJsZUdyb3VwIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXRhaWxoZWFkZXIoKSA8ZW0+RGV0YWlsaGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGFpbGhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFVEFJTEhFQURFUl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXRhaWxoZWFkZXIoKSA8ZW0+RGV0YWlsaGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGFpbGhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsaGVhZGVyID0gREVUQUlMSEVBREVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVhZGVyc3R5bGUoKSA8ZW0+SGVhZGVyc3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhlYWRlcnN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGUgaGVhZGVyc3R5bGU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXRhaWxmb290ZXIoKSA8ZW0+RGV0YWlsZm9vdGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGFpbGZvb3RlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFVEFJTEZPT1RFUl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXRhaWxmb290ZXIoKSA8ZW0+RGV0YWlsZm9vdGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RldGFpbGZvb3RlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsZm9vdGVyID0gREVUQUlMRk9PVEVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9vdGVyc3R5bGUoKSA8ZW0+Rm9vdGVyc3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZvb3RlcnN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGUgZm9vdGVyc3R5bGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cGluZ1JlZigpIDxlbT5Hcm91cGluZyBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdyb3VwaW5nUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRQcm9wZXJ0eSBncm91cGluZ1JlZjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlYWRlcigpIDxlbT5IZWFkZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhlYWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERhdGFtYXJ0VGFibGVHcm91cEhlYWRlciBoZWFkZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb290ZXIoKSA8ZW0+Rm9vdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZm9vdGVyOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERhdGFtYXJ0VGFibGVHcm91cEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEFNQVJUX1RBQkxFX0dST1VQOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0YWlsaGVhZGVyKCkgeworCQlyZXR1cm4gZGV0YWlsaGVhZGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbGhlYWRlcihib29sZWFuIG5ld0RldGFpbGhlYWRlcikgeworCQlib29sZWFuIG9sZERldGFpbGhlYWRlciA9IGRldGFpbGhlYWRlcjsKKwkJZGV0YWlsaGVhZGVyID0gbmV3RGV0YWlsaGVhZGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxIRUFERVIsIG9sZERldGFpbGhlYWRlciwgZGV0YWlsaGVhZGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEhlYWRlcnN0eWxlKCkgeworCQlpZiAoaGVhZGVyc3R5bGUgIT0gbnVsbCAmJiBoZWFkZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkSGVhZGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWhlYWRlcnN0eWxlOworCQkJaGVhZGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRIZWFkZXJzdHlsZSk7CisJCQlpZiAoaGVhZGVyc3R5bGUgIT0gb2xkSGVhZGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVJTVFlMRSwgb2xkSGVhZGVyc3R5bGUsIGhlYWRlcnN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGhlYWRlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldEhlYWRlcnN0eWxlKCkgeworCQlyZXR1cm4gaGVhZGVyc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGVhZGVyc3R5bGUoU3R5bGUgbmV3SGVhZGVyc3R5bGUpIHsKKwkJU3R5bGUgb2xkSGVhZGVyc3R5bGUgPSBoZWFkZXJzdHlsZTsKKwkJaGVhZGVyc3R5bGUgPSBuZXdIZWFkZXJzdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSU1RZTEUsIG9sZEhlYWRlcnN0eWxlLCBoZWFkZXJzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0YWlsZm9vdGVyKCkgeworCQlyZXR1cm4gZGV0YWlsZm9vdGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbGZvb3Rlcihib29sZWFuIG5ld0RldGFpbGZvb3RlcikgeworCQlib29sZWFuIG9sZERldGFpbGZvb3RlciA9IGRldGFpbGZvb3RlcjsKKwkJZGV0YWlsZm9vdGVyID0gbmV3RGV0YWlsZm9vdGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxGT09URVIsIG9sZERldGFpbGZvb3RlciwgZGV0YWlsZm9vdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEZvb3RlcnN0eWxlKCkgeworCQlpZiAoZm9vdGVyc3R5bGUgIT0gbnVsbCAmJiBmb290ZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9vdGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWZvb3RlcnN0eWxlOworCQkJZm9vdGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRGb290ZXJzdHlsZSk7CisJCQlpZiAoZm9vdGVyc3R5bGUgIT0gb2xkRm9vdGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVJTVFlMRSwgb2xkRm9vdGVyc3R5bGUsIGZvb3RlcnN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvb3RlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldEZvb3RlcnN0eWxlKCkgeworCQlyZXR1cm4gZm9vdGVyc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9vdGVyc3R5bGUoU3R5bGUgbmV3Rm9vdGVyc3R5bGUpIHsKKwkJU3R5bGUgb2xkRm9vdGVyc3R5bGUgPSBmb290ZXJzdHlsZTsKKwkJZm9vdGVyc3R5bGUgPSBuZXdGb290ZXJzdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSU1RZTEUsIG9sZEZvb3RlcnN0eWxlLCBmb290ZXJzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydFByb3BlcnR5IGdldEdyb3VwaW5nUmVmKCkgeworCQlpZiAoZ3JvdXBpbmdSZWYgIT0gbnVsbCAmJiBncm91cGluZ1JlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkR3JvdXBpbmdSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KWdyb3VwaW5nUmVmOworCQkJZ3JvdXBpbmdSZWYgPSAoRGF0YW1hcnRQcm9wZXJ0eSllUmVzb2x2ZVByb3h5KG9sZEdyb3VwaW5nUmVmKTsKKwkJCWlmIChncm91cGluZ1JlZiAhPSBvbGRHcm91cGluZ1JlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0dST1VQSU5HX1JFRiwgb2xkR3JvdXBpbmdSZWYsIGdyb3VwaW5nUmVmKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdyb3VwaW5nUmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydFByb3BlcnR5IGJhc2ljR2V0R3JvdXBpbmdSZWYoKSB7CisJCXJldHVybiBncm91cGluZ1JlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHcm91cGluZ1JlZihEYXRhbWFydFByb3BlcnR5IG5ld0dyb3VwaW5nUmVmKSB7CisJCURhdGFtYXJ0UHJvcGVydHkgb2xkR3JvdXBpbmdSZWYgPSBncm91cGluZ1JlZjsKKwkJZ3JvdXBpbmdSZWYgPSBuZXdHcm91cGluZ1JlZjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fR1JPVVBJTkdfUkVGLCBvbGRHcm91cGluZ1JlZiwgZ3JvdXBpbmdSZWYpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIGdldEhlYWRlcigpIHsKKwkJcmV0dXJuIGhlYWRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRIZWFkZXIoRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIG5ld0hlYWRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgb2xkSGVhZGVyID0gaGVhZGVyOworCQloZWFkZXIgPSBuZXdIZWFkZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0hFQURFUiwgb2xkSGVhZGVyLCBuZXdIZWFkZXIpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlYWRlcihEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgbmV3SGVhZGVyKSB7CisJCWlmIChuZXdIZWFkZXIgIT0gaGVhZGVyKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChoZWFkZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGVhZGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdIZWFkZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGVhZGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEhlYWRlcihuZXdIZWFkZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSLCBuZXdIZWFkZXIsIG5ld0hlYWRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZ2V0Rm9vdGVyKCkgeworCQlyZXR1cm4gZm9vdGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZvb3RlcihEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgbmV3Rm9vdGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCURhdGFtYXJ0VGFibGVHcm91cEZvb3RlciBvbGRGb290ZXIgPSBmb290ZXI7CisJCWZvb3RlciA9IG5ld0Zvb3RlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSLCBvbGRGb290ZXIsIG5ld0Zvb3Rlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9vdGVyKERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciBuZXdGb290ZXIpIHsKKwkJaWYgKG5ld0Zvb3RlciAhPSBmb290ZXIpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGZvb3RlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmb290ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0Zvb3RlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGb290ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Rm9vdGVyKG5ld0Zvb3RlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVIsIG5ld0Zvb3RlciwgbmV3Rm9vdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0SGVhZGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0Rm9vdGVyKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0RFVEFJTEhFQURFUjoKKwkJCQlyZXR1cm4gaXNEZXRhaWxoZWFkZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRIZWFkZXJzdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldEhlYWRlcnN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0RFVEFJTEZPT1RFUjoKKwkJCQlyZXR1cm4gaXNEZXRhaWxmb290ZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGb290ZXJzdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldEZvb3RlcnN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0dST1VQSU5HX1JFRjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEdyb3VwaW5nUmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0R3JvdXBpbmdSZWYoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSOgorCQkJCXJldHVybiBnZXRIZWFkZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSOgorCQkJCXJldHVybiBnZXRGb290ZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxIRUFERVI6CisJCQkJc2V0RGV0YWlsaGVhZGVyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0hFQURFUlNUWUxFOgorCQkJCXNldEhlYWRlcnN0eWxlKChTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxGT09URVI6CisJCQkJc2V0RGV0YWlsZm9vdGVyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUlNUWUxFOgorCQkJCXNldEZvb3RlcnN0eWxlKChTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19HUk9VUElOR19SRUY6CisJCQkJc2V0R3JvdXBpbmdSZWYoKERhdGFtYXJ0UHJvcGVydHkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSOgorCQkJCXNldEhlYWRlcigoRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUjoKKwkJCQlzZXRGb290ZXIoKERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fREVUQUlMSEVBREVSOgorCQkJCXNldERldGFpbGhlYWRlcihERVRBSUxIRUFERVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSU1RZTEU6CisJCQkJc2V0SGVhZGVyc3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fREVUQUlMRk9PVEVSOgorCQkJCXNldERldGFpbGZvb3RlcihERVRBSUxGT09URVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSU1RZTEU6CisJCQkJc2V0Rm9vdGVyc3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fR1JPVVBJTkdfUkVGOgorCQkJCXNldEdyb3VwaW5nUmVmKChEYXRhbWFydFByb3BlcnR5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fSEVBREVSOgorCQkJCXNldEhlYWRlcigoRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9fRk9PVEVSOgorCQkJCXNldEZvb3RlcigoRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxIRUFERVI6CisJCQkJcmV0dXJuIGRldGFpbGhlYWRlciAhPSBERVRBSUxIRUFERVJfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0hFQURFUlNUWUxFOgorCQkJCXJldHVybiBoZWFkZXJzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxGT09URVI6CisJCQkJcmV0dXJuIGRldGFpbGZvb3RlciAhPSBERVRBSUxGT09URVJfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUlNUWUxFOgorCQkJCXJldHVybiBmb290ZXJzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19HUk9VUElOR19SRUY6CisJCQkJcmV0dXJuIGdyb3VwaW5nUmVmICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0hFQURFUjoKKwkJCQlyZXR1cm4gaGVhZGVyICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUjoKKwkJCQlyZXR1cm4gZm9vdGVyICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0RFVEFJTEhFQURFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfX0RFVEFJTEZPT1RFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVI6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxIRUFERVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fSEVBREVSU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVJTVFlMRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVI6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19ERVRBSUxGT09URVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fRk9PVEVSU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQX19GT09URVJTVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXRhaWxoZWFkZXI6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRldGFpbGhlYWRlcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGV0YWlsZm9vdGVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXRhaWxmb290ZXIpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9EYXRhbWFydFRhYmxlR3JvdXBJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9EYXRhbWFydFRhYmxlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2QzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZUltcGwuamF2YQpAQCAtMCwwICsxLDU5NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGFtYXJ0IFRhYmxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVJbXBsI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbCNpc0RldGFpbGhlYWRlciA8ZW0+RGV0YWlsaGVhZGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVJbXBsI2dldEhlYWRlcnN0eWxlIDxlbT5IZWFkZXJzdHlsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbCNpc0RldGFpbGZvb3RlciA8ZW0+RGV0YWlsZm9vdGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVJbXBsI2dldEZvb3RlcnN0eWxlIDxlbT5Gb290ZXJzdHlsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbCNnZXRHcm91cHMgPGVtPkdyb3VwczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlSW1wbCNnZXREZXRhaWwgPGVtPkRldGFpbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGFtYXJ0VGFibGVJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBEYXRhbWFydFRhYmxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBzdHlsZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RldGFpbGhlYWRlcigpIDxlbT5EZXRhaWxoZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGV0YWlsaGVhZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVUQUlMSEVBREVSX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RldGFpbGhlYWRlcigpIDxlbT5EZXRhaWxoZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGV0YWlsaGVhZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxoZWFkZXIgPSBERVRBSUxIRUFERVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWFkZXJzdHlsZSgpIDxlbT5IZWFkZXJzdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGVhZGVyc3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBoZWFkZXJzdHlsZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RldGFpbGZvb3RlcigpIDxlbT5EZXRhaWxmb290ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGV0YWlsZm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVUQUlMRk9PVEVSX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RldGFpbGZvb3RlcigpIDxlbT5EZXRhaWxmb290ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGV0YWlsZm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxmb290ZXIgPSBERVRBSUxGT09URVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb290ZXJzdHlsZSgpIDxlbT5Gb290ZXJzdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9vdGVyc3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBmb290ZXJzdHlsZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwcygpIDxlbT5Hcm91cHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R3JvdXBzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RGF0YW1hcnRUYWJsZUdyb3VwPiBncm91cHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXRhaWwoKSA8ZW0+RGV0YWlsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXRhaWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydFRhYmxlRGV0YWlsIGRldGFpbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydFRhYmxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQU1BUlRfVEFCTEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldFN0eWxlKCkgeworCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KXN0eWxlOworCQkJc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRTdHlsZSk7CisJCQlpZiAoc3R5bGUgIT0gb2xkU3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldFN0eWxlKCkgeworCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgbmV3U3R5bGUpIHsKKwkJU3R5bGUgb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0YWlsaGVhZGVyKCkgeworCQlyZXR1cm4gZGV0YWlsaGVhZGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbGhlYWRlcihib29sZWFuIG5ld0RldGFpbGhlYWRlcikgeworCQlib29sZWFuIG9sZERldGFpbGhlYWRlciA9IGRldGFpbGhlYWRlcjsKKwkJZGV0YWlsaGVhZGVyID0gbmV3RGV0YWlsaGVhZGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxIRUFERVIsIG9sZERldGFpbGhlYWRlciwgZGV0YWlsaGVhZGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEhlYWRlcnN0eWxlKCkgeworCQlpZiAoaGVhZGVyc3R5bGUgIT0gbnVsbCAmJiBoZWFkZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkSGVhZGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWhlYWRlcnN0eWxlOworCQkJaGVhZGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRIZWFkZXJzdHlsZSk7CisJCQlpZiAoaGVhZGVyc3R5bGUgIT0gb2xkSGVhZGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19IRUFERVJTVFlMRSwgb2xkSGVhZGVyc3R5bGUsIGhlYWRlcnN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGhlYWRlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldEhlYWRlcnN0eWxlKCkgeworCQlyZXR1cm4gaGVhZGVyc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGVhZGVyc3R5bGUoU3R5bGUgbmV3SGVhZGVyc3R5bGUpIHsKKwkJU3R5bGUgb2xkSGVhZGVyc3R5bGUgPSBoZWFkZXJzdHlsZTsKKwkJaGVhZGVyc3R5bGUgPSBuZXdIZWFkZXJzdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fSEVBREVSU1RZTEUsIG9sZEhlYWRlcnN0eWxlLCBoZWFkZXJzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0YWlsZm9vdGVyKCkgeworCQlyZXR1cm4gZGV0YWlsZm9vdGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbGZvb3Rlcihib29sZWFuIG5ld0RldGFpbGZvb3RlcikgeworCQlib29sZWFuIG9sZERldGFpbGZvb3RlciA9IGRldGFpbGZvb3RlcjsKKwkJZGV0YWlsZm9vdGVyID0gbmV3RGV0YWlsZm9vdGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxGT09URVIsIG9sZERldGFpbGZvb3RlciwgZGV0YWlsZm9vdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEZvb3RlcnN0eWxlKCkgeworCQlpZiAoZm9vdGVyc3R5bGUgIT0gbnVsbCAmJiBmb290ZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9vdGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWZvb3RlcnN0eWxlOworCQkJZm9vdGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRGb290ZXJzdHlsZSk7CisJCQlpZiAoZm9vdGVyc3R5bGUgIT0gb2xkRm9vdGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19GT09URVJTVFlMRSwgb2xkRm9vdGVyc3R5bGUsIGZvb3RlcnN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvb3RlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldEZvb3RlcnN0eWxlKCkgeworCQlyZXR1cm4gZm9vdGVyc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9vdGVyc3R5bGUoU3R5bGUgbmV3Rm9vdGVyc3R5bGUpIHsKKwkJU3R5bGUgb2xkRm9vdGVyc3R5bGUgPSBmb290ZXJzdHlsZTsKKwkJZm9vdGVyc3R5bGUgPSBuZXdGb290ZXJzdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fRk9PVEVSU1RZTEUsIG9sZEZvb3RlcnN0eWxlLCBmb290ZXJzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxEYXRhbWFydFRhYmxlR3JvdXA+IGdldEdyb3VwcygpIHsKKwkJaWYgKGdyb3VwcyA9PSBudWxsKSB7CisJCQlncm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGF0YW1hcnRUYWJsZUdyb3VwPihEYXRhbWFydFRhYmxlR3JvdXAuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0dST1VQUyk7CisJCX0KKwkJcmV0dXJuIGdyb3VwczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZURldGFpbCBnZXREZXRhaWwoKSB7CisJCXJldHVybiBkZXRhaWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGV0YWlsKERhdGFtYXJ0VGFibGVEZXRhaWwgbmV3RGV0YWlsLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCURhdGFtYXJ0VGFibGVEZXRhaWwgb2xkRGV0YWlsID0gZGV0YWlsOworCQlkZXRhaWwgPSBuZXdEZXRhaWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTCwgb2xkRGV0YWlsLCBuZXdEZXRhaWwpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbChEYXRhbWFydFRhYmxlRGV0YWlsIG5ld0RldGFpbCkgeworCQlpZiAobmV3RGV0YWlsICE9IGRldGFpbCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGV0YWlsICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRldGFpbCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RGV0YWlsICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0RldGFpbCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREZXRhaWwobmV3RGV0YWlsLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTCwgbmV3RGV0YWlsLCBuZXdEZXRhaWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0dST1VQUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTDoKKwkJCQlyZXR1cm4gYmFzaWNTZXREZXRhaWwobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldFN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEhFQURFUjoKKwkJCQlyZXR1cm4gaXNEZXRhaWxoZWFkZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fSEVBREVSU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRIZWFkZXJzdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldEhlYWRlcnN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEZPT1RFUjoKKwkJCQlyZXR1cm4gaXNEZXRhaWxmb290ZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fRk9PVEVSU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGb290ZXJzdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldEZvb3RlcnN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0dST1VQUzoKKwkJCQlyZXR1cm4gZ2V0R3JvdXBzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTDoKKwkJCQlyZXR1cm4gZ2V0RGV0YWlsKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEhFQURFUjoKKwkJCQlzZXREZXRhaWxoZWFkZXIoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fSEVBREVSU1RZTEU6CisJCQkJc2V0SGVhZGVyc3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEZPT1RFUjoKKwkJCQlzZXREZXRhaWxmb290ZXIoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9fRk9PVEVSU1RZTEU6CisJCQkJc2V0Rm9vdGVyc3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0dST1VQUzoKKwkJCQlnZXRHcm91cHMoKS5jbGVhcigpOworCQkJCWdldEdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YW1hcnRUYWJsZUdyb3VwPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUw6CisJCQkJc2V0RGV0YWlsKChEYXRhbWFydFRhYmxlRGV0YWlsKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxIRUFERVI6CisJCQkJc2V0RGV0YWlsaGVhZGVyKERFVEFJTEhFQURFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19IRUFERVJTVFlMRToKKwkJCQlzZXRIZWFkZXJzdHlsZSgoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxGT09URVI6CisJCQkJc2V0RGV0YWlsZm9vdGVyKERFVEFJTEZPT1RFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19GT09URVJTVFlMRToKKwkJCQlzZXRGb290ZXJzdHlsZSgoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19HUk9VUFM6CisJCQkJZ2V0R3JvdXBzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTDoKKwkJCQlzZXREZXRhaWwoKERhdGFtYXJ0VGFibGVEZXRhaWwpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX1NUWUxFOgorCQkJCXJldHVybiBzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxIRUFERVI6CisJCQkJcmV0dXJuIGRldGFpbGhlYWRlciAhPSBERVRBSUxIRUFERVJfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0hFQURFUlNUWUxFOgorCQkJCXJldHVybiBoZWFkZXJzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUxGT09URVI6CisJCQkJcmV0dXJuIGRldGFpbGZvb3RlciAhPSBERVRBSUxGT09URVJfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0ZPT1RFUlNUWUxFOgorCQkJCXJldHVybiBmb290ZXJzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19HUk9VUFM6CisJCQkJcmV0dXJuIGdyb3VwcyAhPSBudWxsICYmICFncm91cHMuaXNFbXB0eSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19ERVRBSUw6CisJCQkJcmV0dXJuIGRldGFpbCAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gRWxlbWVudC5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gV2l0aFN0eWxlLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEhFQURFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19IRUFERVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEZPT1RFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVI7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX19GT09URVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBFbGVtZW50LmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFdpdGhIZWFkZXJGb290ZXIuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEhFQURFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEhFQURFUjsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0hFQURFUlNUWUxFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEZPT1RFUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0RFVEFJTEZPT1RFUjsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfX0ZPT1RFUlNUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRldGFpbGhlYWRlcjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGV0YWlsaGVhZGVyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXRhaWxmb290ZXI6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRldGFpbGZvb3Rlcik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0RhdGFtYXJ0VGFibGVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVQcm9wZXJ0eUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRlNTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGFtYXJ0VGFibGVQcm9wZXJ0eUltcGwuamF2YQpAQCAtMCwwICsxLDYwNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVWYWx1ZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aFN0eWxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlUHJvcGVydHlJbXBsI2dldEludGVydmFscyA8ZW0+SW50ZXJ2YWxzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eUltcGwjaXNIaWRlTGFiZWxJbnRlcnZhbCA8ZW0+SGlkZSBMYWJlbCBJbnRlcnZhbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5EYXRhbWFydFRhYmxlUHJvcGVydHlJbXBsI2dldExvb2t1cHMgPGVtPkxvb2t1cHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCNpc0hpZGVMYWJlbExvb2t1cCA8ZW0+SGlkZSBMYWJlbCBMb29rdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCNpc0hhc0ltYWdlIDxlbT5IYXMgSW1hZ2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCNnZXRJbWFnZSA8ZW0+SW1hZ2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhbWFydFRhYmxlUHJvcGVydHlJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIERhdGFtYXJ0VGFibGVQcm9wZXJ0eSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGUoKSA8ZW0+U3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGUgc3R5bGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZVZhbHVlRWxlbWVudCBjb2x1bW47CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcnZhbHMoKSA8ZW0+SW50ZXJ2YWxzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEludGVydmFscygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFRhYmxlSW50ZXJ2YWw+IGludGVydmFsczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVMYWJlbEludGVydmFsKCkgPGVtPkhpZGUgTGFiZWwgSW50ZXJ2YWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGlkZUxhYmVsSW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0xBQkVMX0lOVEVSVkFMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVMYWJlbEludGVydmFsKCkgPGVtPkhpZGUgTGFiZWwgSW50ZXJ2YWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGlkZUxhYmVsSW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhpZGVMYWJlbEludGVydmFsID0gSElERV9MQUJFTF9JTlRFUlZBTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cHMoKSA8ZW0+TG9va3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8VGFibGVMb29rdXA+IGxvb2t1cHM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlTGFiZWxMb29rdXAoKSA8ZW0+SGlkZSBMYWJlbCBMb29rdXA8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGlkZUxhYmVsTG9va3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElERV9MQUJFTF9MT09LVVBfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGlkZUxhYmVsTG9va3VwKCkgPGVtPkhpZGUgTGFiZWwgTG9va3VwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0hpZGVMYWJlbExvb2t1cCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGlkZUxhYmVsTG9va3VwID0gSElERV9MQUJFTF9MT09LVVBfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNJbWFnZSgpIDxlbT5IYXMgSW1hZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGFzSW1hZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfSU1BR0VfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzSW1hZ2UoKSA8ZW0+SGFzIEltYWdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0hhc0ltYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNJbWFnZSA9IEhBU19JTUFHRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltYWdlKCkgPGVtPkltYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbWFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlSW1hZ2UgaW1hZ2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldFN0eWxlKCkgeworCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KXN0eWxlOworCQkJc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRTdHlsZSk7CisJCQlpZiAoc3R5bGUgIT0gb2xkU3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldFN0eWxlKCkgeworCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgbmV3U3R5bGUpIHsKKwkJU3R5bGUgb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVZhbHVlRWxlbWVudCBnZXRDb2x1bW4oKSB7CisJCXJldHVybiBjb2x1bW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sdW1uKFRhYmxlVmFsdWVFbGVtZW50IG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlUYWJsZVZhbHVlRWxlbWVudCBvbGRDb2x1bW4gPSBjb2x1bW47CisJCWNvbHVtbiA9IG5ld0NvbHVtbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29sdW1uKFRhYmxlVmFsdWVFbGVtZW50IG5ld0NvbHVtbikgeworCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8VGFibGVJbnRlcnZhbD4gZ2V0SW50ZXJ2YWxzKCkgeworCQlpZiAoaW50ZXJ2YWxzID09IG51bGwpIHsKKwkJCWludGVydmFscyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxUYWJsZUludGVydmFsPihUYWJsZUludGVydmFsLmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTlRFUlZBTFMpOworCQl9CisJCXJldHVybiBpbnRlcnZhbHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNIaWRlTGFiZWxJbnRlcnZhbCgpIHsKKwkJcmV0dXJuIGhpZGVMYWJlbEludGVydmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhpZGVMYWJlbEludGVydmFsKGJvb2xlYW4gbmV3SGlkZUxhYmVsSW50ZXJ2YWwpIHsKKwkJYm9vbGVhbiBvbGRIaWRlTGFiZWxJbnRlcnZhbCA9IGhpZGVMYWJlbEludGVydmFsOworCQloaWRlTGFiZWxJbnRlcnZhbCA9IG5ld0hpZGVMYWJlbEludGVydmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19ISURFX0xBQkVMX0lOVEVSVkFMLCBvbGRIaWRlTGFiZWxJbnRlcnZhbCwgaGlkZUxhYmVsSW50ZXJ2YWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8VGFibGVMb29rdXA+IGdldExvb2t1cHMoKSB7CisJCWlmIChsb29rdXBzID09IG51bGwpIHsKKwkJCWxvb2t1cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8VGFibGVMb29rdXA+KFRhYmxlTG9va3VwLmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19MT09LVVBTKTsKKwkJfQorCQlyZXR1cm4gbG9va3VwczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0hpZGVMYWJlbExvb2t1cCgpIHsKKwkJcmV0dXJuIGhpZGVMYWJlbExvb2t1cDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIaWRlTGFiZWxMb29rdXAoYm9vbGVhbiBuZXdIaWRlTGFiZWxMb29rdXApIHsKKwkJYm9vbGVhbiBvbGRIaWRlTGFiZWxMb29rdXAgPSBoaWRlTGFiZWxMb29rdXA7CisJCWhpZGVMYWJlbExvb2t1cCA9IG5ld0hpZGVMYWJlbExvb2t1cDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9MT09LVVAsIG9sZEhpZGVMYWJlbExvb2t1cCwgaGlkZUxhYmVsTG9va3VwKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNIYXNJbWFnZSgpIHsKKwkJcmV0dXJuIGhhc0ltYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhhc0ltYWdlKGJvb2xlYW4gbmV3SGFzSW1hZ2UpIHsKKwkJYm9vbGVhbiBvbGRIYXNJbWFnZSA9IGhhc0ltYWdlOworCQloYXNJbWFnZSA9IG5ld0hhc0ltYWdlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19IQVNfSU1BR0UsIG9sZEhhc0ltYWdlLCBoYXNJbWFnZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZUltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW1hZ2UoVGFibGVJbWFnZSBuZXdJbWFnZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlUYWJsZUltYWdlIG9sZEltYWdlID0gaW1hZ2U7CisJCWltYWdlID0gbmV3SW1hZ2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFLCBvbGRJbWFnZSwgbmV3SW1hZ2UpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEltYWdlKFRhYmxlSW1hZ2UgbmV3SW1hZ2UpIHsKKwkJaWYgKG5ld0ltYWdlICE9IGltYWdlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChpbWFnZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbWFnZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdJbWFnZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbWFnZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEltYWdlKG5ld0ltYWdlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFLCBuZXdJbWFnZSwgbmV3SW1hZ2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0NPTFVNTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lOVEVSVkFMUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEludGVydmFscygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0xPT0tVUFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRMb29rdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSU1BR0U6CisJCQkJcmV0dXJuIGJhc2ljU2V0SW1hZ2UobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldFN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0NPTFVNTjoKKwkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lOVEVSVkFMUzoKKwkJCQlyZXR1cm4gZ2V0SW50ZXJ2YWxzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hJREVfTEFCRUxfSU5URVJWQUw6CisJCQkJcmV0dXJuIGlzSGlkZUxhYmVsSW50ZXJ2YWwoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fTE9PS1VQUzoKKwkJCQlyZXR1cm4gZ2V0TG9va3VwcygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19ISURFX0xBQkVMX0xPT0tVUDoKKwkJCQlyZXR1cm4gaXNIaWRlTGFiZWxMb29rdXAoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSEFTX0lNQUdFOgorCQkJCXJldHVybiBpc0hhc0ltYWdlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lNQUdFOgorCQkJCXJldHVybiBnZXRJbWFnZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19DT0xVTU46CisJCQkJc2V0Q29sdW1uKChUYWJsZVZhbHVlRWxlbWVudCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTlRFUlZBTFM6CisJCQkJZ2V0SW50ZXJ2YWxzKCkuY2xlYXIoKTsKKwkJCQlnZXRJbnRlcnZhbHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRhYmxlSW50ZXJ2YWw+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hJREVfTEFCRUxfSU5URVJWQUw6CisJCQkJc2V0SGlkZUxhYmVsSW50ZXJ2YWwoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fTE9PS1VQUzoKKwkJCQlnZXRMb29rdXBzKCkuY2xlYXIoKTsKKwkJCQlnZXRMb29rdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUYWJsZUxvb2t1cD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9MT09LVVA6CisJCQkJc2V0SGlkZUxhYmVsTG9va3VwKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hBU19JTUFHRToKKwkJCQlzZXRIYXNJbWFnZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTUFHRToKKwkJCQlzZXRJbWFnZSgoVGFibGVJbWFnZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoVGFibGVWYWx1ZUVsZW1lbnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTlRFUlZBTFM6CisJCQkJZ2V0SW50ZXJ2YWxzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hJREVfTEFCRUxfSU5URVJWQUw6CisJCQkJc2V0SGlkZUxhYmVsSW50ZXJ2YWwoSElERV9MQUJFTF9JTlRFUlZBTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19MT09LVVBTOgorCQkJCWdldExvb2t1cHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9MT09LVVA6CisJCQkJc2V0SGlkZUxhYmVsTG9va3VwKEhJREVfTEFCRUxfTE9PS1VQX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hBU19JTUFHRToKKwkJCQlzZXRIYXNJbWFnZShIQVNfSU1BR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSU1BR0U6CisJCQkJc2V0SW1hZ2UoKFRhYmxlSW1hZ2UpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX1NUWUxFOgorCQkJCXJldHVybiBzdHlsZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19DT0xVTU46CisJCQkJcmV0dXJuIGNvbHVtbiAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19JTlRFUlZBTFM6CisJCQkJcmV0dXJuIGludGVydmFscyAhPSBudWxsICYmICFpbnRlcnZhbHMuaXNFbXB0eSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19ISURFX0xBQkVMX0lOVEVSVkFMOgorCQkJCXJldHVybiBoaWRlTGFiZWxJbnRlcnZhbCAhPSBISURFX0xBQkVMX0lOVEVSVkFMX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19MT09LVVBTOgorCQkJCXJldHVybiBsb29rdXBzICE9IG51bGwgJiYgIWxvb2t1cHMuaXNFbXB0eSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19ISURFX0xBQkVMX0xPT0tVUDoKKwkJCQlyZXR1cm4gaGlkZUxhYmVsTG9va3VwICE9IEhJREVfTEFCRUxfTE9PS1VQX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19IQVNfSU1BR0U6CisJCQkJcmV0dXJuIGhhc0ltYWdlICE9IEhBU19JTUFHRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSU1BR0U6CisJCQkJcmV0dXJuIGltYWdlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaGlkZUxhYmVsSW50ZXJ2YWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKGhpZGVMYWJlbEludGVydmFsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBoaWRlTGFiZWxMb29rdXA6ICIpOworCQlyZXN1bHQuYXBwZW5kKGhpZGVMYWJlbExvb2t1cCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGFzSW1hZ2U6ICIpOworCQlyZXN1bHQuYXBwZW5kKGhhc0ltYWdlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGVGb3JtYXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0ZUZvcm1hdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDZiYjJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGVGb3JtYXRJbXBsLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdENhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0ZSBGb3JtYXQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRGF0ZUZvcm1hdEltcGwjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlRm9ybWF0SW1wbCBleHRlbmRzIFNvbWVGb3JtYXRJbXBsIGltcGxlbWVudHMgRGF0ZUZvcm1hdCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydF9jYXRlZ29yeSgpIDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA9IERhdGVGb3JtYXRDYXRlZ29yeUVudW0uQ1VTVE9NOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0ZUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfY2F0ZWdvcnkgPSBSRVBPUlRfQ0FURUdPUllfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0ZUZvcm1hdEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEVfRk9STUFUOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldFJlcG9ydF9jYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHJlcG9ydF9jYXRlZ29yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXBvcnRfY2F0ZWdvcnkoRGF0ZUZvcm1hdENhdGVnb3J5RW51bSBuZXdSZXBvcnRfY2F0ZWdvcnkpIHsKKwkJRGF0ZUZvcm1hdENhdGVnb3J5RW51bSBvbGRSZXBvcnRfY2F0ZWdvcnkgPSByZXBvcnRfY2F0ZWdvcnk7CisJCXJlcG9ydF9jYXRlZ29yeSA9IG5ld1JlcG9ydF9jYXRlZ29yeSA9PSBudWxsID8gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUIDogbmV3UmVwb3J0X2NhdGVnb3J5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkRBVEVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlksIG9sZFJlcG9ydF9jYXRlZ29yeSwgcmVwb3J0X2NhdGVnb3J5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJcmV0dXJuIGdldFJlcG9ydF9jYXRlZ29yeSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlzZXRSZXBvcnRfY2F0ZWdvcnkoKERhdGVGb3JtYXRDYXRlZ29yeUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlzZXRSZXBvcnRfY2F0ZWdvcnkoUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXJldHVybiByZXBvcnRfY2F0ZWdvcnkgIT0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVwb3J0X2NhdGVnb3J5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZXBvcnRfY2F0ZWdvcnkpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9EYXRlRm9ybWF0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGVUaW1lRm9ybWF0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0RhdGVUaW1lRm9ybWF0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmQ3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvRGF0ZVRpbWVGb3JtYXRJbXBsLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EYXRlIFRpbWUgRm9ybWF0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkRhdGVUaW1lRm9ybWF0SW1wbCNnZXRSZXBvcnRfY2F0ZWdvcnkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGVUaW1lRm9ybWF0SW1wbCBleHRlbmRzIFNvbWVGb3JtYXRJbXBsIGltcGxlbWVudHMgRGF0ZVRpbWVGb3JtYXQgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRfY2F0ZWdvcnkoKSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUID0gRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0uQ1VTVE9NOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkgPGVtPlJlcG9ydCBjYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVwb3J0X2NhdGVnb3J5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X2NhdGVnb3J5ID0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERhdGVUaW1lRm9ybWF0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFURV9USU1FX0ZPUk1BVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gZ2V0UmVwb3J0X2NhdGVnb3J5KCkgeworCQlyZXR1cm4gcmVwb3J0X2NhdGVnb3J5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcG9ydF9jYXRlZ29yeShEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSBuZXdSZXBvcnRfY2F0ZWdvcnkpIHsKKwkJRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gb2xkUmVwb3J0X2NhdGVnb3J5ID0gcmVwb3J0X2NhdGVnb3J5OworCQlyZXBvcnRfY2F0ZWdvcnkgPSBuZXdSZXBvcnRfY2F0ZWdvcnkgPT0gbnVsbCA/IFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA6IG5ld1JlcG9ydF9jYXRlZ29yeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlksIG9sZFJlcG9ydF9jYXRlZ29yeSwgcmVwb3J0X2NhdGVnb3J5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEVfVElNRV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlyZXR1cm4gZ2V0UmVwb3J0X2NhdGVnb3J5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJc2V0UmVwb3J0X2NhdGVnb3J5KChEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJc2V0UmVwb3J0X2NhdGVnb3J5KFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXJldHVybiByZXBvcnRfY2F0ZWdvcnkgIT0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVwb3J0X2NhdGVnb3J5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZXBvcnRfY2F0ZWdvcnkpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9EYXRlVGltZUZvcm1hdEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Gb250SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0ZvbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkZGIyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Gb250SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDc4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW07CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Gb250PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRJbXBsI2dldEV4dGVuZHMgPGVtPkV4dGVuZHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRm9udEltcGwjZ2V0RmFtaWx5IDxlbT5GYW1pbHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuRm9udEltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRJbXBsI2lzQm9sZCA8ZW0+Qm9sZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Gb250SW1wbCNnZXRTaXpldmFsdWUgPGVtPlNpemV2YWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Gb250SW1wbCNnZXRTaXpldW5pdCA8ZW0+U2l6ZXVuaXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBGb250SW1wbCBleHRlbmRzIFJlcG9ydEJhc2VJbXBsIGltcGxlbWVudHMgRm9udCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kcygpIDxlbT5FeHRlbmRzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeHRlbmRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9udCBleHRlbmRzXzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZhbWlseSgpIDxlbT5GYW1pbHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZhbWlseSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEZvbnRGYW1pbHkgZmFtaWx5OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGb250U3R5bGVFbnVtIFNUWUxFX0VERUZBVUxUID0gRm9udFN0eWxlRW51bS5OT1JNQUw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBGb250U3R5bGVFbnVtIHN0eWxlID0gU1RZTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb2xkKCkgPGVtPkJvbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQm9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEJPTERfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQm9sZCgpIDxlbT5Cb2xkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0JvbGQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGJvbGQgPSBCT0xEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemV2YWx1ZSgpIDxlbT5TaXpldmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpemV2YWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0laRVZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZXZhbHVlKCkgPGVtPlNpemV2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2l6ZXZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHNpemV2YWx1ZSA9IFNJWkVWQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXpldW5pdCgpIDxlbT5TaXpldW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2l6ZXVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gU0laRVVOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZXVuaXQoKSA8ZW0+U2l6ZXVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpemV1bml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gc2l6ZXVuaXQgPSBTSVpFVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBGb250SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuRk9OVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9udCBnZXRFeHRlbmRzKCkgeworCQlpZiAoZXh0ZW5kc18gIT0gbnVsbCAmJiBleHRlbmRzXy5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRXh0ZW5kcyA9IChJbnRlcm5hbEVPYmplY3QpZXh0ZW5kc187CisJCQlleHRlbmRzXyA9IChGb250KWVSZXNvbHZlUHJveHkob2xkRXh0ZW5kcyk7CisJCQlpZiAoZXh0ZW5kc18gIT0gb2xkRXh0ZW5kcykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fRVhURU5EUywgb2xkRXh0ZW5kcywgZXh0ZW5kc18pKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZXh0ZW5kc187CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvbnQgYmFzaWNHZXRFeHRlbmRzKCkgeworCQlyZXR1cm4gZXh0ZW5kc187CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXh0ZW5kcyhGb250IG5ld0V4dGVuZHMpIHsKKwkJRm9udCBvbGRFeHRlbmRzID0gZXh0ZW5kc187CisJCWV4dGVuZHNfID0gbmV3RXh0ZW5kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5GT05UX19FWFRFTkRTLCBvbGRFeHRlbmRzLCBleHRlbmRzXykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250RmFtaWx5IGdldEZhbWlseSgpIHsKKwkJcmV0dXJuIGZhbWlseTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGYW1pbHkoRm9udEZhbWlseSBuZXdGYW1pbHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRm9udEZhbWlseSBvbGRGYW1pbHkgPSBmYW1pbHk7CisJCWZhbWlseSA9IG5ld0ZhbWlseTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5GT05UX19GQU1JTFksIG9sZEZhbWlseSwgbmV3RmFtaWx5KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGYW1pbHkoRm9udEZhbWlseSBuZXdGYW1pbHkpIHsKKwkJaWYgKG5ld0ZhbWlseSAhPSBmYW1pbHkpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGZhbWlseSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmYW1pbHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0ZBTUlMWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RmFtaWx5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ZhbWlseSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fRkFNSUxZLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEZhbWlseShuZXdGYW1pbHksIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5GT05UX19GQU1JTFksIG5ld0ZhbWlseSwgbmV3RmFtaWx5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvbnRTdHlsZUVudW0gZ2V0U3R5bGUoKSB7CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHlsZShGb250U3R5bGVFbnVtIG5ld1N0eWxlKSB7CisJCUZvbnRTdHlsZUVudW0gb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZSA9PSBudWxsID8gU1RZTEVfRURFRkFVTFQgOiBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5GT05UX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb2xkKCkgeworCQlyZXR1cm4gYm9sZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb2xkKGJvb2xlYW4gbmV3Qm9sZCkgeworCQlib29sZWFuIG9sZEJvbGQgPSBib2xkOworCQlib2xkID0gbmV3Qm9sZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5GT05UX19CT0xELCBvbGRCb2xkLCBib2xkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRTaXpldmFsdWUoKSB7CisJCXJldHVybiBzaXpldmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2l6ZXZhbHVlKGRvdWJsZSBuZXdTaXpldmFsdWUpIHsKKwkJZG91YmxlIG9sZFNpemV2YWx1ZSA9IHNpemV2YWx1ZTsKKwkJc2l6ZXZhbHVlID0gbmV3U2l6ZXZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NJWkVWQUxVRSwgb2xkU2l6ZXZhbHVlLCBzaXpldmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0U2l6ZXVuaXQoKSB7CisJCXJldHVybiBzaXpldW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXpldW5pdChVbml0RW51bSBuZXdTaXpldW5pdCkgeworCQlVbml0RW51bSBvbGRTaXpldW5pdCA9IHNpemV1bml0OworCQlzaXpldW5pdCA9IG5ld1NpemV1bml0ID09IG51bGwgPyBTSVpFVU5JVF9FREVGQVVMVCA6IG5ld1NpemV1bml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NJWkVVTklULCBvbGRTaXpldW5pdCwgc2l6ZXVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fRkFNSUxZOgorCQkJCXJldHVybiBiYXNpY1NldEZhbWlseShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0VYVEVORFM6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFeHRlbmRzKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RXh0ZW5kcygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0ZBTUlMWToKKwkJCQlyZXR1cm4gZ2V0RmFtaWx5KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fU1RZTEU6CisJCQkJcmV0dXJuIGdldFN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fQk9MRDoKKwkJCQlyZXR1cm4gaXNCb2xkKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fU0laRVZBTFVFOgorCQkJCXJldHVybiBnZXRTaXpldmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19TSVpFVU5JVDoKKwkJCQlyZXR1cm4gZ2V0U2l6ZXVuaXQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0VYVEVORFM6CisJCQkJc2V0RXh0ZW5kcygoRm9udCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0ZBTUlMWToKKwkJCQlzZXRGYW1pbHkoKEZvbnRGYW1pbHkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoRm9udFN0eWxlRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0JPTEQ6CisJCQkJc2V0Qm9sZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NJWkVWQUxVRToKKwkJCQlzZXRTaXpldmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NJWkVVTklUOgorCQkJCXNldFNpemV1bml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19FWFRFTkRTOgorCQkJCXNldEV4dGVuZHMoKEZvbnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0ZBTUlMWToKKwkJCQlzZXRGYW1pbHkoKEZvbnRGYW1pbHkpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NUWUxFOgorCQkJCXNldFN0eWxlKFNUWUxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fQk9MRDoKKwkJCQlzZXRCb2xkKEJPTERfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19TSVpFVkFMVUU6CisJCQkJc2V0U2l6ZXZhbHVlKFNJWkVWQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX1NJWkVVTklUOgorCQkJCXNldFNpemV1bml0KFNJWkVVTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19FWFRFTkRTOgorCQkJCXJldHVybiBleHRlbmRzXyAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0ZBTUlMWToKKwkJCQlyZXR1cm4gZmFtaWx5ICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fU1RZTEU6CisJCQkJcmV0dXJuIHN0eWxlICE9IFNUWUxFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfX0JPTEQ6CisJCQkJcmV0dXJuIGJvbGQgIT0gQk9MRF9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UX19TSVpFVkFMVUU6CisJCQkJcmV0dXJuIHNpemV2YWx1ZSAhPSBTSVpFVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9fU0laRVVOSVQ6CisJCQkJcmV0dXJuIHNpemV1bml0ICE9IFNJWkVVTklUX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc3R5bGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHN0eWxlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBib2xkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChib2xkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzaXpldmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNpemV2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZXVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNpemV1bml0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vRm9udEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Gb250c0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Gb250c0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IxODI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0ZvbnRzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZvbnRzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkZvbnRzSW1wbCNnZXRGb250cyA8ZW0+Rm9udHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBGb250c0ltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgRm9udHMgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvbnRzKCkgPGVtPkZvbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZvbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Rm9udD4gZm9udHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9udHNJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5GT05UUzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8Rm9udD4gZ2V0Rm9udHMoKSB7CisJCWlmIChmb250cyA9PSBudWxsKSB7CisJCQlmb250cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxGb250PihGb250LmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLkZPTlRTX19GT05UUyk7CisJCX0KKwkJcmV0dXJuIGZvbnRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UU19fRk9OVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGb250cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UU19fRk9OVFM6CisJCQkJcmV0dXJuIGdldEZvbnRzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UU19fRk9OVFM6CisJCQkJZ2V0Rm9udHMoKS5jbGVhcigpOworCQkJCWdldEZvbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGb250PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UU19fRk9OVFM6CisJCQkJZ2V0Rm9udHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRTX19GT05UUzoKKwkJCQlyZXR1cm4gZm9udHMgIT0gbnVsbCAmJiAhZm9udHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9Gb250c0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9HcmlkQ2VsbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9HcmlkQ2VsbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY2NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0dyaWRDZWxsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyaWQgQ2VsbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5HcmlkQ2VsbEltcGwjZ2V0RWxlbWVudHMgPGVtPkVsZW1lbnRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRDZWxsSW1wbCNnZXRDb2x1bW5zcGFuIDxlbT5Db2x1bW5zcGFuPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgR3JpZENlbGxJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBHcmlkQ2VsbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudHMoKSA8ZW0+RWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWxlbWVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxFbGVtZW50PiBlbGVtZW50czsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5zcGFuKCkgPGVtPkNvbHVtbnNwYW48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbHVtbnNwYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTlNQQU5fRURFRkFVTFQgPSAwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uc3BhbigpIDxlbT5Db2x1bW5zcGFuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb2x1bW5zcGFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGNvbHVtbnNwYW4gPSBDT0xVTU5TUEFOX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEdyaWRDZWxsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuR1JJRF9DRUxMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxFbGVtZW50PiBnZXRFbGVtZW50cygpIHsKKwkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKKwkJCWVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVsZW1lbnQ+KEVsZW1lbnQuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9DRUxMX19FTEVNRU5UUyk7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q29sdW1uc3BhbigpIHsKKwkJcmV0dXJuIGNvbHVtbnNwYW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29sdW1uc3BhbihpbnQgbmV3Q29sdW1uc3BhbikgeworCQlpbnQgb2xkQ29sdW1uc3BhbiA9IGNvbHVtbnNwYW47CisJCWNvbHVtbnNwYW4gPSBuZXdDb2x1bW5zcGFuOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTF9fQ09MVU1OU1BBTiwgb2xkQ29sdW1uc3BhbiwgY29sdW1uc3BhbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTExfX0VMRU1FTlRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9DRUxMX19FTEVNRU5UUzoKKwkJCQlyZXR1cm4gZ2V0RWxlbWVudHMoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTExfX0NPTFVNTlNQQU46CisJCQkJcmV0dXJuIGdldENvbHVtbnNwYW4oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTF9fRUxFTUVOVFM6CisJCQkJZ2V0RWxlbWVudHMoKS5jbGVhcigpOworCQkJCWdldEVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbGVtZW50PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTF9fQ09MVU1OU1BBTjoKKwkJCQlzZXRDb2x1bW5zcGFuKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTF9fRUxFTUVOVFM6CisJCQkJZ2V0RWxlbWVudHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTExfX0NPTFVNTlNQQU46CisJCQkJc2V0Q29sdW1uc3BhbihDT0xVTU5TUEFOX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTExfX0VMRU1FTlRTOgorCQkJCXJldHVybiBlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9DRUxMX19DT0xVTU5TUEFOOgorCQkJCXJldHVybiBjb2x1bW5zcGFuICE9IENPTFVNTlNQQU5fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTExfX0VMRU1FTlRTOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5DT05UQUlORVJfX0VMRU1FTlRTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbnRhaW5lci5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTlRBSU5FUl9fRUxFTUVOVFM6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTF9fRUxFTUVOVFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoY29sdW1uc3BhbjogIik7CisJCXJlc3VsdC5hcHBlbmQoY29sdW1uc3Bhbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0dyaWRDZWxsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0dyaWRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvR3JpZEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFjMGZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0dyaWRJbXBsLmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lR3JpZDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyaWQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZEltcGwjZ2V0Um93cyA8ZW0+Um93czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdyaWRJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBHcmlkIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3dzKCkgPGVtPlJvd3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Um93cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEdyaWRSb3c+IHJvd3M7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkdSSUQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PEdyaWRSb3c+IGdldFJvd3MoKSB7CisJCWlmIChyb3dzID09IG51bGwpIHsKKwkJCXJvd3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8R3JpZFJvdz4oR3JpZFJvdy5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5HUklEX19ST1dTKTsKKwkJfQorCQlyZXR1cm4gcm93czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9fUk9XUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJvd3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9fUk9XUzoKKwkJCQlyZXR1cm4gZ2V0Um93cygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9fUk9XUzoKKwkJCQlnZXRSb3dzKCkuY2xlYXIoKTsKKwkJCQlnZXRSb3dzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmlkUm93PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX19ST1dTOgorCQkJCWdldFJvd3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfX1JPV1M6CisJCQkJcmV0dXJuIHJvd3MgIT0gbnVsbCAmJiAhcm93cy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBFbGVtZW50LmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBTb21lR3JpZC5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfX1JPV1M6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBFbGVtZW50LmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBTb21lR3JpZC5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9fUk9XUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworfSAvL0dyaWRJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvR3JpZFJvd0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9HcmlkUm93SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjNhODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvR3JpZFJvd0ltcGwuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aFN0eWxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JpZCBSb3c8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuR3JpZFJvd0ltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkdyaWRSb3dJbXBsI2dldENlbGxzIDxlbT5DZWxsczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEdyaWRSb3dJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBHcmlkUm93IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBzdHlsZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENlbGxzKCkgPGVtPkNlbGxzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENlbGxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8R3JpZENlbGw+IGNlbGxzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEdyaWRSb3dJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5HUklEX1JPVzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7CisJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTdHlsZSA9IChJbnRlcm5hbEVPYmplY3Qpc3R5bGU7CisJCQlzdHlsZSA9IChTdHlsZSllUmVzb2x2ZVByb3h5KG9sZFN0eWxlKTsKKwkJCWlmIChzdHlsZSAhPSBvbGRTdHlsZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGJhc2ljR2V0U3R5bGUoKSB7CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZSBuZXdTdHlsZSkgeworCQlTdHlsZSBvbGRTdHlsZSA9IHN0eWxlOworCQlzdHlsZSA9IG5ld1N0eWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLkdSSURfUk9XX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PEdyaWRDZWxsPiBnZXRDZWxscygpIHsKKwkJaWYgKGNlbGxzID09IG51bGwpIHsKKwkJCWNlbGxzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEdyaWRDZWxsPihHcmlkQ2VsbC5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5HUklEX1JPV19fQ0VMTFMpOworCQl9CisJCXJldHVybiBjZWxsczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX0NFTExTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q2VsbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX1NUWUxFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U3R5bGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTdHlsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfUk9XX19DRUxMUzoKKwkJCQlyZXR1cm4gZ2V0Q2VsbHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfUk9XX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX1JPV19fQ0VMTFM6CisJCQkJZ2V0Q2VsbHMoKS5jbGVhcigpOworCQkJCWdldENlbGxzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmlkQ2VsbD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX0NFTExTOgorCQkJCWdldENlbGxzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX1JPV19fU1RZTEU6CisJCQkJcmV0dXJuIHN0eWxlICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1dfX0NFTExTOgorCQkJCXJldHVybiBjZWxscyAhPSBudWxsICYmICFjZWxscy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX1JPV19fU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5HUklEX1JPV19fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKK30gLy9HcmlkUm93SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0ltYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0ltYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTkwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvSW1hZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw0MzIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTaXplRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNvdXJjZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5JbWFnZUltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkltYWdlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkltYWdlSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuSW1hZ2VJbXBsI2dldFNvdXJjZVR5cGUgPGVtPlNvdXJjZSBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLkltYWdlSW1wbCNnZXRGaWxlbmFtZSA8ZW0+RmlsZW5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBJbWFnZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgSW1hZ2UgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0eWxlKCkgPGVtPlN0eWxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0eWxlIHN0eWxlOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZVNpemVFbnVtIFNJWkVfRURFRkFVTFQgPSBJbWFnZVNpemVFbnVtLlNJWkVfVE9fSU1BR0U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbWFnZVNpemVFbnVtIHNpemUgPSBTSVpFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgU0NBTEVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgc2NhbGUgPSBTQ0FMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VUeXBlKCkgPGVtPlNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlU291cmNlRW51bSBTT1VSQ0VfVFlQRV9FREVGQVVMVCA9IEltYWdlU291cmNlRW51bS5GSUxFOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlVHlwZSgpIDxlbT5Tb3VyY2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEltYWdlU291cmNlRW51bSBzb3VyY2VUeXBlID0gU09VUkNFX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsZW5hbWUoKSA8ZW0+RmlsZW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbGVuYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlbmFtZSgpIDxlbT5GaWxlbmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmlsZW5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZmlsZW5hbWUgPSBGSUxFTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBJbWFnZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLklNQUdFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN0eWxlID0gKEludGVybmFsRU9iamVjdClzdHlsZTsKKwkJCXN0eWxlID0gKFN0eWxlKWVSZXNvbHZlUHJveHkob2xkU3R5bGUpOworCQkJaWYgKHN0eWxlICE9IG9sZFN0eWxlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOworCQkJfQorCQl9CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgYmFzaWNHZXRTdHlsZSgpIHsKKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIG5ld1N0eWxlKSB7CisJCVN0eWxlIG9sZFN0eWxlID0gc3R5bGU7CisJCXN0eWxlID0gbmV3U3R5bGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW1hZ2VTaXplRW51bSBnZXRTaXplKCkgeworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXplKEltYWdlU2l6ZUVudW0gbmV3U2l6ZSkgeworCQlJbWFnZVNpemVFbnVtIG9sZFNpemUgPSBzaXplOworCQlzaXplID0gbmV3U2l6ZSA9PSBudWxsID8gU0laRV9FREVGQVVMVCA6IG5ld1NpemU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFNjYWxlKCkgeworCQlyZXR1cm4gc2NhbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2NhbGUoZG91YmxlIG5ld1NjYWxlKSB7CisJCWRvdWJsZSBvbGRTY2FsZSA9IHNjYWxlOworCQlzY2FsZSA9IG5ld1NjYWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TQ0FMRSwgb2xkU2NhbGUsIHNjYWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEltYWdlU291cmNlRW51bSBnZXRTb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gc291cmNlVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2VUeXBlKEltYWdlU291cmNlRW51bSBuZXdTb3VyY2VUeXBlKSB7CisJCUltYWdlU291cmNlRW51bSBvbGRTb3VyY2VUeXBlID0gc291cmNlVHlwZTsKKwkJc291cmNlVHlwZSA9IG5ld1NvdXJjZVR5cGUgPT0gbnVsbCA/IFNPVVJDRV9UWVBFX0VERUZBVUxUIDogbmV3U291cmNlVHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU09VUkNFX1RZUEUsIG9sZFNvdXJjZVR5cGUsIHNvdXJjZVR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgeworCQlyZXR1cm4gZmlsZW5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIG5ld0ZpbGVuYW1lKSB7CisJCVN0cmluZyBvbGRGaWxlbmFtZSA9IGZpbGVuYW1lOworCQlmaWxlbmFtZSA9IG5ld0ZpbGVuYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19GSUxFTkFNRSwgb2xkRmlsZW5hbWUsIGZpbGVuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TVFlMRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFN0eWxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U3R5bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU0laRToKKwkJCQlyZXR1cm4gZ2V0U2l6ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TQ0FMRToKKwkJCQlyZXR1cm4gZ2V0U2NhbGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU09VUkNFX1RZUEU6CisJCQkJcmV0dXJuIGdldFNvdXJjZVR5cGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fRklMRU5BTUU6CisJCQkJcmV0dXJuIGdldEZpbGVuYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX1NJWkU6CisJCQkJc2V0U2l6ZSgoSW1hZ2VTaXplRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TQ0FMRToKKwkJCQlzZXRTY2FsZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX1NPVVJDRV9UWVBFOgorCQkJCXNldFNvdXJjZVR5cGUoKEltYWdlU291cmNlRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19GSUxFTkFNRToKKwkJCQlzZXRGaWxlbmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TVFlMRToKKwkJCQlzZXRTdHlsZSgoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TSVpFOgorCQkJCXNldFNpemUoU0laRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TQ0FMRToKKwkJCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TT1VSQ0VfVFlQRToKKwkJCQlzZXRTb3VyY2VUeXBlKFNPVVJDRV9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX0ZJTEVOQU1FOgorCQkJCXNldEZpbGVuYW1lKEZJTEVOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU1RZTEU6CisJCQkJcmV0dXJuIHN0eWxlICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfX1NJWkU6CisJCQkJcmV0dXJuIHNpemUgIT0gU0laRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU0NBTEU6CisJCQkJcmV0dXJuIHNjYWxlICE9IFNDQUxFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklNQUdFX19TT1VSQ0VfVFlQRToKKwkJCQlyZXR1cm4gc291cmNlVHlwZSAhPSBTT1VSQ0VfVFlQRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fRklMRU5BTUU6CisJCQkJcmV0dXJuIEZJTEVOQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWxlbmFtZSAhPSBudWxsIDogIUZJTEVOQU1FX0VERUZBVUxULmVxdWFscyhmaWxlbmFtZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBXaXRoU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9fU1RZTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc2l6ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoc2l6ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2NhbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzb3VyY2VUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzb3VyY2VUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmaWxlbmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZmlsZW5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9JbWFnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9MYWJlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9MYWJlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQwYjcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL0xhYmVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbEltcGwgZXh0ZW5kcyBUZXh0RWxlbWVudEltcGwgaW1wbGVtZW50cyBMYWJlbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExhYmVsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuTEFCRUw7CisJfQorCit9IC8vTGFiZWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTWVkaWFJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTWVkaWFJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZjBjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9NZWRpYUltcGwuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lZGlhPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWVkaWFJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBNZWRpYSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1lZGlhSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuTUVESUE7CisJfQorCit9IC8vTWVkaWFJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTWVkaWFTdHlsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9NZWRpYVN0eWxlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTVjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTWVkaWFTdHlsZUltcGwuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZWRpYSBTdHlsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5NZWRpYVN0eWxlSW1wbCNnZXRNZWRpYSA8ZW0+TWVkaWE8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVN0eWxlSW1wbCBleHRlbmRzIEJhc2VTdHlsZUltcGwgaW1wbGVtZW50cyBNZWRpYVN0eWxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZWRpYSgpIDxlbT5NZWRpYTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWVkaWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNZWRpYSBtZWRpYTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBNZWRpYVN0eWxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuTUVESUFfU1RZTEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1lZGlhIGdldE1lZGlhKCkgeworCQlpZiAobWVkaWEgIT0gbnVsbCAmJiBtZWRpYS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkTWVkaWEgPSAoSW50ZXJuYWxFT2JqZWN0KW1lZGlhOworCQkJbWVkaWEgPSAoTWVkaWEpZVJlc29sdmVQcm94eShvbGRNZWRpYSk7CisJCQlpZiAobWVkaWEgIT0gb2xkTWVkaWEpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLk1FRElBX1NUWUxFX19NRURJQSwgb2xkTWVkaWEsIG1lZGlhKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1lZGlhOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZWRpYSBiYXNpY0dldE1lZGlhKCkgeworCQlyZXR1cm4gbWVkaWE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWVkaWEoTWVkaWEgbmV3TWVkaWEpIHsKKwkJTWVkaWEgb2xkTWVkaWEgPSBtZWRpYTsKKwkJbWVkaWEgPSBuZXdNZWRpYTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5NRURJQV9TVFlMRV9fTUVESUEsIG9sZE1lZGlhLCBtZWRpYSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQV9TVFlMRV9fTUVESUE6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNZWRpYSgpOworCQkJCXJldHVybiBiYXNpY0dldE1lZGlhKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQV9TVFlMRV9fTUVESUE6CisJCQkJc2V0TWVkaWEoKE1lZGlhKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBX1NUWUxFX19NRURJQToKKwkJCQlzZXRNZWRpYSgoTWVkaWEpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTUVESUFfU1RZTEVfX01FRElBOgorCQkJCXJldHVybiBtZWRpYSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9NZWRpYVN0eWxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL01lZGlhc0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9NZWRpYXNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlYmJjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9NZWRpYXNJbXBsLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZWRpYXM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuTWVkaWFzSW1wbCNnZXRNZWRpYXMgPGVtPk1lZGlhczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE1lZGlhc0ltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgTWVkaWFzIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZWRpYXMoKSA8ZW0+TWVkaWFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1lZGlhcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE1lZGlhPiBtZWRpYXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWVkaWFzSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuTUVESUFTOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxNZWRpYT4gZ2V0TWVkaWFzKCkgeworCQlpZiAobWVkaWFzID09IG51bGwpIHsKKwkJCW1lZGlhcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZWRpYT4oTWVkaWEuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuTUVESUFTX19NRURJQVMpOworCQl9CisJCXJldHVybiBtZWRpYXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBU19fTUVESUFTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVkaWFzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBU19fTUVESUFTOgorCQkJCXJldHVybiBnZXRNZWRpYXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBU19fTUVESUFTOgorCQkJCWdldE1lZGlhcygpLmNsZWFyKCk7CisJCQkJZ2V0TWVkaWFzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZWRpYT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTUVESUFTX19NRURJQVM6CisJCQkJZ2V0TWVkaWFzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQVNfX01FRElBUzoKKwkJCQlyZXR1cm4gbWVkaWFzICE9IG51bGwgJiYgIW1lZGlhcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL01lZGlhc0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9OdW1iZXJGb3JtYXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTnVtYmVyRm9ybWF0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjU0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvTnVtYmVyRm9ybWF0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdW1iZXIgRm9ybWF0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLk51bWJlckZvcm1hdEltcGwjZ2V0UmVwb3J0X2NhdGVnb3J5IDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBOdW1iZXJGb3JtYXRJbXBsIGV4dGVuZHMgU29tZUZvcm1hdEltcGwgaW1wbGVtZW50cyBOdW1iZXJGb3JtYXQgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRfY2F0ZWdvcnkoKSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA9IE51bWJlckZvcm1hdENhdGVnb3J5RW51bS5VTkZPUk1BVFRFRDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydF9jYXRlZ29yeSgpIDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE51bWJlckZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfY2F0ZWdvcnkgPSBSRVBPUlRfQ0FURUdPUllfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTnVtYmVyRm9ybWF0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuTlVNQkVSX0ZPUk1BVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIGdldFJlcG9ydF9jYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHJlcG9ydF9jYXRlZ29yeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXBvcnRfY2F0ZWdvcnkoTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIG5ld1JlcG9ydF9jYXRlZ29yeSkgeworCQlOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gb2xkUmVwb3J0X2NhdGVnb3J5ID0gcmVwb3J0X2NhdGVnb3J5OworCQlyZXBvcnRfY2F0ZWdvcnkgPSBuZXdSZXBvcnRfY2F0ZWdvcnkgPT0gbnVsbCA/IFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA6IG5ld1JlcG9ydF9jYXRlZ29yeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5OVU1CRVJfRk9STUFUX19SRVBPUlRfQ0FURUdPUlksIG9sZFJlcG9ydF9jYXRlZ29yeSwgcmVwb3J0X2NhdGVnb3J5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk5VTUJFUl9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlyZXR1cm4gZ2V0UmVwb3J0X2NhdGVnb3J5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5OVU1CRVJfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJc2V0UmVwb3J0X2NhdGVnb3J5KChOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTlVNQkVSX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXNldFJlcG9ydF9jYXRlZ29yeShSRVBPUlRfQ0FURUdPUllfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk5VTUJFUl9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlyZXR1cm4gcmVwb3J0X2NhdGVnb3J5ICE9IFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJlcG9ydF9jYXRlZ29yeTogIik7CisJCXJlc3VsdC5hcHBlbmQocmVwb3J0X2NhdGVnb3J5KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vTnVtYmVyRm9ybWF0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VEZXRhaWxJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZURldGFpbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMwMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VEZXRhaWxJbXBsLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VEZXRhaWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgRGV0YWlsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGFnZURldGFpbEltcGwgZXh0ZW5kcyBDb250YWluZXJJbXBsIGltcGxlbWVudHMgUGFnZURldGFpbCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBhZ2VEZXRhaWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5QQUdFX0RFVEFJTDsKKwl9CisKK30gLy9QYWdlRGV0YWlsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VGb290ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZUZvb3RlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU2MjYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VGb290ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgRm9vdGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VGb290ZXJJbXBsI2lzU2hvd09uTGFzdCA8ZW0+U2hvdyBPbiBMYXN0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VGb290ZXJJbXBsI2dldEhlaWdodFZhbHVlIDxlbT5IZWlnaHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUZvb3RlckltcGwjZ2V0SGVpZ2h0VW5pdCA8ZW0+SGVpZ2h0IFVuaXQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQYWdlRm9vdGVySW1wbCBleHRlbmRzIENvbnRhaW5lckltcGwgaW1wbGVtZW50cyBQYWdlRm9vdGVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTaG93T25MYXN0KCkgPGVtPlNob3cgT24gTGFzdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTaG93T25MYXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19PTl9MQVNUX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Nob3dPbkxhc3QoKSA8ZW0+U2hvdyBPbiBMYXN0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1Nob3dPbkxhc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3dPbkxhc3QgPSBTSE9XX09OX0xBU1RfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0VmFsdWUoKSA8ZW0+SGVpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgSEVJR0hUX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0VmFsdWUoKSA8ZW0+SGVpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBoZWlnaHRWYWx1ZSA9IEhFSUdIVF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHRVbml0KCkgPGVtPkhlaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIEhFSUdIVF9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodFVuaXQoKSA8ZW0+SGVpZ2h0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhlaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBoZWlnaHRVbml0ID0gSEVJR0hUX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFnZUZvb3RlckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlBBR0VfRk9PVEVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2hvd09uTGFzdCgpIHsKKwkJcmV0dXJuIHNob3dPbkxhc3Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2hvd09uTGFzdChib29sZWFuIG5ld1Nob3dPbkxhc3QpIHsKKwkJYm9vbGVhbiBvbGRTaG93T25MYXN0ID0gc2hvd09uTGFzdDsKKwkJc2hvd09uTGFzdCA9IG5ld1Nob3dPbkxhc3Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX1NIT1dfT05fTEFTVCwgb2xkU2hvd09uTGFzdCwgc2hvd09uTGFzdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SGVpZ2h0VmFsdWUoKSB7CisJCXJldHVybiBoZWlnaHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIZWlnaHRWYWx1ZShkb3VibGUgbmV3SGVpZ2h0VmFsdWUpIHsKKwkJZG91YmxlIG9sZEhlaWdodFZhbHVlID0gaGVpZ2h0VmFsdWU7CisJCWhlaWdodFZhbHVlID0gbmV3SGVpZ2h0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX0hFSUdIVF9WQUxVRSwgb2xkSGVpZ2h0VmFsdWUsIGhlaWdodFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldEhlaWdodFVuaXQoKSB7CisJCXJldHVybiBoZWlnaHRVbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlaWdodFVuaXQoVW5pdEVudW0gbmV3SGVpZ2h0VW5pdCkgeworCQlVbml0RW51bSBvbGRIZWlnaHRVbml0ID0gaGVpZ2h0VW5pdDsKKwkJaGVpZ2h0VW5pdCA9IG5ld0hlaWdodFVuaXQgPT0gbnVsbCA/IEhFSUdIVF9VTklUX0VERUZBVUxUIDogbmV3SGVpZ2h0VW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0ZPT1RFUl9fSEVJR0hUX1VOSVQsIG9sZEhlaWdodFVuaXQsIGhlaWdodFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX1NIT1dfT05fTEFTVDoKKwkJCQlyZXR1cm4gaXNTaG93T25MYXN0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX0hFSUdIVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0SGVpZ2h0VmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0ZPT1RFUl9fSEVJR0hUX1VOSVQ6CisJCQkJcmV0dXJuIGdldEhlaWdodFVuaXQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfRk9PVEVSX19TSE9XX09OX0xBU1Q6CisJCQkJc2V0U2hvd09uTGFzdCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfRk9PVEVSX19IRUlHSFRfVkFMVUU6CisJCQkJc2V0SGVpZ2h0VmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfRk9PVEVSX19IRUlHSFRfVU5JVDoKKwkJCQlzZXRIZWlnaHRVbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0ZPT1RFUl9fU0hPV19PTl9MQVNUOgorCQkJCXNldFNob3dPbkxhc3QoU0hPV19PTl9MQVNUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX0hFSUdIVF9WQUxVRToKKwkJCQlzZXRIZWlnaHRWYWx1ZShIRUlHSFRfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0ZPT1RFUl9fSEVJR0hUX1VOSVQ6CisJCQkJc2V0SGVpZ2h0VW5pdChIRUlHSFRfVU5JVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX1NIT1dfT05fTEFTVDoKKwkJCQlyZXR1cm4gc2hvd09uTGFzdCAhPSBTSE9XX09OX0xBU1RfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVJfX0hFSUdIVF9WQUxVRToKKwkJCQlyZXR1cm4gaGVpZ2h0VmFsdWUgIT0gSEVJR0hUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfRk9PVEVSX19IRUlHSFRfVU5JVDoKKwkJCQlyZXR1cm4gaGVpZ2h0VW5pdCAhPSBIRUlHSFRfVU5JVF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNob3dPbkxhc3Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNob3dPbkxhc3QpOworCQlyZXN1bHQuYXBwZW5kKCIsIGhlaWdodFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChoZWlnaHRWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0VW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQoaGVpZ2h0VW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BhZ2VGb290ZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZUhlYWRlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9QYWdlSGVhZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZUhlYWRlckltcGwuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFnZSBIZWFkZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZUhlYWRlckltcGwjaXNTaG93T25GaXJzdCA8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlSGVhZGVySW1wbCNnZXRIZWlnaHRWYWx1ZSA8ZW0+SGVpZ2h0IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VIZWFkZXJJbXBsI2dldEhlaWdodFVuaXQgPGVtPkhlaWdodCBVbml0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGFnZUhlYWRlckltcGwgZXh0ZW5kcyBDb250YWluZXJJbXBsIGltcGxlbWVudHMgUGFnZUhlYWRlciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2hvd09uRmlyc3QoKSA8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTaG93T25GaXJzdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfT05fRklSU1RfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2hvd09uRmlyc3QoKSA8ZW0+U2hvdyBPbiBGaXJzdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTaG93T25GaXJzdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd09uRmlyc3QgPSBTSE9XX09OX0ZJUlNUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodFZhbHVlKCkgPGVtPkhlaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGVpZ2h0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEhFSUdIVF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodFZhbHVlKCkgPGVtPkhlaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGVpZ2h0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgaGVpZ2h0VmFsdWUgPSBIRUlHSFRfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0VW5pdCgpIDxlbT5IZWlnaHQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGVpZ2h0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBIRUlHSFRfVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHRVbml0KCkgPGVtPkhlaWdodCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gaGVpZ2h0VW5pdCA9IEhFSUdIVF9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBhZ2VIZWFkZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5QQUdFX0hFQURFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Nob3dPbkZpcnN0KCkgeworCQlyZXR1cm4gc2hvd09uRmlyc3Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2hvd09uRmlyc3QoYm9vbGVhbiBuZXdTaG93T25GaXJzdCkgeworCQlib29sZWFuIG9sZFNob3dPbkZpcnN0ID0gc2hvd09uRmlyc3Q7CisJCXNob3dPbkZpcnN0ID0gbmV3U2hvd09uRmlyc3Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX1NIT1dfT05fRklSU1QsIG9sZFNob3dPbkZpcnN0LCBzaG93T25GaXJzdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0SGVpZ2h0VmFsdWUoKSB7CisJCXJldHVybiBoZWlnaHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIZWlnaHRWYWx1ZShkb3VibGUgbmV3SGVpZ2h0VmFsdWUpIHsKKwkJZG91YmxlIG9sZEhlaWdodFZhbHVlID0gaGVpZ2h0VmFsdWU7CisJCWhlaWdodFZhbHVlID0gbmV3SGVpZ2h0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX0hFSUdIVF9WQUxVRSwgb2xkSGVpZ2h0VmFsdWUsIGhlaWdodFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldEhlaWdodFVuaXQoKSB7CisJCXJldHVybiBoZWlnaHRVbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlaWdodFVuaXQoVW5pdEVudW0gbmV3SGVpZ2h0VW5pdCkgeworCQlVbml0RW51bSBvbGRIZWlnaHRVbml0ID0gaGVpZ2h0VW5pdDsKKwkJaGVpZ2h0VW5pdCA9IG5ld0hlaWdodFVuaXQgPT0gbnVsbCA/IEhFSUdIVF9VTklUX0VERUZBVUxUIDogbmV3SGVpZ2h0VW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUl9fSEVJR0hUX1VOSVQsIG9sZEhlaWdodFVuaXQsIGhlaWdodFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX1NIT1dfT05fRklSU1Q6CisJCQkJcmV0dXJuIGlzU2hvd09uRmlyc3QoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUl9fSEVJR0hUX1ZBTFVFOgorCQkJCXJldHVybiBnZXRIZWlnaHRWYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfSEVBREVSX19IRUlHSFRfVU5JVDoKKwkJCQlyZXR1cm4gZ2V0SGVpZ2h0VW5pdCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX1NIT1dfT05fRklSU1Q6CisJCQkJc2V0U2hvd09uRmlyc3QoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUl9fSEVJR0hUX1ZBTFVFOgorCQkJCXNldEhlaWdodFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUl9fSEVJR0hUX1VOSVQ6CisJCQkJc2V0SGVpZ2h0VW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX1NIT1dfT05fRklSU1Q6CisJCQkJc2V0U2hvd09uRmlyc3QoU0hPV19PTl9GSVJTVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfSEVBREVSX19IRUlHSFRfVkFMVUU6CisJCQkJc2V0SGVpZ2h0VmFsdWUoSEVJR0hUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVJfX0hFSUdIVF9VTklUOgorCQkJCXNldEhlaWdodFVuaXQoSEVJR0hUX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfSEVBREVSX19TSE9XX09OX0ZJUlNUOgorCQkJCXJldHVybiBzaG93T25GaXJzdCAhPSBTSE9XX09OX0ZJUlNUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfSEVBREVSX19IRUlHSFRfVkFMVUU6CisJCQkJcmV0dXJuIGhlaWdodFZhbHVlICE9IEhFSUdIVF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUl9fSEVJR0hUX1VOSVQ6CisJCQkJcmV0dXJuIGhlaWdodFVuaXQgIT0gSEVJR0hUX1VOSVRfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzaG93T25GaXJzdDogIik7CisJCXJlc3VsdC5hcHBlbmQoc2hvd09uRmlyc3QpOworCQlyZXN1bHQuYXBwZW5kKCIsIGhlaWdodFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChoZWlnaHRWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0VW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQoaGVpZ2h0VW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1BhZ2VIZWFkZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZVRlbXBsYXRlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VUZW1wbGF0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjVhM2MyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VUZW1wbGF0ZUltcGwuamF2YQpAQCAtMCwwICsxLDgxMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5PcmllbnRhdGlvbkVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgVGVtcGxhdGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZUltcGwjZ2V0T3JpZW50YXRpb24gPGVtPk9yaWVudGF0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZUltcGwjZ2V0VG9wTWFyZ2luVmFsdWUgPGVtPlRvcCBNYXJnaW4gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCNnZXRUb3BNYXJnaW5Vbml0IDxlbT5Ub3AgTWFyZ2luIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCNnZXRMZWZ0TWFyZ2luVmFsdWUgPGVtPkxlZnQgTWFyZ2luIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZUltcGwjZ2V0TGVmdE1hcmdpblVuaXQgPGVtPkxlZnQgTWFyZ2luIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCNnZXRCb3R0b21NYXJnaW5WYWx1ZSA8ZW0+Qm90dG9tIE1hcmdpbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVJbXBsI2dldEJvdHRvbU1hcmdpblVuaXQgPGVtPkJvdHRvbSBNYXJnaW4gVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVJbXBsI2dldFJpZ2h0TWFyZ2luVmFsdWUgPGVtPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVJbXBsI2dldFJpZ2h0TWFyZ2luVW5pdCA8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUGFnZVRlbXBsYXRlSW1wbCNnZXRIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5QYWdlVGVtcGxhdGVJbXBsI2dldEZvb3RlciA8ZW0+Rm9vdGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGFnZVRlbXBsYXRlSW1wbCBleHRlbmRzIFJlcG9ydEJhc2VJbXBsIGltcGxlbWVudHMgUGFnZVRlbXBsYXRlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhZ2VTaXplRW51bSBTSVpFX0VERUZBVUxUID0gUGFnZVNpemVFbnVtLkE0OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFnZVNpemVFbnVtIHNpemUgPSBTSVpFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yaWVudGF0aW9uKCkgPGVtPk9yaWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcmllbnRhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcmllbnRhdGlvbkVudW0gT1JJRU5UQVRJT05fRURFRkFVTFQgPSBPcmllbnRhdGlvbkVudW0uUE9SVFJBSVQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmllbnRhdGlvbigpIDxlbT5PcmllbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JpZW50YXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBPcmllbnRhdGlvbkVudW0gb3JpZW50YXRpb24gPSBPUklFTlRBVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3BNYXJnaW5WYWx1ZSgpIDxlbT5Ub3AgTWFyZ2luIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb3BNYXJnaW5WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgVE9QX01BUkdJTl9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvcE1hcmdpblZhbHVlKCkgPGVtPlRvcCBNYXJnaW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRvcE1hcmdpblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHRvcE1hcmdpblZhbHVlID0gVE9QX01BUkdJTl9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3BNYXJnaW5Vbml0KCkgPGVtPlRvcCBNYXJnaW4gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG9wTWFyZ2luVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBUT1BfTUFSR0lOX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9wTWFyZ2luVW5pdCgpIDxlbT5Ub3AgTWFyZ2luIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRvcE1hcmdpblVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSB0b3BNYXJnaW5Vbml0ID0gVE9QX01BUkdJTl9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlZnRNYXJnaW5WYWx1ZSgpIDxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGVmdE1hcmdpblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBMRUZUX01BUkdJTl9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlZnRNYXJnaW5WYWx1ZSgpIDxlbT5MZWZ0IE1hcmdpbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGVmdE1hcmdpblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGxlZnRNYXJnaW5WYWx1ZSA9IExFRlRfTUFSR0lOX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlZnRNYXJnaW5Vbml0KCkgPGVtPkxlZnQgTWFyZ2luIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExlZnRNYXJnaW5Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIExFRlRfTUFSR0lOX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVmdE1hcmdpblVuaXQoKSA8ZW0+TGVmdCBNYXJnaW4gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGVmdE1hcmdpblVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBsZWZ0TWFyZ2luVW5pdCA9IExFRlRfTUFSR0lOX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm90dG9tTWFyZ2luVmFsdWUoKSA8ZW0+Qm90dG9tIE1hcmdpbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Qm90dG9tTWFyZ2luVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEJPVFRPTV9NQVJHSU5fVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb3R0b21NYXJnaW5WYWx1ZSgpIDxlbT5Cb3R0b20gTWFyZ2luIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3R0b21NYXJnaW5WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBib3R0b21NYXJnaW5WYWx1ZSA9IEJPVFRPTV9NQVJHSU5fVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm90dG9tTWFyZ2luVW5pdCgpIDxlbT5Cb3R0b20gTWFyZ2luIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJvdHRvbU1hcmdpblVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gQk9UVE9NX01BUkdJTl9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvdHRvbU1hcmdpblVuaXQoKSA8ZW0+Qm90dG9tIE1hcmdpbiBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3R0b21NYXJnaW5Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gYm90dG9tTWFyZ2luVW5pdCA9IEJPVFRPTV9NQVJHSU5fVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaWdodE1hcmdpblZhbHVlKCkgPGVtPlJpZ2h0IE1hcmdpbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmlnaHRNYXJnaW5WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUklHSFRfTUFSR0lOX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmlnaHRNYXJnaW5WYWx1ZSgpIDxlbT5SaWdodCBNYXJnaW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJpZ2h0TWFyZ2luVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgcmlnaHRNYXJnaW5WYWx1ZSA9IFJJR0hUX01BUkdJTl9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaWdodE1hcmdpblVuaXQoKSA8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJpZ2h0TWFyZ2luVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBSSUdIVF9NQVJHSU5fVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaWdodE1hcmdpblVuaXQoKSA8ZW0+UmlnaHQgTWFyZ2luIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJpZ2h0TWFyZ2luVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIHJpZ2h0TWFyZ2luVW5pdCA9IFJJR0hUX01BUkdJTl9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVhZGVyKCkgPGVtPkhlYWRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SGVhZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFnZUhlYWRlciBoZWFkZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb290ZXIoKSA8ZW0+Rm9vdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQYWdlRm9vdGVyIGZvb3RlcjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQYWdlVGVtcGxhdGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5QQUdFX1RFTVBMQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlU2l6ZUVudW0gZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2l6ZShQYWdlU2l6ZUVudW0gbmV3U2l6ZSkgeworCQlQYWdlU2l6ZUVudW0gb2xkU2l6ZSA9IHNpemU7CisJCXNpemUgPSBuZXdTaXplID09IG51bGwgPyBTSVpFX0VERUZBVUxUIDogbmV3U2l6ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19TSVpFLCBvbGRTaXplLCBzaXplKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9yaWVudGF0aW9uRW51bSBnZXRPcmllbnRhdGlvbigpIHsKKwkJcmV0dXJuIG9yaWVudGF0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9yaWVudGF0aW9uKE9yaWVudGF0aW9uRW51bSBuZXdPcmllbnRhdGlvbikgeworCQlPcmllbnRhdGlvbkVudW0gb2xkT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKKwkJb3JpZW50YXRpb24gPSBuZXdPcmllbnRhdGlvbiA9PSBudWxsID8gT1JJRU5UQVRJT05fRURFRkFVTFQgOiBuZXdPcmllbnRhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19PUklFTlRBVElPTiwgb2xkT3JpZW50YXRpb24sIG9yaWVudGF0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRUb3BNYXJnaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIHRvcE1hcmdpblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRvcE1hcmdpblZhbHVlKGRvdWJsZSBuZXdUb3BNYXJnaW5WYWx1ZSkgeworCQlkb3VibGUgb2xkVG9wTWFyZ2luVmFsdWUgPSB0b3BNYXJnaW5WYWx1ZTsKKwkJdG9wTWFyZ2luVmFsdWUgPSBuZXdUb3BNYXJnaW5WYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1ZBTFVFLCBvbGRUb3BNYXJnaW5WYWx1ZSwgdG9wTWFyZ2luVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0VG9wTWFyZ2luVW5pdCgpIHsKKwkJcmV0dXJuIHRvcE1hcmdpblVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VG9wTWFyZ2luVW5pdChVbml0RW51bSBuZXdUb3BNYXJnaW5Vbml0KSB7CisJCVVuaXRFbnVtIG9sZFRvcE1hcmdpblVuaXQgPSB0b3BNYXJnaW5Vbml0OworCQl0b3BNYXJnaW5Vbml0ID0gbmV3VG9wTWFyZ2luVW5pdCA9PSBudWxsID8gVE9QX01BUkdJTl9VTklUX0VERUZBVUxUIDogbmV3VG9wTWFyZ2luVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1VOSVQsIG9sZFRvcE1hcmdpblVuaXQsIHRvcE1hcmdpblVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldExlZnRNYXJnaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIGxlZnRNYXJnaW5WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMZWZ0TWFyZ2luVmFsdWUoZG91YmxlIG5ld0xlZnRNYXJnaW5WYWx1ZSkgeworCQlkb3VibGUgb2xkTGVmdE1hcmdpblZhbHVlID0gbGVmdE1hcmdpblZhbHVlOworCQlsZWZ0TWFyZ2luVmFsdWUgPSBuZXdMZWZ0TWFyZ2luVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fTEVGVF9NQVJHSU5fVkFMVUUsIG9sZExlZnRNYXJnaW5WYWx1ZSwgbGVmdE1hcmdpblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldExlZnRNYXJnaW5Vbml0KCkgeworCQlyZXR1cm4gbGVmdE1hcmdpblVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TGVmdE1hcmdpblVuaXQoVW5pdEVudW0gbmV3TGVmdE1hcmdpblVuaXQpIHsKKwkJVW5pdEVudW0gb2xkTGVmdE1hcmdpblVuaXQgPSBsZWZ0TWFyZ2luVW5pdDsKKwkJbGVmdE1hcmdpblVuaXQgPSBuZXdMZWZ0TWFyZ2luVW5pdCA9PSBudWxsID8gTEVGVF9NQVJHSU5fVU5JVF9FREVGQVVMVCA6IG5ld0xlZnRNYXJnaW5Vbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1VOSVQsIG9sZExlZnRNYXJnaW5Vbml0LCBsZWZ0TWFyZ2luVW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0Qm90dG9tTWFyZ2luVmFsdWUoKSB7CisJCXJldHVybiBib3R0b21NYXJnaW5WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3R0b21NYXJnaW5WYWx1ZShkb3VibGUgbmV3Qm90dG9tTWFyZ2luVmFsdWUpIHsKKwkJZG91YmxlIG9sZEJvdHRvbU1hcmdpblZhbHVlID0gYm90dG9tTWFyZ2luVmFsdWU7CisJCWJvdHRvbU1hcmdpblZhbHVlID0gbmV3Qm90dG9tTWFyZ2luVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fQk9UVE9NX01BUkdJTl9WQUxVRSwgb2xkQm90dG9tTWFyZ2luVmFsdWUsIGJvdHRvbU1hcmdpblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldEJvdHRvbU1hcmdpblVuaXQoKSB7CisJCXJldHVybiBib3R0b21NYXJnaW5Vbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvdHRvbU1hcmdpblVuaXQoVW5pdEVudW0gbmV3Qm90dG9tTWFyZ2luVW5pdCkgeworCQlVbml0RW51bSBvbGRCb3R0b21NYXJnaW5Vbml0ID0gYm90dG9tTWFyZ2luVW5pdDsKKwkJYm90dG9tTWFyZ2luVW5pdCA9IG5ld0JvdHRvbU1hcmdpblVuaXQgPT0gbnVsbCA/IEJPVFRPTV9NQVJHSU5fVU5JVF9FREVGQVVMVCA6IG5ld0JvdHRvbU1hcmdpblVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fQk9UVE9NX01BUkdJTl9VTklULCBvbGRCb3R0b21NYXJnaW5Vbml0LCBib3R0b21NYXJnaW5Vbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRSaWdodE1hcmdpblZhbHVlKCkgeworCQlyZXR1cm4gcmlnaHRNYXJnaW5WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSaWdodE1hcmdpblZhbHVlKGRvdWJsZSBuZXdSaWdodE1hcmdpblZhbHVlKSB7CisJCWRvdWJsZSBvbGRSaWdodE1hcmdpblZhbHVlID0gcmlnaHRNYXJnaW5WYWx1ZTsKKwkJcmlnaHRNYXJnaW5WYWx1ZSA9IG5ld1JpZ2h0TWFyZ2luVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1ZBTFVFLCBvbGRSaWdodE1hcmdpblZhbHVlLCByaWdodE1hcmdpblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldFJpZ2h0TWFyZ2luVW5pdCgpIHsKKwkJcmV0dXJuIHJpZ2h0TWFyZ2luVW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSaWdodE1hcmdpblVuaXQoVW5pdEVudW0gbmV3UmlnaHRNYXJnaW5Vbml0KSB7CisJCVVuaXRFbnVtIG9sZFJpZ2h0TWFyZ2luVW5pdCA9IHJpZ2h0TWFyZ2luVW5pdDsKKwkJcmlnaHRNYXJnaW5Vbml0ID0gbmV3UmlnaHRNYXJnaW5Vbml0ID09IG51bGwgPyBSSUdIVF9NQVJHSU5fVU5JVF9FREVGQVVMVCA6IG5ld1JpZ2h0TWFyZ2luVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVU5JVCwgb2xkUmlnaHRNYXJnaW5Vbml0LCByaWdodE1hcmdpblVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGFnZUhlYWRlciBnZXRIZWFkZXIoKSB7CisJCXJldHVybiBoZWFkZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGVhZGVyKFBhZ2VIZWFkZXIgbmV3SGVhZGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVBhZ2VIZWFkZXIgb2xkSGVhZGVyID0gaGVhZGVyOworCQloZWFkZXIgPSBuZXdIZWFkZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fSEVBREVSLCBvbGRIZWFkZXIsIG5ld0hlYWRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SGVhZGVyKFBhZ2VIZWFkZXIgbmV3SGVhZGVyKSB7CisJCWlmIChuZXdIZWFkZXIgIT0gaGVhZGVyKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChoZWFkZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGVhZGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19IRUFERVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0hlYWRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIZWFkZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0hFQURFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRIZWFkZXIobmV3SGVhZGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fSEVBREVSLCBuZXdIZWFkZXIsIG5ld0hlYWRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlRm9vdGVyIGdldEZvb3RlcigpIHsKKwkJcmV0dXJuIGZvb3RlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGb290ZXIoUGFnZUZvb3RlciBuZXdGb290ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJUGFnZUZvb3RlciBvbGRGb290ZXIgPSBmb290ZXI7CisJCWZvb3RlciA9IG5ld0Zvb3RlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19GT09URVIsIG9sZEZvb3RlciwgbmV3Rm9vdGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb290ZXIoUGFnZUZvb3RlciBuZXdGb290ZXIpIHsKKwkJaWYgKG5ld0Zvb3RlciAhPSBmb290ZXIpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGZvb3RlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClmb290ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0ZPT1RFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Rm9vdGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Zvb3RlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fRk9PVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEZvb3RlcihuZXdGb290ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19GT09URVIsIG5ld0Zvb3RlciwgbmV3Rm9vdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0hFQURFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRIZWFkZXIobnVsbCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fRk9PVEVSOgorCQkJCXJldHVybiBiYXNpY1NldEZvb3RlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1NJWkU6CisJCQkJcmV0dXJuIGdldFNpemUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19PUklFTlRBVElPTjoKKwkJCQlyZXR1cm4gZ2V0T3JpZW50YXRpb24oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiBnZXRUb3BNYXJnaW5WYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1RPUF9NQVJHSU5fVU5JVDoKKwkJCQlyZXR1cm4gZ2V0VG9wTWFyZ2luVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiBnZXRMZWZ0TWFyZ2luVmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19MRUZUX01BUkdJTl9VTklUOgorCQkJCXJldHVybiBnZXRMZWZ0TWFyZ2luVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0JPVFRPTV9NQVJHSU5fVkFMVUU6CisJCQkJcmV0dXJuIGdldEJvdHRvbU1hcmdpblZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fQk9UVE9NX01BUkdJTl9VTklUOgorCQkJCXJldHVybiBnZXRCb3R0b21NYXJnaW5Vbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiBnZXRSaWdodE1hcmdpblZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1VOSVQ6CisJCQkJcmV0dXJuIGdldFJpZ2h0TWFyZ2luVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0hFQURFUjoKKwkJCQlyZXR1cm4gZ2V0SGVhZGVyKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fRk9PVEVSOgorCQkJCXJldHVybiBnZXRGb290ZXIoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1NJWkU6CisJCQkJc2V0U2l6ZSgoUGFnZVNpemVFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fT1JJRU5UQVRJT046CisJCQkJc2V0T3JpZW50YXRpb24oKE9yaWVudGF0aW9uRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1RPUF9NQVJHSU5fVkFMVUU6CisJCQkJc2V0VG9wTWFyZ2luVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1RPUF9NQVJHSU5fVU5JVDoKKwkJCQlzZXRUb3BNYXJnaW5Vbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1ZBTFVFOgorCQkJCXNldExlZnRNYXJnaW5WYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fTEVGVF9NQVJHSU5fVU5JVDoKKwkJCQlzZXRMZWZ0TWFyZ2luVW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1ZBTFVFOgorCQkJCXNldEJvdHRvbU1hcmdpblZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1VOSVQ6CisJCQkJc2V0Qm90dG9tTWFyZ2luVW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVkFMVUU6CisJCQkJc2V0UmlnaHRNYXJnaW5WYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1VOSVQ6CisJCQkJc2V0UmlnaHRNYXJnaW5Vbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0hFQURFUjoKKwkJCQlzZXRIZWFkZXIoKFBhZ2VIZWFkZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19GT09URVI6CisJCQkJc2V0Rm9vdGVyKChQYWdlRm9vdGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1NJWkU6CisJCQkJc2V0U2l6ZShTSVpFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fT1JJRU5UQVRJT046CisJCQkJc2V0T3JpZW50YXRpb24oT1JJRU5UQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1ZBTFVFOgorCQkJCXNldFRvcE1hcmdpblZhbHVlKFRPUF9NQVJHSU5fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1VOSVQ6CisJCQkJc2V0VG9wTWFyZ2luVW5pdChUT1BfTUFSR0lOX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19MRUZUX01BUkdJTl9WQUxVRToKKwkJCQlzZXRMZWZ0TWFyZ2luVmFsdWUoTEVGVF9NQVJHSU5fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19MRUZUX01BUkdJTl9VTklUOgorCQkJCXNldExlZnRNYXJnaW5Vbml0KExFRlRfTUFSR0lOX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1ZBTFVFOgorCQkJCXNldEJvdHRvbU1hcmdpblZhbHVlKEJPVFRPTV9NQVJHSU5fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1VOSVQ6CisJCQkJc2V0Qm90dG9tTWFyZ2luVW5pdChCT1RUT01fTUFSR0lOX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVkFMVUU6CisJCQkJc2V0UmlnaHRNYXJnaW5WYWx1ZShSSUdIVF9NQVJHSU5fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVU5JVDoKKwkJCQlzZXRSaWdodE1hcmdpblVuaXQoUklHSFRfTUFSR0lOX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19IRUFERVI6CisJCQkJc2V0SGVhZGVyKChQYWdlSGVhZGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19GT09URVI6CisJCQkJc2V0Rm9vdGVyKChQYWdlRm9vdGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX1NJWkU6CisJCQkJcmV0dXJuIHNpemUgIT0gU0laRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19PUklFTlRBVElPTjoKKwkJCQlyZXR1cm4gb3JpZW50YXRpb24gIT0gT1JJRU5UQVRJT05fRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fVE9QX01BUkdJTl9WQUxVRToKKwkJCQlyZXR1cm4gdG9wTWFyZ2luVmFsdWUgIT0gVE9QX01BUkdJTl9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1VOSVQ6CisJCQkJcmV0dXJuIHRvcE1hcmdpblVuaXQgIT0gVE9QX01BUkdJTl9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0xFRlRfTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiBsZWZ0TWFyZ2luVmFsdWUgIT0gTEVGVF9NQVJHSU5fVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fTEVGVF9NQVJHSU5fVU5JVDoKKwkJCQlyZXR1cm4gbGVmdE1hcmdpblVuaXQgIT0gTEVGVF9NQVJHSU5fVU5JVF9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiBib3R0b21NYXJnaW5WYWx1ZSAhPSBCT1RUT01fTUFSR0lOX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0JPVFRPTV9NQVJHSU5fVU5JVDoKKwkJCQlyZXR1cm4gYm90dG9tTWFyZ2luVW5pdCAhPSBCT1RUT01fTUFSR0lOX1VOSVRfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1ZBTFVFOgorCQkJCXJldHVybiByaWdodE1hcmdpblZhbHVlICE9IFJJR0hUX01BUkdJTl9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVU5JVDoKKwkJCQlyZXR1cm4gcmlnaHRNYXJnaW5Vbml0ICE9IFJJR0hUX01BUkdJTl9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVfX0hFQURFUjoKKwkJCQlyZXR1cm4gaGVhZGVyICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURV9fRk9PVEVSOgorCQkJCXJldHVybiBmb290ZXIgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNpemU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNpemUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWVudGF0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChvcmllbnRhdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdG9wTWFyZ2luVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRvcE1hcmdpblZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0b3BNYXJnaW5Vbml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0b3BNYXJnaW5Vbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsZWZ0TWFyZ2luVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGxlZnRNYXJnaW5WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbGVmdE1hcmdpblVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGxlZnRNYXJnaW5Vbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBib3R0b21NYXJnaW5WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoYm90dG9tTWFyZ2luVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGJvdHRvbU1hcmdpblVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGJvdHRvbU1hcmdpblVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJpZ2h0TWFyZ2luVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJpZ2h0TWFyZ2luVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJpZ2h0TWFyZ2luVW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQocmlnaHRNYXJnaW5Vbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vUGFnZVRlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VUZW1wbGF0ZXNJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUGFnZVRlbXBsYXRlc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFjYTRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1BhZ2VUZW1wbGF0ZXNJbXBsLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhZ2UgVGVtcGxhdGVzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlBhZ2VUZW1wbGF0ZXNJbXBsI2dldFBhZ2V0ZW1wbGF0ZXMgPGVtPlBhZ2V0ZW1wbGF0ZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQYWdlVGVtcGxhdGVzSW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBQYWdlVGVtcGxhdGVzIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWdldGVtcGxhdGVzKCkgPGVtPlBhZ2V0ZW1wbGF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFnZXRlbXBsYXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBhZ2VUZW1wbGF0ZT4gcGFnZXRlbXBsYXRlczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQYWdlVGVtcGxhdGVzSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUEFHRV9URU1QTEFURVM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFBhZ2VUZW1wbGF0ZT4gZ2V0UGFnZXRlbXBsYXRlcygpIHsKKwkJaWYgKHBhZ2V0ZW1wbGF0ZXMgPT0gbnVsbCkgeworCQkJcGFnZXRlbXBsYXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQYWdlVGVtcGxhdGU+KFBhZ2VUZW1wbGF0ZS5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFU19fUEFHRVRFTVBMQVRFUyk7CisJCX0KKwkJcmV0dXJuIHBhZ2V0ZW1wbGF0ZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVTX19QQUdFVEVNUExBVEVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGFnZXRlbXBsYXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFU19fUEFHRVRFTVBMQVRFUzoKKwkJCQlyZXR1cm4gZ2V0UGFnZXRlbXBsYXRlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURVNfX1BBR0VURU1QTEFURVM6CisJCQkJZ2V0UGFnZXRlbXBsYXRlcygpLmNsZWFyKCk7CisJCQkJZ2V0UGFnZXRlbXBsYXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFnZVRlbXBsYXRlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFU19fUEFHRVRFTVBMQVRFUzoKKwkJCQlnZXRQYWdldGVtcGxhdGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFU19fUEFHRVRFTVBMQVRFUzoKKwkJCQlyZXR1cm4gcGFnZXRlbXBsYXRlcyAhPSBudWxsICYmICFwYWdldGVtcGxhdGVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUGFnZVRlbXBsYXRlc0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnRCYXNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydEJhc2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3ZmRmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnRCYXNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgQmFzZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRCYXNlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0QmFzZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUmVwb3J0QmFzZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVwb3J0QmFzZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9CQVNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9CQVNFX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfQkFTRV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0JBU0VfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfQkFTRV9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JlcG9ydEJhc2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0RFNMRmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnREU0xGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWMzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0RFNMRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDE0NTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlcG9ydERTTEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgUmVwb3J0RFNMRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVwb3J0RFNMRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJUmVwb3J0RFNMRmFjdG9yeSB0aGVSZXBvcnREU0xGYWN0b3J5ID0gKFJlcG9ydERTTEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoUmVwb3J0RFNMUGFja2FnZS5lTlNfVVJJKTsKKwkJCWlmICh0aGVSZXBvcnREU0xGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlUmVwb3J0RFNMRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBSZXBvcnREU0xGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydERTTEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX01PREVMOiByZXR1cm4gY3JlYXRlUmVwb3J0TW9kZWwoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTEFaWV9SRVNPTFZFUjogcmV0dXJuIGNyZWF0ZVJlcG9ydExhenlSZXNvbHZlcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9CQVNFOiByZXR1cm4gY3JlYXRlUmVwb3J0QmFzZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFOiByZXR1cm4gY3JlYXRlUmVwb3J0UGFja2FnZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVTOiByZXR1cm4gY3JlYXRlUGFnZVRlbXBsYXRlcygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUUzogcmV0dXJuIGNyZWF0ZVNvbWVGb3JtYXRzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JTOiByZXR1cm4gY3JlYXRlQ29sb3JzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVFM6IHJldHVybiBjcmVhdGVGb250cygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBUzogcmV0dXJuIGNyZWF0ZU1lZGlhcygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFUzogcmV0dXJuIGNyZWF0ZVN0eWxlcygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEU6IHJldHVybiBjcmVhdGVQYWdlVGVtcGxhdGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUjogcmV0dXJuIGNyZWF0ZUNvbG9yKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVDogcmV0dXJuIGNyZWF0ZUZvbnQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWTogcmV0dXJuIGNyZWF0ZUJ1aWxkSW5Gb250RmFtaWx5KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ1VTVE9NX0ZPTlRfRkFNSUxZOiByZXR1cm4gY3JlYXRlQ3VzdG9tRm9udEZhbWlseSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBOiByZXR1cm4gY3JlYXRlTWVkaWEoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEU6IHJldHVybiBjcmVhdGVCb3JkZXJTdHlsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEU6IHJldHVybiBjcmVhdGVCYXNlU3R5bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQV9TVFlMRTogcmV0dXJuIGNyZWF0ZU1lZGlhU3R5bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRTogcmV0dXJuIGNyZWF0ZVN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVQ6IHJldHVybiBjcmVhdGVTb21lRm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVU9NT19GT1JNQVQ6IHJldHVybiBjcmVhdGVVb21vRm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTlVNQkVSX0ZPUk1BVDogcmV0dXJuIGNyZWF0ZU51bWJlckZvcm1hdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVUlJFTkNZX0ZPUk1BVDogcmV0dXJuIGNyZWF0ZUN1cnJlbmN5Rm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9GT1JNQVQ6IHJldHVybiBjcmVhdGVEYXRlRm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9USU1FX0ZPUk1BVDogcmV0dXJuIGNyZWF0ZURhdGVUaW1lRm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVElNRV9GT1JNQVQ6IHJldHVybiBjcmVhdGVUaW1lRm9ybWF0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUOiByZXR1cm4gY3JlYXRlUmVwb3J0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9GSUxFOiByZXR1cm4gY3JlYXRlUmVwb3J0RGVzaWduRmlsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEU6IHJldHVybiBjcmVhdGVSZXBvcnREZXNpZ25UZW1wbGF0ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTlRBSU5FUjogcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfSEVBREVSOiByZXR1cm4gY3JlYXRlUGFnZUhlYWRlcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfREVUQUlMOiByZXR1cm4gY3JlYXRlUGFnZURldGFpbCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfRk9PVEVSOiByZXR1cm4gY3JlYXRlUGFnZUZvb3RlcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEU6IHJldHVybiBjcmVhdGVXaXRoU3R5bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVUZXh0RWxlbWVudCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRJVExFOiByZXR1cm4gY3JlYXRlVGl0bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVUJfVElUTEU6IHJldHVybiBjcmVhdGVTdWJUaXRsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNVQl9TVUJfVElUTEU6IHJldHVybiBjcmVhdGVTdWJTdWJUaXRsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkxBQkVMOiByZXR1cm4gY3JlYXRlTGFiZWwoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUOiByZXR1cm4gY3JlYXRlVGV4dCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVDogcmV0dXJuIGNyZWF0ZUF1dG9UZXh0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0U6IHJldHVybiBjcmVhdGVJbWFnZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUjogcmV0dXJuIGNyZWF0ZVdpdGhIZWFkZXJGb290ZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRTogcmV0dXJuIGNyZWF0ZURhdGFtYXJ0VGFibGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUDogcmV0dXJuIGNyZWF0ZURhdGFtYXJ0VGFibGVHcm91cCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRDogcmV0dXJuIGNyZWF0ZVNvbWVHcmlkKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSOiByZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSOiByZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfREVUQUlMOiByZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZURldGFpbCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX1BST1BFUlRZOiByZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZVByb3BlcnR5KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfRk9STUFUVEVSOiByZXR1cm4gY3JlYXRlVGFibGVGb3JtYXR0ZXIoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRTogcmV0dXJuIGNyZWF0ZVRhYmxlSW1hZ2UoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZVRhYmxlUHJvcGVydHkoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTjogcmV0dXJuIGNyZWF0ZVRhYmxlQWdncmVnYXRpb24oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CQVNFX0FHR1JFR0FUSU9OOiByZXR1cm4gY3JlYXRlVGFibGVCYXNlQWdncmVnYXRpb24oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QVVJFX0FHR1JFR0FUSU9OOiByZXR1cm4gY3JlYXRlVGFibGVQdXJlQWdncmVnYXRpb24oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9VTkFSWV9BR0dSRUdBVElPTjogcmV0dXJuIGNyZWF0ZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OOiByZXR1cm4gY3JlYXRlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OOiByZXR1cm4gY3JlYXRlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9JTlRFUlZBTDogcmV0dXJuIGNyZWF0ZVRhYmxlTnVtYmVySW50ZXJ2YWwoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTDogcmV0dXJuIGNyZWF0ZVRhYmxlRGF0ZURheUludGVydmFsKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0xPT0tVUDogcmV0dXJuIGNyZWF0ZVRhYmxlTnVtYmVyTG9va3VwKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUDogcmV0dXJuIGNyZWF0ZVRhYmxlU3RyaW5nTG9va3VwKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQOiByZXR1cm4gY3JlYXRlVGFibGVEYXRlRGF5TG9va3VwKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVEVYVF9DT0xPUjogcmV0dXJuIGNyZWF0ZVRhYmxlVGV4dENvbG9yKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQ0VMTF9DT0xPUjogcmV0dXJuIGNyZWF0ZVRhYmxlQ2VsbENvbG9yKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTjogcmV0dXJuIGNyZWF0ZVRhYmxlSWNvbigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RSRU5EOiByZXR1cm4gY3JlYXRlVGFibGVUcmVuZCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RPT0xUSVA6IHJldHVybiBjcmVhdGVUYWJsZVRvb2x0aXAoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEOiByZXR1cm4gY3JlYXRlR3JpZCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfUk9XOiByZXR1cm4gY3JlYXRlR3JpZFJvdygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfQ0VMTDogcmV0dXJuIGNyZWF0ZUdyaWRDZWxsKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlVOSVRfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlVW5pdEVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1NJWkVfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlUGFnZVNpemVFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuT1JJRU5UQVRJT05fRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlT3JpZW50YXRpb25FbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9TVFlMRV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVGb250U3R5bGVFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQlVJTERfSU5fRk9OVF9GQU1JTFlfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlQnVpbGRJbkZvbnRGYW1pbHlFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQk9SREVSX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlQm9yZGVyVHlwZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0FMSUdOX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZVRleHRBbGlnbkVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5OVU1CRVJfRk9STUFUX0NBVEVHT1JZX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZU51bWJlckZvcm1hdENhdGVnb3J5RW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVUlJFTkNZX0ZPUk1BVF9DQVRFR09SWV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEVfRk9STUFUX0NBVEVHT1JZX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZURhdGVGb3JtYXRDYXRlZ29yeUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVElNRV9GT1JNQVRfQ0FURUdPUllfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVF9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVBdXRvVGV4dEVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9TSVpFX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZUltYWdlU2l6ZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRV9TT1VSQ0VfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlSW1hZ2VTb3VyY2VFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUFVSRV9BR0dSRUdBVElPTl9UWVBFX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZVB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVU5BUllfQUdHUkVHQVRJT05fVFlQRV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CSU5BUllfQUdHUkVHQVRJT05fVFlQRV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTVVMVElQTEVfQUdHUkVHQVRJT05fVFlQRV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UUkVORF9JQ09OX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZVRyZW5kSWNvbkVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRU5ERVJJTkdfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlUmVuZGVyaW5nRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUludGVybmFsRU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5VTklUX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRVbml0RW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9TSVpFX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRQYWdlU2l6ZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk9SSUVOVEFUSU9OX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRPcmllbnRhdGlvbkVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkZPTlRfU1RZTEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydEZvbnRTdHlsZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJVSUxEX0lOX0ZPTlRfRkFNSUxZX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRCdWlsZEluRm9udEZhbWlseUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJPUkRFUl9UWVBFX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRCb3JkZXJUeXBlRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9BTElHTl9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0VGV4dEFsaWduRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTlVNQkVSX0ZPUk1BVF9DQVRFR09SWV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DVVJSRU5DWV9GT1JNQVRfQ0FURUdPUllfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX0ZPUk1BVF9DQVRFR09SWV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0RGF0ZUZvcm1hdENhdGVnb3J5RW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFURV9USU1FX0ZPUk1BVF9DQVRFR09SWV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5BVVRPX1RFWFRfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydEF1dG9UZXh0RW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfU0laRV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0SW1hZ2VTaXplRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0VfU09VUkNFX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRJbWFnZVNvdXJjZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBVUkVfQUdHUkVHQVRJT05fVFlQRV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlVOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQklOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1VTFRJUExFX0FHR1JFR0FUSU9OX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVFJFTkRfSUNPTl9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0VHJlbmRJY29uRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVOREVSSU5HX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRSZW5kZXJpbmdFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTlRFUk5BTF9FT0JKRUNUOgorCQkJCXJldHVybiBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnRNb2RlbCBjcmVhdGVSZXBvcnRNb2RlbCgpIHsKKwkJUmVwb3J0TW9kZWxJbXBsIHJlcG9ydE1vZGVsID0gbmV3IFJlcG9ydE1vZGVsSW1wbCgpOworCQlyZXR1cm4gcmVwb3J0TW9kZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydExhenlSZXNvbHZlciBjcmVhdGVSZXBvcnRMYXp5UmVzb2x2ZXIoKSB7CisJCVJlcG9ydExhenlSZXNvbHZlckltcGwgcmVwb3J0TGF6eVJlc29sdmVyID0gbmV3IFJlcG9ydExhenlSZXNvbHZlckltcGwoKTsKKwkJcmV0dXJuIHJlcG9ydExhenlSZXNvbHZlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVwb3J0QmFzZSBjcmVhdGVSZXBvcnRCYXNlKCkgeworCQlSZXBvcnRCYXNlSW1wbCByZXBvcnRCYXNlID0gbmV3IFJlcG9ydEJhc2VJbXBsKCk7CisJCXJldHVybiByZXBvcnRCYXNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnRQYWNrYWdlIGNyZWF0ZVJlcG9ydFBhY2thZ2UoKSB7CisJCVJlcG9ydFBhY2thZ2VJbXBsIHJlcG9ydFBhY2thZ2UgPSBuZXcgUmVwb3J0UGFja2FnZUltcGwoKTsKKwkJcmV0dXJuIHJlcG9ydFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VUZW1wbGF0ZXMgY3JlYXRlUGFnZVRlbXBsYXRlcygpIHsKKwkJUGFnZVRlbXBsYXRlc0ltcGwgcGFnZVRlbXBsYXRlcyA9IG5ldyBQYWdlVGVtcGxhdGVzSW1wbCgpOworCQlyZXR1cm4gcGFnZVRlbXBsYXRlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU29tZUZvcm1hdHMgY3JlYXRlU29tZUZvcm1hdHMoKSB7CisJCVNvbWVGb3JtYXRzSW1wbCBzb21lRm9ybWF0cyA9IG5ldyBTb21lRm9ybWF0c0ltcGwoKTsKKwkJcmV0dXJuIHNvbWVGb3JtYXRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvcnMgY3JlYXRlQ29sb3JzKCkgeworCQlDb2xvcnNJbXBsIGNvbG9ycyA9IG5ldyBDb2xvcnNJbXBsKCk7CisJCXJldHVybiBjb2xvcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZvbnRzIGNyZWF0ZUZvbnRzKCkgeworCQlGb250c0ltcGwgZm9udHMgPSBuZXcgRm9udHNJbXBsKCk7CisJCXJldHVybiBmb250czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWVkaWFzIGNyZWF0ZU1lZGlhcygpIHsKKwkJTWVkaWFzSW1wbCBtZWRpYXMgPSBuZXcgTWVkaWFzSW1wbCgpOworCQlyZXR1cm4gbWVkaWFzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZXMgY3JlYXRlU3R5bGVzKCkgeworCQlTdHlsZXNJbXBsIHN0eWxlcyA9IG5ldyBTdHlsZXNJbXBsKCk7CisJCXJldHVybiBzdHlsZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VUZW1wbGF0ZSBjcmVhdGVQYWdlVGVtcGxhdGUoKSB7CisJCVBhZ2VUZW1wbGF0ZUltcGwgcGFnZVRlbXBsYXRlID0gbmV3IFBhZ2VUZW1wbGF0ZUltcGwoKTsKKwkJcmV0dXJuIHBhZ2VUZW1wbGF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgY3JlYXRlQ29sb3IoKSB7CisJCUNvbG9ySW1wbCBjb2xvciA9IG5ldyBDb2xvckltcGwoKTsKKwkJcmV0dXJuIGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250IGNyZWF0ZUZvbnQoKSB7CisJCUZvbnRJbXBsIGZvbnQgPSBuZXcgRm9udEltcGwoKTsKKwkJcmV0dXJuIGZvbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJ1aWxkSW5Gb250RmFtaWx5IGNyZWF0ZUJ1aWxkSW5Gb250RmFtaWx5KCkgeworCQlCdWlsZEluRm9udEZhbWlseUltcGwgYnVpbGRJbkZvbnRGYW1pbHkgPSBuZXcgQnVpbGRJbkZvbnRGYW1pbHlJbXBsKCk7CisJCXJldHVybiBidWlsZEluRm9udEZhbWlseTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ3VzdG9tRm9udEZhbWlseSBjcmVhdGVDdXN0b21Gb250RmFtaWx5KCkgeworCQlDdXN0b21Gb250RmFtaWx5SW1wbCBjdXN0b21Gb250RmFtaWx5ID0gbmV3IEN1c3RvbUZvbnRGYW1pbHlJbXBsKCk7CisJCXJldHVybiBjdXN0b21Gb250RmFtaWx5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZWRpYSBjcmVhdGVNZWRpYSgpIHsKKwkJTWVkaWFJbXBsIG1lZGlhID0gbmV3IE1lZGlhSW1wbCgpOworCQlyZXR1cm4gbWVkaWE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvcmRlclN0eWxlIGNyZWF0ZUJvcmRlclN0eWxlKCkgeworCQlCb3JkZXJTdHlsZUltcGwgYm9yZGVyU3R5bGUgPSBuZXcgQm9yZGVyU3R5bGVJbXBsKCk7CisJCXJldHVybiBib3JkZXJTdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmFzZVN0eWxlIGNyZWF0ZUJhc2VTdHlsZSgpIHsKKwkJQmFzZVN0eWxlSW1wbCBiYXNlU3R5bGUgPSBuZXcgQmFzZVN0eWxlSW1wbCgpOworCQlyZXR1cm4gYmFzZVN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZWRpYVN0eWxlIGNyZWF0ZU1lZGlhU3R5bGUoKSB7CisJCU1lZGlhU3R5bGVJbXBsIG1lZGlhU3R5bGUgPSBuZXcgTWVkaWFTdHlsZUltcGwoKTsKKwkJcmV0dXJuIG1lZGlhU3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGNyZWF0ZVN0eWxlKCkgeworCQlTdHlsZUltcGwgc3R5bGUgPSBuZXcgU3R5bGVJbXBsKCk7CisJCXJldHVybiBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU29tZUZvcm1hdCBjcmVhdGVTb21lRm9ybWF0KCkgeworCQlTb21lRm9ybWF0SW1wbCBzb21lRm9ybWF0ID0gbmV3IFNvbWVGb3JtYXRJbXBsKCk7CisJCXJldHVybiBzb21lRm9ybWF0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVb21vRm9ybWF0IGNyZWF0ZVVvbW9Gb3JtYXQoKSB7CisJCVVvbW9Gb3JtYXRJbXBsIHVvbW9Gb3JtYXQgPSBuZXcgVW9tb0Zvcm1hdEltcGwoKTsKKwkJcmV0dXJuIHVvbW9Gb3JtYXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE51bWJlckZvcm1hdCBjcmVhdGVOdW1iZXJGb3JtYXQoKSB7CisJCU51bWJlckZvcm1hdEltcGwgbnVtYmVyRm9ybWF0ID0gbmV3IE51bWJlckZvcm1hdEltcGwoKTsKKwkJcmV0dXJuIG51bWJlckZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ3VycmVuY3lGb3JtYXQgY3JlYXRlQ3VycmVuY3lGb3JtYXQoKSB7CisJCUN1cnJlbmN5Rm9ybWF0SW1wbCBjdXJyZW5jeUZvcm1hdCA9IG5ldyBDdXJyZW5jeUZvcm1hdEltcGwoKTsKKwkJcmV0dXJuIGN1cnJlbmN5Rm9ybWF0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRlRm9ybWF0IGNyZWF0ZURhdGVGb3JtYXQoKSB7CisJCURhdGVGb3JtYXRJbXBsIGRhdGVGb3JtYXQgPSBuZXcgRGF0ZUZvcm1hdEltcGwoKTsKKwkJcmV0dXJuIGRhdGVGb3JtYXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGVUaW1lRm9ybWF0IGNyZWF0ZURhdGVUaW1lRm9ybWF0KCkgeworCQlEYXRlVGltZUZvcm1hdEltcGwgZGF0ZVRpbWVGb3JtYXQgPSBuZXcgRGF0ZVRpbWVGb3JtYXRJbXBsKCk7CisJCXJldHVybiBkYXRlVGltZUZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGltZUZvcm1hdCBjcmVhdGVUaW1lRm9ybWF0KCkgeworCQlUaW1lRm9ybWF0SW1wbCB0aW1lRm9ybWF0ID0gbmV3IFRpbWVGb3JtYXRJbXBsKCk7CisJCXJldHVybiB0aW1lRm9ybWF0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KCkgeworCQlSZXBvcnRJbXBsIHJlcG9ydCA9IG5ldyBSZXBvcnRJbXBsKCk7CisJCXJldHVybiByZXBvcnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydERlc2lnbkZpbGUgY3JlYXRlUmVwb3J0RGVzaWduRmlsZSgpIHsKKwkJUmVwb3J0RGVzaWduRmlsZUltcGwgcmVwb3J0RGVzaWduRmlsZSA9IG5ldyBSZXBvcnREZXNpZ25GaWxlSW1wbCgpOworCQlyZXR1cm4gcmVwb3J0RGVzaWduRmlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVwb3J0RGVzaWduVGVtcGxhdGUgY3JlYXRlUmVwb3J0RGVzaWduVGVtcGxhdGUoKSB7CisJCVJlcG9ydERlc2lnblRlbXBsYXRlSW1wbCByZXBvcnREZXNpZ25UZW1wbGF0ZSA9IG5ldyBSZXBvcnREZXNpZ25UZW1wbGF0ZUltcGwoKTsKKwkJcmV0dXJuIHJlcG9ydERlc2lnblRlbXBsYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIgY3JlYXRlQ29udGFpbmVyKCkgeworCQlDb250YWluZXJJbXBsIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXJJbXBsKCk7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VIZWFkZXIgY3JlYXRlUGFnZUhlYWRlcigpIHsKKwkJUGFnZUhlYWRlckltcGwgcGFnZUhlYWRlciA9IG5ldyBQYWdlSGVhZGVySW1wbCgpOworCQlyZXR1cm4gcGFnZUhlYWRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGFnZURldGFpbCBjcmVhdGVQYWdlRGV0YWlsKCkgeworCQlQYWdlRGV0YWlsSW1wbCBwYWdlRGV0YWlsID0gbmV3IFBhZ2VEZXRhaWxJbXBsKCk7CisJCXJldHVybiBwYWdlRGV0YWlsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlRm9vdGVyIGNyZWF0ZVBhZ2VGb290ZXIoKSB7CisJCVBhZ2VGb290ZXJJbXBsIHBhZ2VGb290ZXIgPSBuZXcgUGFnZUZvb3RlckltcGwoKTsKKwkJcmV0dXJuIHBhZ2VGb290ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdpdGhTdHlsZSBjcmVhdGVXaXRoU3R5bGUoKSB7CisJCVdpdGhTdHlsZUltcGwgd2l0aFN0eWxlID0gbmV3IFdpdGhTdHlsZUltcGwoKTsKKwkJcmV0dXJuIHdpdGhTdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGV4dEVsZW1lbnQgY3JlYXRlVGV4dEVsZW1lbnQoKSB7CisJCVRleHRFbGVtZW50SW1wbCB0ZXh0RWxlbWVudCA9IG5ldyBUZXh0RWxlbWVudEltcGwoKTsKKwkJcmV0dXJuIHRleHRFbGVtZW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaXRsZSBjcmVhdGVUaXRsZSgpIHsKKwkJVGl0bGVJbXBsIHRpdGxlID0gbmV3IFRpdGxlSW1wbCgpOworCQlyZXR1cm4gdGl0bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN1YlRpdGxlIGNyZWF0ZVN1YlRpdGxlKCkgeworCQlTdWJUaXRsZUltcGwgc3ViVGl0bGUgPSBuZXcgU3ViVGl0bGVJbXBsKCk7CisJCXJldHVybiBzdWJUaXRsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3ViU3ViVGl0bGUgY3JlYXRlU3ViU3ViVGl0bGUoKSB7CisJCVN1YlN1YlRpdGxlSW1wbCBzdWJTdWJUaXRsZSA9IG5ldyBTdWJTdWJUaXRsZUltcGwoKTsKKwkJcmV0dXJuIHN1YlN1YlRpdGxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbCgpIHsKKwkJTGFiZWxJbXBsIGxhYmVsID0gbmV3IExhYmVsSW1wbCgpOworCQlyZXR1cm4gbGFiZWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRleHQgY3JlYXRlVGV4dCgpIHsKKwkJVGV4dEltcGwgdGV4dCA9IG5ldyBUZXh0SW1wbCgpOworCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXV0b1RleHQgY3JlYXRlQXV0b1RleHQoKSB7CisJCUF1dG9UZXh0SW1wbCBhdXRvVGV4dCA9IG5ldyBBdXRvVGV4dEltcGwoKTsKKwkJcmV0dXJuIGF1dG9UZXh0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZSgpIHsKKwkJSW1hZ2VJbXBsIGltYWdlID0gbmV3IEltYWdlSW1wbCgpOworCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdpdGhIZWFkZXJGb290ZXIgY3JlYXRlV2l0aEhlYWRlckZvb3RlcigpIHsKKwkJV2l0aEhlYWRlckZvb3RlckltcGwgd2l0aEhlYWRlckZvb3RlciA9IG5ldyBXaXRoSGVhZGVyRm9vdGVySW1wbCgpOworCQlyZXR1cm4gd2l0aEhlYWRlckZvb3RlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZSBjcmVhdGVEYXRhbWFydFRhYmxlKCkgeworCQlEYXRhbWFydFRhYmxlSW1wbCBkYXRhbWFydFRhYmxlID0gbmV3IERhdGFtYXJ0VGFibGVJbXBsKCk7CisJCXJldHVybiBkYXRhbWFydFRhYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXAgY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwKCkgeworCQlEYXRhbWFydFRhYmxlR3JvdXBJbXBsIGRhdGFtYXJ0VGFibGVHcm91cCA9IG5ldyBEYXRhbWFydFRhYmxlR3JvdXBJbXBsKCk7CisJCXJldHVybiBkYXRhbWFydFRhYmxlR3JvdXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNvbWVHcmlkIGNyZWF0ZVNvbWVHcmlkKCkgeworCQlTb21lR3JpZEltcGwgc29tZUdyaWQgPSBuZXcgU29tZUdyaWRJbXBsKCk7CisJCXJldHVybiBzb21lR3JpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIGNyZWF0ZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcigpIHsKKwkJRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbCBkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgPSBuZXcgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVySW1wbCgpOworCQlyZXR1cm4gZGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKCkgeworCQlEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJJbXBsIGRhdGFtYXJ0VGFibGVHcm91cEZvb3RlciA9IG5ldyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJJbXBsKCk7CisJCXJldHVybiBkYXRhbWFydFRhYmxlR3JvdXBGb290ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFtYXJ0VGFibGVEZXRhaWwgY3JlYXRlRGF0YW1hcnRUYWJsZURldGFpbCgpIHsKKwkJRGF0YW1hcnRUYWJsZURldGFpbEltcGwgZGF0YW1hcnRUYWJsZURldGFpbCA9IG5ldyBEYXRhbWFydFRhYmxlRGV0YWlsSW1wbCgpOworCQlyZXR1cm4gZGF0YW1hcnRUYWJsZURldGFpbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZVByb3BlcnR5IGNyZWF0ZURhdGFtYXJ0VGFibGVQcm9wZXJ0eSgpIHsKKwkJRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCBkYXRhbWFydFRhYmxlUHJvcGVydHkgPSBuZXcgRGF0YW1hcnRUYWJsZVByb3BlcnR5SW1wbCgpOworCQlyZXR1cm4gZGF0YW1hcnRUYWJsZVByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZUZvcm1hdHRlciBjcmVhdGVUYWJsZUZvcm1hdHRlcigpIHsKKwkJVGFibGVGb3JtYXR0ZXJJbXBsIHRhYmxlRm9ybWF0dGVyID0gbmV3IFRhYmxlRm9ybWF0dGVySW1wbCgpOworCQlyZXR1cm4gdGFibGVGb3JtYXR0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlSW1hZ2UgY3JlYXRlVGFibGVJbWFnZSgpIHsKKwkJVGFibGVJbWFnZUltcGwgdGFibGVJbWFnZSA9IG5ldyBUYWJsZUltYWdlSW1wbCgpOworCQlyZXR1cm4gdGFibGVJbWFnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVQcm9wZXJ0eSBjcmVhdGVUYWJsZVByb3BlcnR5KCkgeworCQlUYWJsZVByb3BlcnR5SW1wbCB0YWJsZVByb3BlcnR5ID0gbmV3IFRhYmxlUHJvcGVydHlJbXBsKCk7CisJCXJldHVybiB0YWJsZVByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZUFnZ3JlZ2F0aW9uIGNyZWF0ZVRhYmxlQWdncmVnYXRpb24oKSB7CisJCVRhYmxlQWdncmVnYXRpb25JbXBsIHRhYmxlQWdncmVnYXRpb24gPSBuZXcgVGFibGVBZ2dyZWdhdGlvbkltcGwoKTsKKwkJcmV0dXJuIHRhYmxlQWdncmVnYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIGNyZWF0ZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCkgeworCQlUYWJsZUJhc2VBZ2dyZWdhdGlvbkltcGwgdGFibGVCYXNlQWdncmVnYXRpb24gPSBuZXcgVGFibGVCYXNlQWdncmVnYXRpb25JbXBsKCk7CisJCXJldHVybiB0YWJsZUJhc2VBZ2dyZWdhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVQdXJlQWdncmVnYXRpb24gY3JlYXRlVGFibGVQdXJlQWdncmVnYXRpb24oKSB7CisJCVRhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbCB0YWJsZVB1cmVBZ2dyZWdhdGlvbiA9IG5ldyBUYWJsZVB1cmVBZ2dyZWdhdGlvbkltcGwoKTsKKwkJcmV0dXJuIHRhYmxlUHVyZUFnZ3JlZ2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVVuYXJ5QWdncmVnYXRpb24gY3JlYXRlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKCkgeworCQlUYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsIHRhYmxlVW5hcnlBZ2dyZWdhdGlvbiA9IG5ldyBUYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsKCk7CisJCXJldHVybiB0YWJsZVVuYXJ5QWdncmVnYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiBjcmVhdGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24oKSB7CisJCVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwgdGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uID0gbmV3IFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwoKTsKKwkJcmV0dXJuIHRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiBjcmVhdGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKCkgeworCQlUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uSW1wbCB0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uID0gbmV3IFRhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsKCk7CisJCXJldHVybiB0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZU51bWJlckludGVydmFsIGNyZWF0ZVRhYmxlTnVtYmVySW50ZXJ2YWwoKSB7CisJCVRhYmxlTnVtYmVySW50ZXJ2YWxJbXBsIHRhYmxlTnVtYmVySW50ZXJ2YWwgPSBuZXcgVGFibGVOdW1iZXJJbnRlcnZhbEltcGwoKTsKKwkJcmV0dXJuIHRhYmxlTnVtYmVySW50ZXJ2YWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlRGF0ZURheUludGVydmFsIGNyZWF0ZVRhYmxlRGF0ZURheUludGVydmFsKCkgeworCQlUYWJsZURhdGVEYXlJbnRlcnZhbEltcGwgdGFibGVEYXRlRGF5SW50ZXJ2YWwgPSBuZXcgVGFibGVEYXRlRGF5SW50ZXJ2YWxJbXBsKCk7CisJCXJldHVybiB0YWJsZURhdGVEYXlJbnRlcnZhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVOdW1iZXJMb29rdXAgY3JlYXRlVGFibGVOdW1iZXJMb29rdXAoKSB7CisJCVRhYmxlTnVtYmVyTG9va3VwSW1wbCB0YWJsZU51bWJlckxvb2t1cCA9IG5ldyBUYWJsZU51bWJlckxvb2t1cEltcGwoKTsKKwkJcmV0dXJuIHRhYmxlTnVtYmVyTG9va3VwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVN0cmluZ0xvb2t1cCBjcmVhdGVUYWJsZVN0cmluZ0xvb2t1cCgpIHsKKwkJVGFibGVTdHJpbmdMb29rdXBJbXBsIHRhYmxlU3RyaW5nTG9va3VwID0gbmV3IFRhYmxlU3RyaW5nTG9va3VwSW1wbCgpOworCQlyZXR1cm4gdGFibGVTdHJpbmdMb29rdXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlRGF0ZURheUxvb2t1cCBjcmVhdGVUYWJsZURhdGVEYXlMb29rdXAoKSB7CisJCVRhYmxlRGF0ZURheUxvb2t1cEltcGwgdGFibGVEYXRlRGF5TG9va3VwID0gbmV3IFRhYmxlRGF0ZURheUxvb2t1cEltcGwoKTsKKwkJcmV0dXJuIHRhYmxlRGF0ZURheUxvb2t1cDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVUZXh0Q29sb3IgY3JlYXRlVGFibGVUZXh0Q29sb3IoKSB7CisJCVRhYmxlVGV4dENvbG9ySW1wbCB0YWJsZVRleHRDb2xvciA9IG5ldyBUYWJsZVRleHRDb2xvckltcGwoKTsKKwkJcmV0dXJuIHRhYmxlVGV4dENvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZUNlbGxDb2xvciBjcmVhdGVUYWJsZUNlbGxDb2xvcigpIHsKKwkJVGFibGVDZWxsQ29sb3JJbXBsIHRhYmxlQ2VsbENvbG9yID0gbmV3IFRhYmxlQ2VsbENvbG9ySW1wbCgpOworCQlyZXR1cm4gdGFibGVDZWxsQ29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlSWNvbiBjcmVhdGVUYWJsZUljb24oKSB7CisJCVRhYmxlSWNvbkltcGwgdGFibGVJY29uID0gbmV3IFRhYmxlSWNvbkltcGwoKTsKKwkJcmV0dXJuIHRhYmxlSWNvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVUcmVuZCBjcmVhdGVUYWJsZVRyZW5kKCkgeworCQlUYWJsZVRyZW5kSW1wbCB0YWJsZVRyZW5kID0gbmV3IFRhYmxlVHJlbmRJbXBsKCk7CisJCXJldHVybiB0YWJsZVRyZW5kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVRvb2x0aXAgY3JlYXRlVGFibGVUb29sdGlwKCkgeworCQlUYWJsZVRvb2x0aXBJbXBsIHRhYmxlVG9vbHRpcCA9IG5ldyBUYWJsZVRvb2x0aXBJbXBsKCk7CisJCXJldHVybiB0YWJsZVRvb2x0aXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEdyaWQgY3JlYXRlR3JpZCgpIHsKKwkJR3JpZEltcGwgZ3JpZCA9IG5ldyBHcmlkSW1wbCgpOworCQlyZXR1cm4gZ3JpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgR3JpZFJvdyBjcmVhdGVHcmlkUm93KCkgeworCQlHcmlkUm93SW1wbCBncmlkUm93ID0gbmV3IEdyaWRSb3dJbXBsKCk7CisJCXJldHVybiBncmlkUm93OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBHcmlkQ2VsbCBjcmVhdGVHcmlkQ2VsbCgpIHsKKwkJR3JpZENlbGxJbXBsIGdyaWRDZWxsID0gbmV3IEdyaWRDZWxsSW1wbCgpOworCQlyZXR1cm4gZ3JpZENlbGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGNyZWF0ZVVuaXRFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVVuaXRFbnVtIHJlc3VsdCA9IFVuaXRFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVbml0RW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlU2l6ZUVudW0gY3JlYXRlUGFnZVNpemVFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVBhZ2VTaXplRW51bSByZXN1bHQgPSBQYWdlU2l6ZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFBhZ2VTaXplRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBPcmllbnRhdGlvbkVudW0gY3JlYXRlT3JpZW50YXRpb25FbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCU9yaWVudGF0aW9uRW51bSByZXN1bHQgPSBPcmllbnRhdGlvbkVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydE9yaWVudGF0aW9uRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250U3R5bGVFbnVtIGNyZWF0ZUZvbnRTdHlsZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJRm9udFN0eWxlRW51bSByZXN1bHQgPSBGb250U3R5bGVFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGb250U3R5bGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJ1aWxkSW5Gb250RmFtaWx5RW51bSBjcmVhdGVCdWlsZEluRm9udEZhbWlseUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQnVpbGRJbkZvbnRGYW1pbHlFbnVtIHJlc3VsdCA9IEJ1aWxkSW5Gb250RmFtaWx5RW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0QnVpbGRJbkZvbnRGYW1pbHlFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvcmRlclR5cGVFbnVtIGNyZWF0ZUJvcmRlclR5cGVFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCUJvcmRlclR5cGVFbnVtIHJlc3VsdCA9IEJvcmRlclR5cGVFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb3JkZXJUeXBlRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZXh0QWxpZ25FbnVtIGNyZWF0ZVRleHRBbGlnbkVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJVGV4dEFsaWduRW51bSByZXN1bHQgPSBUZXh0QWxpZ25FbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZXh0QWxpZ25FbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE51bWJlckZvcm1hdENhdGVnb3J5RW51bSBjcmVhdGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IE51bWJlckZvcm1hdENhdGVnb3J5RW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIGNyZWF0ZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIGNyZWF0ZURhdGVGb3JtYXRDYXRlZ29yeUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJRGF0ZUZvcm1hdENhdGVnb3J5RW51bSByZXN1bHQgPSBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGNyZWF0ZURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlc3VsdCA9IERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIGNyZWF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJVGltZUZvcm1hdENhdGVnb3J5RW51bSByZXN1bHQgPSBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dG9UZXh0RW51bSBjcmVhdGVBdXRvVGV4dEVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQXV0b1RleHRFbnVtIHJlc3VsdCA9IEF1dG9UZXh0RW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0QXV0b1RleHRFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEltYWdlU2l6ZUVudW0gY3JlYXRlSW1hZ2VTaXplRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlJbWFnZVNpemVFbnVtIHJlc3VsdCA9IEltYWdlU2l6ZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydEltYWdlU2l6ZUVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW1hZ2VTb3VyY2VFbnVtIGNyZWF0ZUltYWdlU291cmNlRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlJbWFnZVNvdXJjZUVudW0gcmVzdWx0ID0gSW1hZ2VTb3VyY2VFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbWFnZVNvdXJjZUVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0gY3JlYXRlUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0gcmVzdWx0ID0gUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSBjcmVhdGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gY3JlYXRlQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIHJlc3VsdCA9IEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIGNyZWF0ZU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gcmVzdWx0ID0gTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVHJlbmRJY29uRW51bSBjcmVhdGVUcmVuZEljb25FbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVRyZW5kSWNvbkVudW0gcmVzdWx0ID0gVHJlbmRJY29uRW51bS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VHJlbmRJY29uRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZW5kZXJpbmdFbnVtIGNyZWF0ZVJlbmRlcmluZ0VudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJUmVuZGVyaW5nRW51bSByZXN1bHQgPSBSZW5kZXJpbmdFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSZW5kZXJpbmdFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVybmFsRU9iamVjdCBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIChJbnRlcm5hbEVPYmplY3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnREU0xQYWNrYWdlIGdldFJlcG9ydERTTFBhY2thZ2UoKSB7CisJCXJldHVybiAoUmVwb3J0RFNMUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIFJlcG9ydERTTFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1JlcG9ydERTTEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0RFNMUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnREU0xQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjE3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0RFNMUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDQzMjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5PU0JQVHlwZXNQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hY3Rpb24uQWN0aW9uRFNMUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREU0xQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHRFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJ1aWxkSW5Gb250RmFtaWx5RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VzdG9tRm9udEZhbWlseTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdENhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250U3R5bGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNpemVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlU291cmNlRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdENhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5PcmllbnRhdGlvbkVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZURldGFpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVNpemVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlbmRlcmluZ0VudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydEJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydExhenlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUdyaWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUNlbGxDb2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUmFuZ2VFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlU3RyaW5nTG9va3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVGV4dENvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVG9vbHRpcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRyZW5kSWNvbkVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVuaXRFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YdHlwZVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZXBvcnREU0xQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXBvcnRNb2RlbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXBvcnRMYXp5UmVzb2x2ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0QmFzZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXBvcnRQYWNrYWdlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBhZ2VUZW1wbGF0ZXNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc29tZUZvcm1hdHNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY29sb3JzRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGZvbnRzRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1lZGlhc0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzdHlsZXNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGFnZVRlbXBsYXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNvbG9yRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGZvbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZm9udEZhbWlseUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBidWlsZEluRm9udEZhbWlseUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjdXN0b21Gb250RmFtaWx5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1lZGlhRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGJvcmRlclN0eWxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGJhc2VTdHlsZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBtZWRpYVN0eWxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHN0eWxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNvbWVGb3JtYXRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdW9tb0Zvcm1hdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBudW1iZXJGb3JtYXRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY3VycmVuY3lGb3JtYXRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZGF0ZUZvcm1hdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkYXRlVGltZUZvcm1hdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0aW1lRm9ybWF0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXBvcnREZXNpZ25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0RGVzaWduRmlsZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb250YWluZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGFnZUhlYWRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwYWdlRGV0YWlsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHBhZ2VGb290ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB3aXRoU3R5bGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGV4dEVsZW1lbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGl0bGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3ViVGl0bGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3ViU3ViVGl0bGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgbGFiZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGV4dEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhdXRvVGV4dEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpbWFnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB3aXRoSGVhZGVyRm9vdGVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRhdGFtYXJ0VGFibGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZGF0YW1hcnRUYWJsZUdyb3VwRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHNvbWVHcmlkRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRhdGFtYXJ0VGFibGVHcm91cEhlYWRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZGF0YW1hcnRUYWJsZURldGFpbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVGb3JtYXR0ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVJbWFnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZVZhbHVlRWxlbWVudEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZVByb3BlcnR5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRhYmxlQWdncmVnYXRpb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVCYXNlQWdncmVnYXRpb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVQdXJlQWdncmVnYXRpb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVVbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRhYmxlSW50ZXJ2YWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVOdW1iZXJJbnRlcnZhbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZURhdGVEYXlJbnRlcnZhbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZUxvb2t1cEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZU51bWJlckxvb2t1cEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZVN0cmluZ0xvb2t1cEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0YWJsZURhdGVEYXlMb29rdXBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVSYW5nZUVsZW1lbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVUZXh0Q29sb3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVDZWxsQ29sb3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVJY29uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHRhYmxlVHJlbmRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgdGFibGVUb29sdGlwRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGdyaWRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgZ3JpZFJvd0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBncmlkQ2VsbEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHVuaXRFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBwYWdlU2l6ZUVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIG9yaWVudGF0aW9uRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gZm9udFN0eWxlRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gYnVpbGRJbkZvbnRGYW1pbHlFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBib3JkZXJUeXBlRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gdGV4dEFsaWduRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gbnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gZGF0ZUZvcm1hdENhdGVnb3J5RW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gZGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIGF1dG9UZXh0RW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gaW1hZ2VTaXplRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gaW1hZ2VTb3VyY2VFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBwdXJlQWdncmVnYXRpb25UeXBlRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gdW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBiaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBtdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHRyZW5kSWNvbkVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHJlbmRlcmluZ0VudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSBpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgUmVwb3J0RFNMUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIFJlcG9ydERTTEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBSZXBvcnREU0xQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSZXBvcnREU0xQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChSZXBvcnREU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlcG9ydERTTFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlSZXBvcnREU0xQYWNrYWdlSW1wbCB0aGVSZXBvcnREU0xQYWNrYWdlID0gKFJlcG9ydERTTFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZXBvcnREU0xQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBSZXBvcnREU0xQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCURhdGFtYXJ0RFNMUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUFjdGlvbkRTTFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVJlcG9ydERTTFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVSZXBvcnREU0xQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVJlcG9ydERTTFBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoUmVwb3J0RFNMUGFja2FnZS5lTlNfVVJJLCB0aGVSZXBvcnREU0xQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZVJlcG9ydERTTFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSZXBvcnRNb2RlbCgpIHsKKwkJcmV0dXJuIHJlcG9ydE1vZGVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydE1vZGVsX1Bja2coKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkgeworCQlyZXR1cm4gcmVwb3J0TGF6eVJlc29sdmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFT3BlcmF0aW9uIGdldFJlcG9ydExhenlSZXNvbHZlcl9fRVJlc29sdmVQcm94eV9fSW50ZXJuYWxFT2JqZWN0KCkgeworCQlyZXR1cm4gcmVwb3J0TGF6eVJlc29sdmVyRUNsYXNzLmdldEVPcGVyYXRpb25zKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0QmFzZSgpIHsKKwkJcmV0dXJuIHJlcG9ydEJhc2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0QmFzZV9OYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0QmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0UGFja2FnZSgpIHsKKwkJcmV0dXJuIHJlcG9ydFBhY2thZ2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9JbXBvcnRTZWN0aW9uKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlcG9ydFBhY2thZ2VfRXh0ZXJuYWxDc3NVUkkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSUJ1bmRsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlcG9ydFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXBvcnRQYWNrYWdlX1BhZ2V0ZW1wbGF0ZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9Gb3JtYXR0ZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydFBhY2thZ2VfQ29sb3JzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydFBhY2thZ2VfRm9udHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9NZWRpYXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9TdHlsZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0UGFja2FnZV9SZXBvcnRzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGFnZVRlbXBsYXRlcygpIHsKKwkJcmV0dXJuIHBhZ2VUZW1wbGF0ZXNFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFnZVRlbXBsYXRlc19QYWdldGVtcGxhdGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFnZVRlbXBsYXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U29tZUZvcm1hdHMoKSB7CisJCXJldHVybiBzb21lRm9ybWF0c0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTb21lRm9ybWF0c19Gb3JtYXR0ZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc29tZUZvcm1hdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENvbG9ycygpIHsKKwkJcmV0dXJuIGNvbG9yc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2xvcnNfQ29sb3JzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29sb3JzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRGb250cygpIHsKKwkJcmV0dXJuIGZvbnRzRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZvbnRzX0ZvbnRzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZm9udHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1lZGlhcygpIHsKKwkJcmV0dXJuIG1lZGlhc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZWRpYXNfTWVkaWFzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVkaWFzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTdHlsZXMoKSB7CisJCXJldHVybiBzdHlsZXNFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U3R5bGVzX1N0eWxlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0eWxlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGFnZVRlbXBsYXRlKCkgeworCQlyZXR1cm4gcGFnZVRlbXBsYXRlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9TaXplKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX09yaWVudGF0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX1RvcE1hcmdpblZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX1RvcE1hcmdpblVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWdlVGVtcGxhdGVfTGVmdE1hcmdpblZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX0xlZnRNYXJnaW5Vbml0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWdlVGVtcGxhdGVfUmlnaHRNYXJnaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBhZ2VUZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYWdlVGVtcGxhdGVfSGVhZGVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhZ2VUZW1wbGF0ZV9Gb290ZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwYWdlVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb2xvcigpIHsKKwkJcmV0dXJuIGNvbG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbG9yX0NvbG9yKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29sb3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2xvcl9CYXNlY29sb3IoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb2xvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbG9yX0RhcmtlbnNieSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29sb3JfTGlnaHRlbnNieSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29sb3JfVHJhbnNmb3Jtc2J5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29sb3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2xvcl9UYXJnZXRjb2xvcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRGb250KCkgeworCQlyZXR1cm4gZm9udEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGb250X0V4dGVuZHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlmb250RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Rm9udF9GYW1pbHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlmb250RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9udF9TdHlsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZvbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGb250X0JvbGQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlmb250RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9udF9TaXpldmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlmb250RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Rm9udF9TaXpldW5pdCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWZvbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEZvbnRGYW1pbHkoKSB7CisJCXJldHVybiBmb250RmFtaWx5RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QnVpbGRJbkZvbnRGYW1pbHkoKSB7CisJCXJldHVybiBidWlsZEluRm9udEZhbWlseUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCdWlsZEluRm9udEZhbWlseV9DdXN0b20oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlidWlsZEluRm9udEZhbWlseUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tRm9udEZhbWlseSgpIHsKKwkJcmV0dXJuIGN1c3RvbUZvbnRGYW1pbHlFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tRm9udEZhbWlseV9DdXN0b20oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21Gb250RmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNZWRpYSgpIHsKKwkJcmV0dXJuIG1lZGlhRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Qm9yZGVyU3R5bGUoKSB7CisJCXJldHVybiBib3JkZXJTdHlsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCb3JkZXJTdHlsZV9UeXBlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYm9yZGVyU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCb3JkZXJTdHlsZV9XaWR0aHZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYm9yZGVyU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCb3JkZXJTdHlsZV9XaWR0aHVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlib3JkZXJTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJvcmRlclN0eWxlX0NvbG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYm9yZGVyU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEJhc2VTdHlsZSgpIHsKKwkJcmV0dXJuIGJhc2VTdHlsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfRm9ybWF0KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0ZvbnQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQmFja2dyb3VuZGNvbG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfVGV4dGNvbG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX1RleHRhbGlnbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJhc2VTdHlsZV9Cb3JkZXJUb3AoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQm9yZGVyQm90dG9tKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QmFzZVN0eWxlX0JvcmRlckxlZnQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlU3R5bGVfQm9yZGVyUmlnaHQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ1RvcFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nVG9wVW5pdCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ0JvdHRvbVZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVW5pdCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ0xlZnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ0xlZnRVbml0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9QYWRkaW5nUmlnaHRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfUGFkZGluZ1JpZ2h0VW5pdCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luVG9wVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX01hcmdpblRvcFVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX01hcmdpbkxlZnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWJhc2VTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlU3R5bGVfTWFyZ2luTGVmdFVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZVN0eWxlX01hcmdpbkJvdHRvbVZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5Cb3R0b21Vbml0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5SaWdodFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmFzZVN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VTdHlsZV9NYXJnaW5SaWdodFVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSliYXNlU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRNZWRpYVN0eWxlKCkgeworCQlyZXR1cm4gbWVkaWFTdHlsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZWRpYVN0eWxlX01lZGlhKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVkaWFTdHlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3R5bGUoKSB7CisJCXJldHVybiBzdHlsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdHlsZV9FeHRlbmRzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTdHlsZV9NZWRpYXN0eWxlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXN0eWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRTb21lRm9ybWF0KCkgeworCQlyZXR1cm4gc29tZUZvcm1hdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTb21lRm9ybWF0X1VpX3BhdHRlcm4oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzb21lRm9ybWF0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U29tZUZvcm1hdF9SZXBvcnRfcGF0dGVybigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNvbWVGb3JtYXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTb21lRm9ybWF0X1RleHRhbGlnbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNvbWVGb3JtYXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFVvbW9Gb3JtYXQoKSB7CisJCXJldHVybiB1b21vRm9ybWF0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TnVtYmVyRm9ybWF0KCkgeworCQlyZXR1cm4gbnVtYmVyRm9ybWF0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE51bWJlckZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSludW1iZXJGb3JtYXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEN1cnJlbmN5Rm9ybWF0KCkgeworCQlyZXR1cm4gY3VycmVuY3lGb3JtYXRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VycmVuY3lGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY3VycmVuY3lGb3JtYXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERhdGVGb3JtYXQoKSB7CisJCXJldHVybiBkYXRlRm9ybWF0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGVGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0ZUZvcm1hdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RGF0ZVRpbWVGb3JtYXQoKSB7CisJCXJldHVybiBkYXRlVGltZUZvcm1hdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRlVGltZUZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRlVGltZUZvcm1hdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGltZUZvcm1hdCgpIHsKKwkJcmV0dXJuIHRpbWVGb3JtYXRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZUZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lRm9ybWF0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSZXBvcnQoKSB7CisJCXJldHVybiByZXBvcnRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0X0Rlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0X0Rlc2NyaXB0aW9uVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXBvcnRfRGF0YW1hcnRSZWYoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXBvcnRfUmVuZGVyaW5nKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJQnVuZGxlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0X1BhZ2VUZW1wbGF0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydF9NZWRpYSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydF9Ub29sYmFyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0X0Rlc2lnbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0RGVzaWduKCkgeworCQlyZXR1cm4gcmVwb3J0RGVzaWduRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0RGVzaWduRmlsZSgpIHsKKwkJcmV0dXJuIHJlcG9ydERlc2lnbkZpbGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVwb3J0RGVzaWduRmlsZV9OYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVwb3J0RGVzaWduRmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGUoKSB7CisJCXJldHVybiByZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlcG9ydERlc2lnblRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVfSGVhZGVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVwb3J0RGVzaWduVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9EZXRhaWwoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcG9ydERlc2lnblRlbXBsYXRlX0Zvb3RlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlcG9ydERlc2lnblRlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb250YWluZXIoKSB7CisJCXJldHVybiBjb250YWluZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGFpbmVyX0VsZW1lbnRzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQYWdlSGVhZGVyKCkgeworCQlyZXR1cm4gcGFnZUhlYWRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWdlSGVhZGVyX1Nob3dPbkZpcnN0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZUhlYWRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBhZ2VIZWFkZXJfSGVpZ2h0VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlSGVhZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZUhlYWRlcl9IZWlnaHRVbml0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFnZUhlYWRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGFnZURldGFpbCgpIHsKKwkJcmV0dXJuIHBhZ2VEZXRhaWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRQYWdlRm9vdGVyKCkgeworCQlyZXR1cm4gcGFnZUZvb3RlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWdlRm9vdGVyX1Nob3dPbkxhc3QoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlRm9vdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFnZUZvb3Rlcl9IZWlnaHRWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBhZ2VGb290ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYWdlRm9vdGVyX0hlaWdodFVuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwYWdlRm9vdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgeworCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFdpdGhTdHlsZSgpIHsKKwkJcmV0dXJuIHdpdGhTdHlsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXaXRoU3R5bGVfU3R5bGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3aXRoU3R5bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRleHRFbGVtZW50KCkgeworCQlyZXR1cm4gdGV4dEVsZW1lbnRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGV4dEVsZW1lbnRfVGV4dCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRleHRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUaXRsZSgpIHsKKwkJcmV0dXJuIHRpdGxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0U3ViVGl0bGUoKSB7CisJCXJldHVybiBzdWJUaXRsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN1YlN1YlRpdGxlKCkgeworCQlyZXR1cm4gc3ViU3ViVGl0bGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGV4dCgpIHsKKwkJcmV0dXJuIHRleHRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBdXRvVGV4dCgpIHsKKwkJcmV0dXJuIGF1dG9UZXh0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dG9UZXh0X1R5cGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRvVGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBpbWFnZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9TaXplKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW1hZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbWFnZV9TY2FsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW1hZ2VfU291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW1hZ2VfRmlsZW5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0V2l0aEhlYWRlckZvb3RlcigpIHsKKwkJcmV0dXJuIHdpdGhIZWFkZXJGb290ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2l0aEhlYWRlckZvb3Rlcl9EZXRhaWxoZWFkZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl3aXRoSGVhZGVyRm9vdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2l0aEhlYWRlckZvb3Rlcl9IZWFkZXJzdHlsZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdpdGhIZWFkZXJGb290ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXaXRoSGVhZGVyRm9vdGVyX0RldGFpbGZvb3RlcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXdpdGhIZWFkZXJGb290ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXaXRoSGVhZGVyRm9vdGVyX0Zvb3RlcnN0eWxlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2l0aEhlYWRlckZvb3RlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0RGF0YW1hcnRUYWJsZSgpIHsKKwkJcmV0dXJuIGRhdGFtYXJ0VGFibGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZV9Hcm91cHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZV9EZXRhaWwoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhbWFydFRhYmxlR3JvdXAoKSB7CisJCXJldHVybiBkYXRhbWFydFRhYmxlR3JvdXBFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZUdyb3VwX0dyb3VwaW5nUmVmKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGF0YW1hcnRUYWJsZUdyb3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZUdyb3VwX0hlYWRlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFtYXJ0VGFibGVHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVHcm91cF9Gb290ZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlR3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNvbWVHcmlkKCkgeworCQlyZXR1cm4gc29tZUdyaWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U29tZUdyaWRfUm93cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNvbWVHcmlkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoKSB7CisJCXJldHVybiBkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXIoKSB7CisJCXJldHVybiBkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhbWFydFRhYmxlRGV0YWlsKCkgeworCQlyZXR1cm4gZGF0YW1hcnRUYWJsZURldGFpbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlRGV0YWlsX0NvbHVtbkZvcm1hdHRlcnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlRGV0YWlsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKSB7CisJCXJldHVybiBkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0NvbHVtbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFtYXJ0VGFibGVQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9JbnRlcnZhbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGlkZUxhYmVsSW50ZXJ2YWwoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfTG9va3VwcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFtYXJ0VGFibGVQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9IaWRlTGFiZWxMb29rdXAoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGFzSW1hZ2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSW1hZ2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlRm9ybWF0dGVyKCkgeworCQlyZXR1cm4gdGFibGVGb3JtYXR0ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFibGVGb3JtYXR0ZXJfRm9ybWF0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVGb3JtYXR0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlSW1hZ2UoKSB7CisJCXJldHVybiB0YWJsZUltYWdlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlSW1hZ2VfSW1hZ2VQYXRoUGF0dGVybigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRhYmxlSW1hZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZUltYWdlX0hpZGVJbWFnZUxhYmVsKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVJbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlSW1hZ2VfSGFzUGFyYW1ldGVyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVJbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlSW1hZ2VfUmVzaXplKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVJbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlSW1hZ2VfUmVzaXplU3RyaW5nKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVJbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhYmxlSW1hZ2VfSW1hZ2VQYXRoUGFyYW1ldGVyKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFibGVJbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGFibGVWYWx1ZUVsZW1lbnQoKSB7CisJCXJldHVybiB0YWJsZVZhbHVlRWxlbWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlUHJvcGVydHkoKSB7CisJCXJldHVybiB0YWJsZVByb3BlcnR5RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhYmxlUHJvcGVydHlfVmFsdWVSZWYoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl0YWJsZVByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZUFnZ3JlZ2F0aW9uKCkgeworCQlyZXR1cm4gdGFibGVBZ2dyZWdhdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZUFnZ3JlZ2F0aW9uX1RleHQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0YWJsZUFnZ3JlZ2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFibGVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRhYmxlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWJsZUFnZ3JlZ2F0aW9uX09uR3JvdXAoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl0YWJsZUFnZ3JlZ2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIHRhYmxlQmFzZUFnZ3JlZ2F0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uX1ZhbHVlUmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRhYmxlQmFzZUFnZ3JlZ2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZVB1cmVBZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIHRhYmxlUHVyZUFnZ3JlZ2F0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVQdXJlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIHRhYmxlVW5hcnlBZ2dyZWdhdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25fQWdncmVnYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0YWJsZVVuYXJ5QWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIHRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25fQWdncmVnYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0YWJsZU11bHRpcGxlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlQmluYXJ5QWdncmVnYXRpb24oKSB7CisJCXJldHVybiB0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25fQWdncmVnYXRpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZUludGVydmFsKCkgeworCQlyZXR1cm4gdGFibGVJbnRlcnZhbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlTnVtYmVySW50ZXJ2YWwoKSB7CisJCXJldHVybiB0YWJsZU51bWJlckludGVydmFsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlTnVtYmVySW50ZXJ2YWxfTnVtYmVySW50ZXJ2YWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRhYmxlTnVtYmVySW50ZXJ2YWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWJsZU51bWJlckludGVydmFsX051bWJlclJhbmdlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFibGVOdW1iZXJJbnRlcnZhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWwoKSB7CisJCXJldHVybiB0YWJsZURhdGVEYXlJbnRlcnZhbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbF9EYXRlSW50ZXJ2YWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRhYmxlRGF0ZURheUludGVydmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxfRGF0ZVJhbmdlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFibGVEYXRlRGF5SW50ZXJ2YWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlTG9va3VwKCkgeworCQlyZXR1cm4gdGFibGVMb29rdXBFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZU51bWJlckxvb2t1cCgpIHsKKwkJcmV0dXJuIHRhYmxlTnVtYmVyTG9va3VwRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlTnVtYmVyTG9va3VwX0xvb2t1cFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVOdW1iZXJMb29rdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWJsZU51bWJlckxvb2t1cF9EaXNjcmV0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRhYmxlTnVtYmVyTG9va3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZVN0cmluZ0xvb2t1cCgpIHsKKwkJcmV0dXJuIHRhYmxlU3RyaW5nTG9va3VwRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlU3RyaW5nTG9va3VwX0xvb2t1cFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVTdHJpbmdMb29rdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWJsZVN0cmluZ0xvb2t1cF9EaXNjcmV0ZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRhYmxlU3RyaW5nTG9va3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZURhdGVEYXlMb29rdXAoKSB7CisJCXJldHVybiB0YWJsZURhdGVEYXlMb29rdXBFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFibGVEYXRlRGF5TG9va3VwX0xvb2t1cFZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVEYXRlRGF5TG9va3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFibGVEYXRlRGF5TG9va3VwX0Rpc2NyZXRlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFibGVEYXRlRGF5TG9va3VwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZVJhbmdlRWxlbWVudCgpIHsKKwkJcmV0dXJuIHRhYmxlUmFuZ2VFbGVtZW50RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGFibGVUZXh0Q29sb3IoKSB7CisJCXJldHVybiB0YWJsZVRleHRDb2xvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYWJsZVRleHRDb2xvcl9Db2xvcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXRhYmxlVGV4dENvbG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRUYWJsZUNlbGxDb2xvcigpIHsKKwkJcmV0dXJuIHRhYmxlQ2VsbENvbG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhYmxlQ2VsbENvbG9yX0NvbG9yKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpdGFibGVDZWxsQ29sb3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRhYmxlSWNvbigpIHsKKwkJcmV0dXJuIHRhYmxlSWNvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYWJsZUljb25fSWNvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRhYmxlSWNvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGFibGVUcmVuZCgpIHsKKwkJcmV0dXJuIHRhYmxlVHJlbmRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFibGVUcmVuZF9JY29uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVUcmVuZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0VGFibGVUb29sdGlwKCkgeworCQlyZXR1cm4gdGFibGVUb29sdGlwRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhYmxlVG9vbHRpcF9Ub29sdGlwKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFibGVUb29sdGlwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRHcmlkKCkgeworCQlyZXR1cm4gZ3JpZEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEdyaWRSb3coKSB7CisJCXJldHVybiBncmlkUm93RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyaWRSb3dfQ2VsbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlncmlkUm93RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRHcmlkQ2VsbCgpIHsKKwkJcmV0dXJuIGdyaWRDZWxsRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEdyaWRDZWxsX0NvbHVtbnNwYW4oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlncmlkQ2VsbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRVbml0RW51bSgpIHsKKwkJcmV0dXJuIHVuaXRFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFBhZ2VTaXplRW51bSgpIHsKKwkJcmV0dXJuIHBhZ2VTaXplRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRPcmllbnRhdGlvbkVudW0oKSB7CisJCXJldHVybiBvcmllbnRhdGlvbkVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Rm9udFN0eWxlRW51bSgpIHsKKwkJcmV0dXJuIGZvbnRTdHlsZUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtKCkgeworCQlyZXR1cm4gYnVpbGRJbkZvbnRGYW1pbHlFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldEJvcmRlclR5cGVFbnVtKCkgeworCQlyZXR1cm4gYm9yZGVyVHlwZUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0VGV4dEFsaWduRW51bSgpIHsKKwkJcmV0dXJuIHRleHRBbGlnbkVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtKCkgeworCQlyZXR1cm4gbnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtKCkgeworCQlyZXR1cm4gY3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0RGF0ZUZvcm1hdENhdGVnb3J5RW51bSgpIHsKKwkJcmV0dXJuIGRhdGVGb3JtYXRDYXRlZ29yeUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0oKSB7CisJCXJldHVybiBkYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCkgeworCQlyZXR1cm4gdGltZUZvcm1hdENhdGVnb3J5RW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRBdXRvVGV4dEVudW0oKSB7CisJCXJldHVybiBhdXRvVGV4dEVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0SW1hZ2VTaXplRW51bSgpIHsKKwkJcmV0dXJuIGltYWdlU2l6ZUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0SW1hZ2VTb3VyY2VFbnVtKCkgeworCQlyZXR1cm4gaW1hZ2VTb3VyY2VFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtKCkgeworCQlyZXR1cm4gcHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKCkgeworCQlyZXR1cm4gdW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKSB7CisJCXJldHVybiBiaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSgpIHsKKwkJcmV0dXJuIG11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRUcmVuZEljb25FbnVtKCkgeworCQlyZXR1cm4gdHJlbmRJY29uRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSZW5kZXJpbmdFbnVtKCkgeworCQlyZXR1cm4gcmVuZGVyaW5nRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCkgeworCQlyZXR1cm4gaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXBvcnREU0xGYWN0b3J5IGdldFJlcG9ydERTTEZhY3RvcnkoKSB7CisJCXJldHVybiAoUmVwb3J0RFNMRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlyZXBvcnRNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlRfTU9ERUwpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlcG9ydE1vZGVsRUNsYXNzLCBSRVBPUlRfTU9ERUxfX1BDS0cpOworCisJCXJlcG9ydExhenlSZXNvbHZlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlRfTEFaWV9SRVNPTFZFUik7CisJCWNyZWF0ZUVPcGVyYXRpb24ocmVwb3J0TGF6eVJlc29sdmVyRUNsYXNzLCBSRVBPUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QpOworCisJCXJlcG9ydEJhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVQT1JUX0JBU0UpOworCQljcmVhdGVFQXR0cmlidXRlKHJlcG9ydEJhc2VFQ2xhc3MsIFJFUE9SVF9CQVNFX19OQU1FKTsKKworCQlyZXBvcnRQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVF9QQUNLQUdFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fSU1QT1JUX1NFQ1RJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHJlcG9ydFBhY2thZ2VFQ2xhc3MsIFJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlcG9ydFBhY2thZ2VFQ2xhc3MsIFJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fRk9STUFUVEVSUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocmVwb3J0UGFja2FnZUVDbGFzcywgUkVQT1JUX1BBQ0tBR0VfX0NPTE9SUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocmVwb3J0UGFja2FnZUVDbGFzcywgUkVQT1JUX1BBQ0tBR0VfX0ZPTlRTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fTUVESUFTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fU1RZTEVTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRQYWNrYWdlRUNsYXNzLCBSRVBPUlRfUEFDS0FHRV9fUkVQT1JUUyk7CisKKwkJcGFnZVRlbXBsYXRlc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUdFX1RFTVBMQVRFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocGFnZVRlbXBsYXRlc0VDbGFzcywgUEFHRV9URU1QTEFURVNfX1BBR0VURU1QTEFURVMpOworCisJCXNvbWVGb3JtYXRzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPTUVfRk9STUFUUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc29tZUZvcm1hdHNFQ2xhc3MsIFNPTUVfRk9STUFUU19fRk9STUFUVEVSUyk7CisKKwkJY29sb3JzRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTE9SUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY29sb3JzRUNsYXNzLCBDT0xPUlNfX0NPTE9SUyk7CisKKwkJZm9udHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRk9OVFMpOworCQljcmVhdGVFUmVmZXJlbmNlKGZvbnRzRUNsYXNzLCBGT05UU19fRk9OVFMpOworCisJCW1lZGlhc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRURJQVMpOworCQljcmVhdGVFUmVmZXJlbmNlKG1lZGlhc0VDbGFzcywgTUVESUFTX19NRURJQVMpOworCisJCXN0eWxlc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVFlMRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHN0eWxlc0VDbGFzcywgU1RZTEVTX19TVFlMRVMpOworCisJCXBhZ2VUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUdFX1RFTVBMQVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWdlVGVtcGxhdGVFQ2xhc3MsIFBBR0VfVEVNUExBVEVfX1NJWkUpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fT1JJRU5UQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fVE9QX01BUkdJTl9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGFnZVRlbXBsYXRlRUNsYXNzLCBQQUdFX1RFTVBMQVRFX19UT1BfTUFSR0lOX1VOSVQpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fTEVGVF9NQVJHSU5fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fTEVGVF9NQVJHSU5fVU5JVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGFnZVRlbXBsYXRlRUNsYXNzLCBQQUdFX1RFTVBMQVRFX19CT1RUT01fTUFSR0lOX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWdlVGVtcGxhdGVFQ2xhc3MsIFBBR0VfVEVNUExBVEVfX0JPVFRPTV9NQVJHSU5fVU5JVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGFnZVRlbXBsYXRlRUNsYXNzLCBQQUdFX1RFTVBMQVRFX19SSUdIVF9NQVJHSU5fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fUklHSFRfTUFSR0lOX1VOSVQpOworCQljcmVhdGVFUmVmZXJlbmNlKHBhZ2VUZW1wbGF0ZUVDbGFzcywgUEFHRV9URU1QTEFURV9fSEVBREVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwYWdlVGVtcGxhdGVFQ2xhc3MsIFBBR0VfVEVNUExBVEVfX0ZPT1RFUik7CisKKwkJY29sb3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09MT1IpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbG9yRUNsYXNzLCBDT0xPUl9fQ09MT1IpOworCQljcmVhdGVFUmVmZXJlbmNlKGNvbG9yRUNsYXNzLCBDT0xPUl9fQkFTRUNPTE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb2xvckVDbGFzcywgQ09MT1JfX0RBUktFTlNCWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29sb3JFQ2xhc3MsIENPTE9SX19MSUdIVEVOU0JZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb2xvckVDbGFzcywgQ09MT1JfX1RSQU5TRk9STVNCWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY29sb3JFQ2xhc3MsIENPTE9SX19UQVJHRVRDT0xPUik7CisKKwkJZm9udEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGT05UKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShmb250RUNsYXNzLCBGT05UX19FWFRFTkRTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShmb250RUNsYXNzLCBGT05UX19GQU1JTFkpOworCQljcmVhdGVFQXR0cmlidXRlKGZvbnRFQ2xhc3MsIEZPTlRfX1NUWUxFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmb250RUNsYXNzLCBGT05UX19CT0xEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmb250RUNsYXNzLCBGT05UX19TSVpFVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGZvbnRFQ2xhc3MsIEZPTlRfX1NJWkVVTklUKTsKKworCQlmb250RmFtaWx5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZPTlRfRkFNSUxZKTsKKworCQlidWlsZEluRm9udEZhbWlseUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCVUlMRF9JTl9GT05UX0ZBTUlMWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYnVpbGRJbkZvbnRGYW1pbHlFQ2xhc3MsIEJVSUxEX0lOX0ZPTlRfRkFNSUxZX19DVVNUT00pOworCisJCWN1c3RvbUZvbnRGYW1pbHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0ZPTlRfRkFNSUxZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjdXN0b21Gb250RmFtaWx5RUNsYXNzLCBDVVNUT01fRk9OVF9GQU1JTFlfX0NVU1RPTSk7CisKKwkJbWVkaWFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVESUEpOworCisJCWJvcmRlclN0eWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJPUkRFUl9TVFlMRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYm9yZGVyU3R5bGVFQ2xhc3MsIEJPUkRFUl9TVFlMRV9fVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYm9yZGVyU3R5bGVFQ2xhc3MsIEJPUkRFUl9TVFlMRV9fV0lEVEhWQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYm9yZGVyU3R5bGVFQ2xhc3MsIEJPUkRFUl9TVFlMRV9fV0lEVEhVTklUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShib3JkZXJTdHlsZUVDbGFzcywgQk9SREVSX1NUWUxFX19DT0xPUik7CisKKwkJYmFzZVN0eWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJBU0VfU1RZTEUpOworCQljcmVhdGVFUmVmZXJlbmNlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fRk9STUFUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX0ZPTlQpOworCQljcmVhdGVFUmVmZXJlbmNlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fQkFDS0dST1VORENPTE9SKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fVEVYVENPTE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX1RFWFRBTElHTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19CT1JERVJfVE9QKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX0JPUkRFUl9CT1RUT00pOworCQljcmVhdGVFUmVmZXJlbmNlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fQk9SREVSX0xFRlQpOworCQljcmVhdGVFUmVmZXJlbmNlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fQk9SREVSX1JJR0hUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19QQURESU5HX0xFRlRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1VOSVQpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1VOSVQpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19NQVJHSU5fVE9QX1VOSVQpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShiYXNlU3R5bGVFQ2xhc3MsIEJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYmFzZVN0eWxlRUNsYXNzLCBCQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGJhc2VTdHlsZUVDbGFzcywgQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQpOworCisJCW1lZGlhU3R5bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVESUFfU1RZTEUpOworCQljcmVhdGVFUmVmZXJlbmNlKG1lZGlhU3R5bGVFQ2xhc3MsIE1FRElBX1NUWUxFX19NRURJQSk7CisKKwkJc3R5bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RZTEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHN0eWxlRUNsYXNzLCBTVFlMRV9fRVhURU5EUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc3R5bGVFQ2xhc3MsIFNUWUxFX19NRURJQVNUWUxFUyk7CisKKwkJc29tZUZvcm1hdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT01FX0ZPUk1BVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc29tZUZvcm1hdEVDbGFzcywgU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4pOworCQljcmVhdGVFQXR0cmlidXRlKHNvbWVGb3JtYXRFQ2xhc3MsIFNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc29tZUZvcm1hdEVDbGFzcywgU09NRV9GT1JNQVRfX1RFWFRBTElHTik7CisKKwkJdW9tb0Zvcm1hdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVT01PX0ZPUk1BVCk7CisKKwkJbnVtYmVyRm9ybWF0RUNsYXNzID0gY3JlYXRlRUNsYXNzKE5VTUJFUl9GT1JNQVQpOworCQljcmVhdGVFQXR0cmlidXRlKG51bWJlckZvcm1hdEVDbGFzcywgTlVNQkVSX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKTsKKworCQljdXJyZW5jeUZvcm1hdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDVVJSRU5DWV9GT1JNQVQpOworCQljcmVhdGVFQXR0cmlidXRlKGN1cnJlbmN5Rm9ybWF0RUNsYXNzLCBDVVJSRU5DWV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSk7CisKKwkJZGF0ZUZvcm1hdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEQVRFX0ZPUk1BVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0ZUZvcm1hdEVDbGFzcywgREFURV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSk7CisKKwkJZGF0ZVRpbWVGb3JtYXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFURV9USU1FX0ZPUk1BVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0ZVRpbWVGb3JtYXRFQ2xhc3MsIERBVEVfVElNRV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSk7CisKKwkJdGltZUZvcm1hdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUSU1FX0ZPUk1BVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGltZUZvcm1hdEVDbGFzcywgVElNRV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSk7CisKKwkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocmVwb3J0RUNsYXNzLCBSRVBPUlRfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXBvcnRFQ2xhc3MsIFJFUE9SVF9fREVTQ1JJUFRJT05fVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlcG9ydEVDbGFzcywgUkVQT1JUX19EQVRBTUFSVF9SRUYpOworCQljcmVhdGVFQXR0cmlidXRlKHJlcG9ydEVDbGFzcywgUkVQT1JUX19SRU5ERVJJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKHJlcG9ydEVDbGFzcywgUkVQT1JUX19FWFRFUk5BTF9DU1NfVVJJKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXBvcnRFQ2xhc3MsIFJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlcG9ydEVDbGFzcywgUkVQT1JUX19QQUdFX1RFTVBMQVRFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRFQ2xhc3MsIFJFUE9SVF9fTUVESUEpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlcG9ydEVDbGFzcywgUkVQT1JUX19UT09MQkFSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnRFQ2xhc3MsIFJFUE9SVF9fREVTSUdOKTsKKworCQlyZXBvcnREZXNpZ25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVQT1JUX0RFU0lHTik7CisKKwkJcmVwb3J0RGVzaWduRmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlRfREVTSUdOX0ZJTEUpOworCQljcmVhdGVFQXR0cmlidXRlKHJlcG9ydERlc2lnbkZpbGVFQ2xhc3MsIFJFUE9SVF9ERVNJR05fRklMRV9fTkFNRSk7CisKKwkJcmVwb3J0RGVzaWduVGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVQT1JUX0RFU0lHTl9URU1QTEFURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocmVwb3J0RGVzaWduVGVtcGxhdGVFQ2xhc3MsIFJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcywgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fSEVBREVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcywgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVUQUlMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcywgUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSKTsKKworCQljb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEFJTkVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJFQ2xhc3MsIENPTlRBSU5FUl9fRUxFTUVOVFMpOworCisJCXBhZ2VIZWFkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFHRV9IRUFERVIpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VIZWFkZXJFQ2xhc3MsIFBBR0VfSEVBREVSX19TSE9XX09OX0ZJUlNUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWdlSGVhZGVyRUNsYXNzLCBQQUdFX0hFQURFUl9fSEVJR0hUX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwYWdlSGVhZGVyRUNsYXNzLCBQQUdFX0hFQURFUl9fSEVJR0hUX1VOSVQpOworCisJCXBhZ2VEZXRhaWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFHRV9ERVRBSUwpOworCisJCXBhZ2VGb290ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFHRV9GT09URVIpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VGb290ZXJFQ2xhc3MsIFBBR0VfRk9PVEVSX19TSE9XX09OX0xBU1QpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VGb290ZXJFQ2xhc3MsIFBBR0VfRk9PVEVSX19IRUlHSFRfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHBhZ2VGb290ZXJFQ2xhc3MsIFBBR0VfRk9PVEVSX19IRUlHSFRfVU5JVCk7CisKKwkJZWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTEVNRU5UKTsKKworCQl3aXRoU3R5bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0lUSF9TVFlMRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2l0aFN0eWxlRUNsYXNzLCBXSVRIX1NUWUxFX19TVFlMRSk7CisKKwkJdGV4dEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVYVF9FTEVNRU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXh0RWxlbWVudEVDbGFzcywgVEVYVF9FTEVNRU5UX19URVhUKTsKKworCQl0aXRsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUSVRMRSk7CisKKwkJc3ViVGl0bGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1VCX1RJVExFKTsKKworCQlzdWJTdWJUaXRsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVUJfU1VCX1RJVExFKTsKKworCQlsYWJlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMQUJFTCk7CisKKwkJdGV4dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVhUKTsKKworCQlhdXRvVGV4dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRPX1RFWFQpOworCQljcmVhdGVFQXR0cmlidXRlKGF1dG9UZXh0RUNsYXNzLCBBVVRPX1RFWFRfX1RZUEUpOworCisJCWltYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQUdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpbWFnZUVDbGFzcywgSU1BR0VfX1NJWkUpOworCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fU0NBTEUpOworCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fU09VUkNFX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fRklMRU5BTUUpOworCisJCXdpdGhIZWFkZXJGb290ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0lUSF9IRUFERVJfRk9PVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh3aXRoSGVhZGVyRm9vdGVyRUNsYXNzLCBXSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEhFQURFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2l0aEhlYWRlckZvb3RlckVDbGFzcywgV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUod2l0aEhlYWRlckZvb3RlckVDbGFzcywgV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHdpdGhIZWFkZXJGb290ZXJFQ2xhc3MsIFdJVEhfSEVBREVSX0ZPT1RFUl9fRk9PVEVSU1RZTEUpOworCisJCWRhdGFtYXJ0VGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQU1BUlRfVEFCTEUpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFtYXJ0VGFibGVFQ2xhc3MsIERBVEFNQVJUX1RBQkxFX19HUk9VUFMpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFtYXJ0VGFibGVFQ2xhc3MsIERBVEFNQVJUX1RBQkxFX19ERVRBSUwpOworCisJCWRhdGFtYXJ0VGFibGVHcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEQVRBTUFSVF9UQUJMRV9HUk9VUCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YW1hcnRUYWJsZUdyb3VwRUNsYXNzLCBEQVRBTUFSVF9UQUJMRV9HUk9VUF9fR1JPVVBJTkdfUkVGKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkYXRhbWFydFRhYmxlR3JvdXBFQ2xhc3MsIERBVEFNQVJUX1RBQkxFX0dST1VQX19IRUFERVIpOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFtYXJ0VGFibGVHcm91cEVDbGFzcywgREFUQU1BUlRfVEFCTEVfR1JPVVBfX0ZPT1RFUik7CisKKwkJc29tZUdyaWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09NRV9HUklEKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzb21lR3JpZEVDbGFzcywgU09NRV9HUklEX19ST1dTKTsKKworCQlkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSKTsKKworCQlkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSKTsKKworCQlkYXRhbWFydFRhYmxlRGV0YWlsRUNsYXNzID0gY3JlYXRlRUNsYXNzKERBVEFNQVJUX1RBQkxFX0RFVEFJTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YW1hcnRUYWJsZURldGFpbEVDbGFzcywgREFUQU1BUlRfVEFCTEVfREVUQUlMX19DT0xVTU5fRk9STUFUVEVSUyk7CisKKwkJZGF0YW1hcnRUYWJsZVByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERBVEFNQVJUX1RBQkxFX1BST1BFUlRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MsIERBVEFNQVJUX1RBQkxFX1BST1BFUlRZX19DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKGRhdGFtYXJ0VGFibGVQcm9wZXJ0eUVDbGFzcywgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0lOVEVSVkFMUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YW1hcnRUYWJsZVByb3BlcnR5RUNsYXNzLCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9JTlRFUlZBTCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YW1hcnRUYWJsZVByb3BlcnR5RUNsYXNzLCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fTE9PS1VQUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YW1hcnRUYWJsZVByb3BlcnR5RUNsYXNzLCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSElERV9MQUJFTF9MT09LVVApOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFtYXJ0VGFibGVQcm9wZXJ0eUVDbGFzcywgREFUQU1BUlRfVEFCTEVfUFJPUEVSVFlfX0hBU19JTUFHRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YW1hcnRUYWJsZVByb3BlcnR5RUNsYXNzLCBEQVRBTUFSVF9UQUJMRV9QUk9QRVJUWV9fSU1BR0UpOworCisJCXRhYmxlRm9ybWF0dGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0ZPUk1BVFRFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGFibGVGb3JtYXR0ZXJFQ2xhc3MsIFRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUKTsKKworCQl0YWJsZUltYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0lNQUdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZUltYWdlRUNsYXNzLCBUQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVRURVJOKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZUltYWdlRUNsYXNzLCBUQUJMRV9JTUFHRV9fSElERV9JTUFHRV9MQUJFTCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGFibGVJbWFnZUVDbGFzcywgVEFCTEVfSU1BR0VfX0hBU19QQVJBTUVURVIpOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlSW1hZ2VFQ2xhc3MsIFRBQkxFX0lNQUdFX19SRVNJWkUpOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlSW1hZ2VFQ2xhc3MsIFRBQkxFX0lNQUdFX19SRVNJWkVfU1RSSU5HKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0YWJsZUltYWdlRUNsYXNzLCBUQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVJBTUVURVIpOworCisJCXRhYmxlVmFsdWVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX1ZBTFVFX0VMRU1FTlQpOworCisJCXRhYmxlUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfUFJPUEVSVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKHRhYmxlUHJvcGVydHlFQ2xhc3MsIFRBQkxFX1BST1BFUlRZX19WQUxVRV9SRUYpOworCisJCXRhYmxlQWdncmVnYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfQUdHUkVHQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlQWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX0FHR1JFR0FUSU9OX19URVhUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0YWJsZUFnZ3JlZ2F0aW9uRUNsYXNzLCBUQUJMRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKHRhYmxlQWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX0FHR1JFR0FUSU9OX19PTl9HUk9VUCk7CisKKwkJdGFibGVCYXNlQWdncmVnYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfQkFTRV9BR0dSRUdBVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UodGFibGVCYXNlQWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX0JBU0VfQUdHUkVHQVRJT05fX1ZBTFVFX1JFRlMpOworCisJCXRhYmxlUHVyZUFnZ3JlZ2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX1BVUkVfQUdHUkVHQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlUHVyZUFnZ3JlZ2F0aW9uRUNsYXNzLCBUQUJMRV9QVVJFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTik7CisKKwkJdGFibGVVbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZVVuYXJ5QWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTik7CisKKwkJdGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZU11bHRpcGxlQWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTik7CisKKwkJdGFibGVCaW5hcnlBZ2dyZWdhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9CSU5BUllfQUdHUkVHQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlQmluYXJ5QWdncmVnYXRpb25FQ2xhc3MsIFRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04pOworCisJCXRhYmxlSW50ZXJ2YWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfSU5URVJWQUwpOworCisJCXRhYmxlTnVtYmVySW50ZXJ2YWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfTlVNQkVSX0lOVEVSVkFMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZU51bWJlckludGVydmFsRUNsYXNzLCBUQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodGFibGVOdW1iZXJJbnRlcnZhbEVDbGFzcywgVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UpOworCisJCXRhYmxlRGF0ZURheUludGVydmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0RBVEVfREFZX0lOVEVSVkFMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZURhdGVEYXlJbnRlcnZhbEVDbGFzcywgVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfSU5URVJWQUxfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHRhYmxlRGF0ZURheUludGVydmFsRUNsYXNzLCBUQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9SQU5HRSk7CisKKwkJdGFibGVMb29rdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFCTEVfTE9PS1VQKTsKKworCQl0YWJsZU51bWJlckxvb2t1cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9OVU1CRVJfTE9PS1VQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZU51bWJlckxvb2t1cEVDbGFzcywgVEFCTEVfTlVNQkVSX0xPT0tVUF9fTE9PS1VQX1ZBTFVFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0YWJsZU51bWJlckxvb2t1cEVDbGFzcywgVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEUpOworCisJCXRhYmxlU3RyaW5nTG9va3VwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX1NUUklOR19MT09LVVApOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlU3RyaW5nTG9va3VwRUNsYXNzLCBUQUJMRV9TVFJJTkdfTE9PS1VQX19MT09LVVBfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHRhYmxlU3RyaW5nTG9va3VwRUNsYXNzLCBUQUJMRV9TVFJJTkdfTE9PS1VQX19ESVNDUkVURSk7CisKKwkJdGFibGVEYXRlRGF5TG9va3VwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0RBVEVfREFZX0xPT0tVUCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGFibGVEYXRlRGF5TG9va3VwRUNsYXNzLCBUQUJMRV9EQVRFX0RBWV9MT09LVVBfX0xPT0tVUF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodGFibGVEYXRlRGF5TG9va3VwRUNsYXNzLCBUQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFKTsKKworCQl0YWJsZVJhbmdlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9SQU5HRV9FTEVNRU5UKTsKKworCQl0YWJsZVRleHRDb2xvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9URVhUX0NPTE9SKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0YWJsZVRleHRDb2xvckVDbGFzcywgVEFCTEVfVEVYVF9DT0xPUl9fQ09MT1IpOworCisJCXRhYmxlQ2VsbENvbG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0NFTExfQ09MT1IpOworCQljcmVhdGVFUmVmZXJlbmNlKHRhYmxlQ2VsbENvbG9yRUNsYXNzLCBUQUJMRV9DRUxMX0NPTE9SX19DT0xPUik7CisKKwkJdGFibGVJY29uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBQkxFX0lDT04pOworCQljcmVhdGVFQXR0cmlidXRlKHRhYmxlSWNvbkVDbGFzcywgVEFCTEVfSUNPTl9fSUNPTik7CisKKwkJdGFibGVUcmVuZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9UUkVORCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGFibGVUcmVuZEVDbGFzcywgVEFCTEVfVFJFTkRfX0lDT04pOworCisJCXRhYmxlVG9vbHRpcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUJMRV9UT09MVElQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0YWJsZVRvb2x0aXBFQ2xhc3MsIFRBQkxFX1RPT0xUSVBfX1RPT0xUSVApOworCisJCWdyaWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JJRCk7CisKKwkJZ3JpZFJvd0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUklEX1JPVyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZ3JpZFJvd0VDbGFzcywgR1JJRF9ST1dfX0NFTExTKTsKKworCQlncmlkQ2VsbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUklEX0NFTEwpOworCQljcmVhdGVFQXR0cmlidXRlKGdyaWRDZWxsRUNsYXNzLCBHUklEX0NFTExfX0NPTFVNTlNQQU4pOworCisJCS8vIENyZWF0ZSBlbnVtcworCQl1bml0RW51bUVFbnVtID0gY3JlYXRlRUVudW0oVU5JVF9FTlVNKTsKKwkJcGFnZVNpemVFbnVtRUVudW0gPSBjcmVhdGVFRW51bShQQUdFX1NJWkVfRU5VTSk7CisJCW9yaWVudGF0aW9uRW51bUVFbnVtID0gY3JlYXRlRUVudW0oT1JJRU5UQVRJT05fRU5VTSk7CisJCWZvbnRTdHlsZUVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKEZPTlRfU1RZTEVfRU5VTSk7CisJCWJ1aWxkSW5Gb250RmFtaWx5RW51bUVFbnVtID0gY3JlYXRlRUVudW0oQlVJTERfSU5fRk9OVF9GQU1JTFlfRU5VTSk7CisJCWJvcmRlclR5cGVFbnVtRUVudW0gPSBjcmVhdGVFRW51bShCT1JERVJfVFlQRV9FTlVNKTsKKwkJdGV4dEFsaWduRW51bUVFbnVtID0gY3JlYXRlRUVudW0oVEVYVF9BTElHTl9FTlVNKTsKKwkJbnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0gPSBjcmVhdGVFRW51bShOVU1CRVJfRk9STUFUX0NBVEVHT1JZX0VOVU0pOworCQljdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtID0gY3JlYXRlRUVudW0oQ1VSUkVOQ1lfRk9STUFUX0NBVEVHT1JZX0VOVU0pOworCQlkYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0gPSBjcmVhdGVFRW51bShEQVRFX0ZPUk1BVF9DQVRFR09SWV9FTlVNKTsKKwkJZGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKERBVEVfVElNRV9GT1JNQVRfQ0FURUdPUllfRU5VTSk7CisJCXRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKFRJTUVfRk9STUFUX0NBVEVHT1JZX0VOVU0pOworCQlhdXRvVGV4dEVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKEFVVE9fVEVYVF9FTlVNKTsKKwkJaW1hZ2VTaXplRW51bUVFbnVtID0gY3JlYXRlRUVudW0oSU1BR0VfU0laRV9FTlVNKTsKKwkJaW1hZ2VTb3VyY2VFbnVtRUVudW0gPSBjcmVhdGVFRW51bShJTUFHRV9TT1VSQ0VfRU5VTSk7CisJCXB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0gPSBjcmVhdGVFRW51bShQVVJFX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSk7CisJCXVuYXJ5QWdncmVnYXRpb25UeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oVU5BUllfQUdHUkVHQVRJT05fVFlQRV9FTlVNKTsKKwkJYmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oQklOQVJZX0FHR1JFR0FUSU9OX1RZUEVfRU5VTSk7CisJCW11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oTVVMVElQTEVfQUdHUkVHQVRJT05fVFlQRV9FTlVNKTsKKwkJdHJlbmRJY29uRW51bUVFbnVtID0gY3JlYXRlRUVudW0oVFJFTkRfSUNPTl9FTlVNKTsKKwkJcmVuZGVyaW5nRW51bUVFbnVtID0gY3JlYXRlRUVudW0oUkVOREVSSU5HX0VOVU0pOworCisJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCWludGVybmFsRU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTlRFUk5BTF9FT0JKRUNUKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOworCQlPU0JQVHlwZXNQYWNrYWdlIHRoZU9TQlBUeXBlc1BhY2thZ2UgPSAoT1NCUFR5cGVzUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPU0JQVHlwZXNQYWNrYWdlLmVOU19VUkkpOworCQlYdHlwZVBhY2thZ2UgdGhlWHR5cGVQYWNrYWdlID0gKFh0eXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYdHlwZVBhY2thZ2UuZU5TX1VSSSk7CisJCURhdGFtYXJ0RFNMUGFja2FnZSB0aGVEYXRhbWFydERTTFBhY2thZ2UgPSAoRGF0YW1hcnREU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERhdGFtYXJ0RFNMUGFja2FnZS5lTlNfVVJJKTsKKwkJQWN0aW9uRFNMUGFja2FnZSB0aGVBY3Rpb25EU0xQYWNrYWdlID0gKEFjdGlvbkRTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQWN0aW9uRFNMUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQlyZXBvcnRCYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQlyZXBvcnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9TQlBUeXBlc1BhY2thZ2UuZ2V0TFBhY2thZ2UoKSk7CisJCXBhZ2VUZW1wbGF0ZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCXNvbWVGb3JtYXRzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQljb2xvcnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCWZvbnRzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQltZWRpYXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCXN0eWxlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJcGFnZVRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0QmFzZSgpKTsKKwkJY29sb3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRCYXNlKCkpOworCQlmb250RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0QmFzZSgpKTsKKwkJZm9udEZhbWlseUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJYnVpbGRJbkZvbnRGYW1pbHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGb250RmFtaWx5KCkpOworCQljdXN0b21Gb250RmFtaWx5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Rm9udEZhbWlseSgpKTsKKwkJbWVkaWFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRCYXNlKCkpOworCQlib3JkZXJTdHlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJYmFzZVN0eWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQltZWRpYVN0eWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmFzZVN0eWxlKCkpOworCQlzdHlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydEJhc2UoKSk7CisJCXN0eWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmFzZVN0eWxlKCkpOworCQlzb21lRm9ybWF0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0QmFzZSgpKTsKKwkJdW9tb0Zvcm1hdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNvbWVGb3JtYXQoKSk7CisJCW51bWJlckZvcm1hdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNvbWVGb3JtYXQoKSk7CisJCWN1cnJlbmN5Rm9ybWF0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U29tZUZvcm1hdCgpKTsKKwkJZGF0ZUZvcm1hdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNvbWVGb3JtYXQoKSk7CisJCWRhdGVUaW1lRm9ybWF0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U29tZUZvcm1hdCgpKTsKKwkJdGltZUZvcm1hdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNvbWVGb3JtYXQoKSk7CisJCXJlcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydEJhc2UoKSk7CisJCXJlcG9ydERlc2lnbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJcmVwb3J0RGVzaWduRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydERlc2lnbigpKTsKKwkJcmVwb3J0RGVzaWduVGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnREZXNpZ24oKSk7CisJCWNvbnRhaW5lckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJcGFnZUhlYWRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRhaW5lcigpKTsKKwkJcGFnZURldGFpbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRhaW5lcigpKTsKKwkJcGFnZUZvb3RlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRhaW5lcigpKTsKKwkJZWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJd2l0aFN0eWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQl0ZXh0RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVsZW1lbnQoKSk7CisJCXRleHRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2l0aFN0eWxlKCkpOworCQl0aXRsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRleHRFbGVtZW50KCkpOworCQlzdWJUaXRsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRleHRFbGVtZW50KCkpOworCQlzdWJTdWJUaXRsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRleHRFbGVtZW50KCkpOworCQlsYWJlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRleHRFbGVtZW50KCkpOworCQl0ZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGV4dEVsZW1lbnQoKSk7CisJCWF1dG9UZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKKwkJYXV0b1RleHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXaXRoU3R5bGUoKSk7CisJCWltYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKKwkJaW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXaXRoU3R5bGUoKSk7CisJCXdpdGhIZWFkZXJGb290ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCWRhdGFtYXJ0VGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRCYXNlKCkpOworCQlkYXRhbWFydFRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKKwkJZGF0YW1hcnRUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdpdGhTdHlsZSgpKTsKKwkJZGF0YW1hcnRUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdpdGhIZWFkZXJGb290ZXIoKSk7CisJCWRhdGFtYXJ0VGFibGVHcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydEJhc2UoKSk7CisJCWRhdGFtYXJ0VGFibGVHcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdpdGhIZWFkZXJGb290ZXIoKSk7CisJCXNvbWVHcmlkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQlkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOworCQlkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTb21lR3JpZCgpKTsKKwkJZGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2l0aFN0eWxlKCkpOworCQlkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOworCQlkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTb21lR3JpZCgpKTsKKwkJZGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2l0aFN0eWxlKCkpOworCQlkYXRhbWFydFRhYmxlRGV0YWlsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2l0aFN0eWxlKCkpOworCQlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOworCQlkYXRhbWFydFRhYmxlUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXaXRoU3R5bGUoKSk7CisJCXRhYmxlSW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCXRhYmxlVmFsdWVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQl0YWJsZVByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGFibGVWYWx1ZUVsZW1lbnQoKSk7CisJCXRhYmxlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZVZhbHVlRWxlbWVudCgpKTsKKwkJdGFibGVCYXNlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRMYXp5UmVzb2x2ZXIoKSk7CisJCXRhYmxlUHVyZUFnZ3JlZ2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGFibGVCYXNlQWdncmVnYXRpb24oKSk7CisJCXRhYmxlVW5hcnlBZ2dyZWdhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCkpOworCQl0YWJsZU11bHRpcGxlQWdncmVnYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZUJhc2VBZ2dyZWdhdGlvbigpKTsKKwkJdGFibGVCaW5hcnlBZ2dyZWdhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCkpOworCQl0YWJsZUludGVydmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQl0YWJsZU51bWJlckludGVydmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGFibGVJbnRlcnZhbCgpKTsKKwkJdGFibGVEYXRlRGF5SW50ZXJ2YWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZUludGVydmFsKCkpOworCQl0YWJsZUxvb2t1cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydExhenlSZXNvbHZlcigpKTsKKwkJdGFibGVOdW1iZXJMb29rdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZUxvb2t1cCgpKTsKKwkJdGFibGVTdHJpbmdMb29rdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZUxvb2t1cCgpKTsKKwkJdGFibGVEYXRlRGF5TG9va3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VGFibGVMb29rdXAoKSk7CisJCXRhYmxlUmFuZ2VFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UmVwb3J0TGF6eVJlc29sdmVyKCkpOworCQl0YWJsZVRleHRDb2xvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRhYmxlUmFuZ2VFbGVtZW50KCkpOworCQl0YWJsZUNlbGxDb2xvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRhYmxlUmFuZ2VFbGVtZW50KCkpOworCQl0YWJsZUljb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZVJhbmdlRWxlbWVudCgpKTsKKwkJdGFibGVUcmVuZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFRhYmxlUmFuZ2VFbGVtZW50KCkpOworCQl0YWJsZVRvb2x0aXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRUYWJsZVJhbmdlRWxlbWVudCgpKTsKKwkJZ3JpZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydEJhc2UoKSk7CisJCWdyaWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOworCQlncmlkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U29tZUdyaWQoKSk7CisJCWdyaWRSb3dFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZXBvcnRCYXNlKCkpOworCQlncmlkUm93RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2l0aFN0eWxlKCkpOworCQlncmlkQ2VsbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlcG9ydEJhc2UoKSk7CisJCWdyaWRDZWxsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKHJlcG9ydE1vZGVsRUNsYXNzLCBSZXBvcnRNb2RlbC5jbGFzcywgIlJlcG9ydE1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnRNb2RlbF9QY2tnKCksIHRoaXMuZ2V0UmVwb3J0UGFja2FnZSgpLCBudWxsLCAicGNrZyIsIG51bGwsIDAsIC0xLCBSZXBvcnRNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJlcG9ydExhenlSZXNvbHZlckVDbGFzcywgUmVwb3J0TGF6eVJlc29sdmVyLmNsYXNzLCAiUmVwb3J0TGF6eVJlc29sdmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCUVPcGVyYXRpb24gb3AgPSBpbml0RU9wZXJhdGlvbihnZXRSZXBvcnRMYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RU9iamVjdCgpLCAiZVJlc29sdmVQcm94eSIsIDAsIDEsICFJU19VTklRVUUsIElTX09SREVSRUQpOworCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEludGVybmFsRU9iamVjdCgpLCAicHJveHkiLCAwLCAxLCAhSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJlcG9ydEJhc2VFQ2xhc3MsIFJlcG9ydEJhc2UuY2xhc3MsICJSZXBvcnRCYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSZXBvcnRCYXNlX05hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBSZXBvcnRCYXNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJlcG9ydFBhY2thZ2VFQ2xhc3MsIFJlcG9ydFBhY2thZ2UuY2xhc3MsICJSZXBvcnRQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnRQYWNrYWdlX0ltcG9ydFNlY3Rpb24oKSwgdGhlWHR5cGVQYWNrYWdlLmdldFhJbXBvcnRTZWN0aW9uKCksIG51bGwsICJpbXBvcnRTZWN0aW9uIiwgbnVsbCwgMCwgMSwgUmVwb3J0UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXh0ZXJuYWxDc3NVUkkiLCBudWxsLCAwLCAxLCBSZXBvcnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVwb3J0UGFja2FnZV9FeHRlcm5hbENzc1VSSUJ1bmRsZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXh0ZXJuYWxDc3NVUklCdW5kbGUiLCBudWxsLCAwLCAxLCBSZXBvcnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0UGFja2FnZV9QYWdldGVtcGxhdGVzKCksIHRoaXMuZ2V0UGFnZVRlbXBsYXRlcygpLCBudWxsLCAicGFnZXRlbXBsYXRlcyIsIG51bGwsIDAsIDEsIFJlcG9ydFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJlcG9ydFBhY2thZ2VfRm9ybWF0dGVycygpLCB0aGlzLmdldFNvbWVGb3JtYXRzKCksIG51bGwsICJmb3JtYXR0ZXJzIiwgbnVsbCwgMCwgMSwgUmVwb3J0UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0UGFja2FnZV9Db2xvcnMoKSwgdGhpcy5nZXRDb2xvcnMoKSwgbnVsbCwgImNvbG9ycyIsIG51bGwsIDAsIDEsIFJlcG9ydFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJlcG9ydFBhY2thZ2VfRm9udHMoKSwgdGhpcy5nZXRGb250cygpLCBudWxsLCAiZm9udHMiLCBudWxsLCAwLCAxLCBSZXBvcnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnRQYWNrYWdlX01lZGlhcygpLCB0aGlzLmdldE1lZGlhcygpLCBudWxsLCAibWVkaWFzIiwgbnVsbCwgMCwgMSwgUmVwb3J0UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0UGFja2FnZV9TdHlsZXMoKSwgdGhpcy5nZXRTdHlsZXMoKSwgbnVsbCwgInN0eWxlcyIsIG51bGwsIDAsIDEsIFJlcG9ydFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJlcG9ydFBhY2thZ2VfUmVwb3J0cygpLCB0aGlzLmdldFJlcG9ydCgpLCBudWxsLCAicmVwb3J0cyIsIG51bGwsIDAsIC0xLCBSZXBvcnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGFnZVRlbXBsYXRlc0VDbGFzcywgUGFnZVRlbXBsYXRlcy5jbGFzcywgIlBhZ2VUZW1wbGF0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBhZ2VUZW1wbGF0ZXNfUGFnZXRlbXBsYXRlcygpLCB0aGlzLmdldFBhZ2VUZW1wbGF0ZSgpLCBudWxsLCAicGFnZXRlbXBsYXRlcyIsIG51bGwsIDAsIC0xLCBQYWdlVGVtcGxhdGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Moc29tZUZvcm1hdHNFQ2xhc3MsIFNvbWVGb3JtYXRzLmNsYXNzLCAiU29tZUZvcm1hdHMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFNvbWVGb3JtYXRzX0Zvcm1hdHRlcnMoKSwgdGhpcy5nZXRTb21lRm9ybWF0KCksIG51bGwsICJmb3JtYXR0ZXJzIiwgbnVsbCwgMCwgLTEsIFNvbWVGb3JtYXRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY29sb3JzRUNsYXNzLCBDb2xvcnMuY2xhc3MsICJDb2xvcnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldENvbG9yc19Db2xvcnMoKSwgdGhpcy5nZXRDb2xvcigpLCBudWxsLCAiY29sb3JzIiwgbnVsbCwgMCwgLTEsIENvbG9ycy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGZvbnRzRUNsYXNzLCBGb250cy5jbGFzcywgIkZvbnRzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRGb250c19Gb250cygpLCB0aGlzLmdldEZvbnQoKSwgbnVsbCwgImZvbnRzIiwgbnVsbCwgMCwgLTEsIEZvbnRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MobWVkaWFzRUNsYXNzLCBNZWRpYXMuY2xhc3MsICJNZWRpYXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldE1lZGlhc19NZWRpYXMoKSwgdGhpcy5nZXRNZWRpYSgpLCBudWxsLCAibWVkaWFzIiwgbnVsbCwgMCwgLTEsIE1lZGlhcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHN0eWxlc0VDbGFzcywgU3R5bGVzLmNsYXNzLCAiU3R5bGVzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRTdHlsZXNfU3R5bGVzKCksIHRoaXMuZ2V0U3R5bGUoKSwgbnVsbCwgInN0eWxlcyIsIG51bGwsIDAsIC0xLCBTdHlsZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwYWdlVGVtcGxhdGVFQ2xhc3MsIFBhZ2VUZW1wbGF0ZS5jbGFzcywgIlBhZ2VUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZVRlbXBsYXRlX1NpemUoKSwgdGhpcy5nZXRQYWdlU2l6ZUVudW0oKSwgInNpemUiLCBudWxsLCAwLCAxLCBQYWdlVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWdlVGVtcGxhdGVfT3JpZW50YXRpb24oKSwgdGhpcy5nZXRPcmllbnRhdGlvbkVudW0oKSwgIm9yaWVudGF0aW9uIiwgbnVsbCwgMCwgMSwgUGFnZVRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZVRlbXBsYXRlX1RvcE1hcmdpblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJ0b3BNYXJnaW5WYWx1ZSIsIG51bGwsIDAsIDEsIFBhZ2VUZW1wbGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBhZ2VUZW1wbGF0ZV9Ub3BNYXJnaW5Vbml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgInRvcE1hcmdpblVuaXQiLCBudWxsLCAwLCAxLCBQYWdlVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWdlVGVtcGxhdGVfTGVmdE1hcmdpblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJsZWZ0TWFyZ2luVmFsdWUiLCBudWxsLCAwLCAxLCBQYWdlVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWdlVGVtcGxhdGVfTGVmdE1hcmdpblVuaXQoKSwgdGhpcy5nZXRVbml0RW51bSgpLCAibGVmdE1hcmdpblVuaXQiLCBudWxsLCAwLCAxLCBQYWdlVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWdlVGVtcGxhdGVfQm90dG9tTWFyZ2luVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgImJvdHRvbU1hcmdpblZhbHVlIiwgbnVsbCwgMCwgMSwgUGFnZVRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZVRlbXBsYXRlX0JvdHRvbU1hcmdpblVuaXQoKSwgdGhpcy5nZXRVbml0RW51bSgpLCAiYm90dG9tTWFyZ2luVW5pdCIsIG51bGwsIDAsIDEsIFBhZ2VUZW1wbGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBhZ2VUZW1wbGF0ZV9SaWdodE1hcmdpblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJyaWdodE1hcmdpblZhbHVlIiwgbnVsbCwgMCwgMSwgUGFnZVRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZVRlbXBsYXRlX1JpZ2h0TWFyZ2luVW5pdCgpLCB0aGlzLmdldFVuaXRFbnVtKCksICJyaWdodE1hcmdpblVuaXQiLCBudWxsLCAwLCAxLCBQYWdlVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQYWdlVGVtcGxhdGVfSGVhZGVyKCksIHRoaXMuZ2V0UGFnZUhlYWRlcigpLCBudWxsLCAiaGVhZGVyIiwgbnVsbCwgMCwgMSwgUGFnZVRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQYWdlVGVtcGxhdGVfRm9vdGVyKCksIHRoaXMuZ2V0UGFnZUZvb3RlcigpLCBudWxsLCAiZm9vdGVyIiwgbnVsbCwgMCwgMSwgUGFnZVRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY29sb3JFQ2xhc3MsIENvbG9yLmNsYXNzLCAiQ29sb3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENvbG9yX0NvbG9yKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb2xvciIsIG51bGwsIDAsIDEsIENvbG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29sb3JfQmFzZWNvbG9yKCksIHRoaXMuZ2V0Q29sb3IoKSwgbnVsbCwgImJhc2Vjb2xvciIsIG51bGwsIDAsIDEsIENvbG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDb2xvcl9EYXJrZW5zYnkoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJkYXJrZW5zYnkiLCBudWxsLCAwLCAxLCBDb2xvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENvbG9yX0xpZ2h0ZW5zYnkoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJsaWdodGVuc2J5IiwgbnVsbCwgMCwgMSwgQ29sb3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDb2xvcl9UcmFuc2Zvcm1zYnkoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJ0cmFuc2Zvcm1zYnkiLCBudWxsLCAwLCAxLCBDb2xvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldENvbG9yX1RhcmdldGNvbG9yKCksIHRoaXMuZ2V0Q29sb3IoKSwgbnVsbCwgInRhcmdldGNvbG9yIiwgbnVsbCwgMCwgMSwgQ29sb3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhmb250RUNsYXNzLCBGb250LmNsYXNzLCAiRm9udCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Rm9udF9FeHRlbmRzKCksIHRoaXMuZ2V0Rm9udCgpLCBudWxsLCAiZXh0ZW5kcyIsIG51bGwsIDAsIDEsIEZvbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEZvbnRfRmFtaWx5KCksIHRoaXMuZ2V0Rm9udEZhbWlseSgpLCBudWxsLCAiZmFtaWx5IiwgbnVsbCwgMCwgMSwgRm9udC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9udF9TdHlsZSgpLCB0aGlzLmdldEZvbnRTdHlsZUVudW0oKSwgInN0eWxlIiwgbnVsbCwgMCwgMSwgRm9udC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEZvbnRfQm9sZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImJvbGQiLCBudWxsLCAwLCAxLCBGb250LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9udF9TaXpldmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInNpemV2YWx1ZSIsIG51bGwsIDAsIDEsIEZvbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRGb250X1NpemV1bml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgInNpemV1bml0IiwgbnVsbCwgMCwgMSwgRm9udC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhmb250RmFtaWx5RUNsYXNzLCBGb250RmFtaWx5LmNsYXNzLCAiRm9udEZhbWlseSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhidWlsZEluRm9udEZhbWlseUVDbGFzcywgQnVpbGRJbkZvbnRGYW1pbHkuY2xhc3MsICJCdWlsZEluRm9udEZhbWlseSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnVpbGRJbkZvbnRGYW1pbHlfQ3VzdG9tKCksIHRoaXMuZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtKCksICJjdXN0b20iLCBudWxsLCAwLCAxLCBCdWlsZEluRm9udEZhbWlseS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjdXN0b21Gb250RmFtaWx5RUNsYXNzLCBDdXN0b21Gb250RmFtaWx5LmNsYXNzLCAiQ3VzdG9tRm9udEZhbWlseSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VzdG9tRm9udEZhbWlseV9DdXN0b20oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImN1c3RvbSIsIG51bGwsIDAsIDEsIEN1c3RvbUZvbnRGYW1pbHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MobWVkaWFFQ2xhc3MsIE1lZGlhLmNsYXNzLCAiTWVkaWEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhib3JkZXJTdHlsZUVDbGFzcywgQm9yZGVyU3R5bGUuY2xhc3MsICJCb3JkZXJTdHlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Qm9yZGVyU3R5bGVfVHlwZSgpLCB0aGlzLmdldEJvcmRlclR5cGVFbnVtKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgQm9yZGVyU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCb3JkZXJTdHlsZV9XaWR0aHZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJ3aWR0aHZhbHVlIiwgbnVsbCwgMCwgMSwgQm9yZGVyU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCb3JkZXJTdHlsZV9XaWR0aHVuaXQoKSwgdGhpcy5nZXRVbml0RW51bSgpLCAid2lkdGh1bml0IiwgbnVsbCwgMCwgMSwgQm9yZGVyU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRCb3JkZXJTdHlsZV9Db2xvcigpLCB0aGlzLmdldENvbG9yKCksIG51bGwsICJjb2xvciIsIG51bGwsIDAsIDEsIEJvcmRlclN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoYmFzZVN0eWxlRUNsYXNzLCBCYXNlU3R5bGUuY2xhc3MsICJCYXNlU3R5bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldEJhc2VTdHlsZV9Gb3JtYXQoKSwgdGhpcy5nZXRTb21lRm9ybWF0KCksIG51bGwsICJmb3JtYXQiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEJhc2VTdHlsZV9Gb250KCksIHRoaXMuZ2V0Rm9udCgpLCBudWxsLCAiZm9udCIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QmFzZVN0eWxlX0JhY2tncm91bmRjb2xvcigpLCB0aGlzLmdldENvbG9yKCksIG51bGwsICJiYWNrZ3JvdW5kY29sb3IiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEJhc2VTdHlsZV9CYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCksIHRoaXMuZ2V0Q29sb3IoKSwgbnVsbCwgImJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEJhc2VTdHlsZV9UZXh0Y29sb3IoKSwgdGhpcy5nZXRDb2xvcigpLCBudWxsLCAidGV4dGNvbG9yIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCYXNlU3R5bGVfVGV4dGFsaWduKCksIHRoaXMuZ2V0VGV4dEFsaWduRW51bSgpLCAidGV4dGFsaWduIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QmFzZVN0eWxlX0JvcmRlclRvcCgpLCB0aGlzLmdldEJvcmRlclN0eWxlKCksIG51bGwsICJib3JkZXJUb3AiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEJhc2VTdHlsZV9Cb3JkZXJCb3R0b20oKSwgdGhpcy5nZXRCb3JkZXJTdHlsZSgpLCBudWxsLCAiYm9yZGVyQm90dG9tIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRCYXNlU3R5bGVfQm9yZGVyTGVmdCgpLCB0aGlzLmdldEJvcmRlclN0eWxlKCksIG51bGwsICJib3JkZXJMZWZ0IiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRCYXNlU3R5bGVfQm9yZGVyUmlnaHQoKSwgdGhpcy5nZXRCb3JkZXJTdHlsZSgpLCBudWxsLCAiYm9yZGVyUmlnaHQiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9QYWRkaW5nVG9wVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInBhZGRpbmdUb3BWYWx1ZSIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9QYWRkaW5nVG9wVW5pdCgpLCB0aGlzLmdldFVuaXRFbnVtKCksICJwYWRkaW5nVG9wVW5pdCIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInBhZGRpbmdCb3R0b21WYWx1ZSIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9QYWRkaW5nQm90dG9tVW5pdCgpLCB0aGlzLmdldFVuaXRFbnVtKCksICJwYWRkaW5nQm90dG9tVW5pdCIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9QYWRkaW5nTGVmdFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJwYWRkaW5nTGVmdFZhbHVlIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmFzZVN0eWxlX1BhZGRpbmdMZWZ0VW5pdCgpLCB0aGlzLmdldFVuaXRFbnVtKCksICJwYWRkaW5nTGVmdFVuaXQiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCYXNlU3R5bGVfUGFkZGluZ1JpZ2h0VmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInBhZGRpbmdSaWdodFZhbHVlIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmFzZVN0eWxlX1BhZGRpbmdSaWdodFVuaXQoKSwgdGhpcy5nZXRVbml0RW51bSgpLCAicGFkZGluZ1JpZ2h0VW5pdCIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9NYXJnaW5Ub3BWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibWFyZ2luVG9wVmFsdWUiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCYXNlU3R5bGVfTWFyZ2luVG9wVW5pdCgpLCB0aGlzLmdldFVuaXRFbnVtKCksICJtYXJnaW5Ub3BVbml0IiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmFzZVN0eWxlX01hcmdpbkxlZnRWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibWFyZ2luTGVmdFZhbHVlIiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmFzZVN0eWxlX01hcmdpbkxlZnRVbml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgIm1hcmdpbkxlZnRVbml0IiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmFzZVN0eWxlX01hcmdpbkJvdHRvbVZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJtYXJnaW5Cb3R0b21WYWx1ZSIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9NYXJnaW5Cb3R0b21Vbml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgIm1hcmdpbkJvdHRvbVVuaXQiLCBudWxsLCAwLCAxLCBCYXNlU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRCYXNlU3R5bGVfTWFyZ2luUmlnaHRWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAibWFyZ2luUmlnaHRWYWx1ZSIsIG51bGwsIDAsIDEsIEJhc2VTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEJhc2VTdHlsZV9NYXJnaW5SaWdodFVuaXQoKSwgdGhpcy5nZXRVbml0RW51bSgpLCAibWFyZ2luUmlnaHRVbml0IiwgbnVsbCwgMCwgMSwgQmFzZVN0eWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKG1lZGlhU3R5bGVFQ2xhc3MsIE1lZGlhU3R5bGUuY2xhc3MsICJNZWRpYVN0eWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRNZWRpYVN0eWxlX01lZGlhKCksIHRoaXMuZ2V0TWVkaWEoKSwgbnVsbCwgIm1lZGlhIiwgbnVsbCwgMCwgMSwgTWVkaWFTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHN0eWxlRUNsYXNzLCBTdHlsZS5jbGFzcywgIlN0eWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRTdHlsZV9FeHRlbmRzKCksIHRoaXMuZ2V0U3R5bGUoKSwgbnVsbCwgImV4dGVuZHMiLCBudWxsLCAwLCAxLCBTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U3R5bGVfTWVkaWFzdHlsZXMoKSwgdGhpcy5nZXRNZWRpYVN0eWxlKCksIG51bGwsICJtZWRpYXN0eWxlcyIsIG51bGwsIDAsIC0xLCBTdHlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHNvbWVGb3JtYXRFQ2xhc3MsIFNvbWVGb3JtYXQuY2xhc3MsICJTb21lRm9ybWF0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRTb21lRm9ybWF0X1VpX3BhdHRlcm4oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVpX3BhdHRlcm4iLCBudWxsLCAwLCAxLCBTb21lRm9ybWF0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U29tZUZvcm1hdF9SZXBvcnRfcGF0dGVybigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVwb3J0X3BhdHRlcm4iLCBudWxsLCAwLCAxLCBTb21lRm9ybWF0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U29tZUZvcm1hdF9UZXh0YWxpZ24oKSwgdGhpcy5nZXRUZXh0QWxpZ25FbnVtKCksICJ0ZXh0YWxpZ24iLCBudWxsLCAwLCAxLCBTb21lRm9ybWF0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHVvbW9Gb3JtYXRFQ2xhc3MsIFVvbW9Gb3JtYXQuY2xhc3MsICJVb21vRm9ybWF0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MobnVtYmVyRm9ybWF0RUNsYXNzLCBOdW1iZXJGb3JtYXQuY2xhc3MsICJOdW1iZXJGb3JtYXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldE51bWJlckZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKSwgdGhpcy5nZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0oKSwgInJlcG9ydF9jYXRlZ29yeSIsIG51bGwsIDAsIDEsIE51bWJlckZvcm1hdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjdXJyZW5jeUZvcm1hdEVDbGFzcywgQ3VycmVuY3lGb3JtYXQuY2xhc3MsICJDdXJyZW5jeUZvcm1hdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VycmVuY3lGb3JtYXRfUmVwb3J0X2NhdGVnb3J5KCksIHRoaXMuZ2V0Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0oKSwgInJlcG9ydF9jYXRlZ29yeSIsIG51bGwsIDAsIDEsIEN1cnJlbmN5Rm9ybWF0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGRhdGVGb3JtYXRFQ2xhc3MsIERhdGVGb3JtYXQuY2xhc3MsICJEYXRlRm9ybWF0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXREYXRlRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpLCB0aGlzLmdldERhdGVGb3JtYXRDYXRlZ29yeUVudW0oKSwgInJlcG9ydF9jYXRlZ29yeSIsIG51bGwsIDAsIDEsIERhdGVGb3JtYXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoZGF0ZVRpbWVGb3JtYXRFQ2xhc3MsIERhdGVUaW1lRm9ybWF0LmNsYXNzLCAiRGF0ZVRpbWVGb3JtYXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldERhdGVUaW1lRm9ybWF0X1JlcG9ydF9jYXRlZ29yeSgpLCB0aGlzLmdldERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCksICJyZXBvcnRfY2F0ZWdvcnkiLCBudWxsLCAwLCAxLCBEYXRlVGltZUZvcm1hdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0aW1lRm9ybWF0RUNsYXNzLCBUaW1lRm9ybWF0LmNsYXNzLCAiVGltZUZvcm1hdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGltZUZvcm1hdF9SZXBvcnRfY2F0ZWdvcnkoKSwgdGhpcy5nZXRUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKCksICJyZXBvcnRfY2F0ZWdvcnkiLCBudWxsLCAwLCAxLCBUaW1lRm9ybWF0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJlcG9ydEVDbGFzcywgUmVwb3J0LmNsYXNzLCAiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSZXBvcnRfRGVzY3JpcHRpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFJlcG9ydF9EZXNjcmlwdGlvblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvblZhbHVlIiwgbnVsbCwgMCwgMSwgUmVwb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0X0RhdGFtYXJ0UmVmKCksIHRoZURhdGFtYXJ0RFNMUGFja2FnZS5nZXREYXRhbWFydERlZmluaXRpb24oKSwgbnVsbCwgImRhdGFtYXJ0UmVmIiwgbnVsbCwgMCwgMSwgUmVwb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSZXBvcnRfUmVuZGVyaW5nKCksIHRoaXMuZ2V0UmVuZGVyaW5nRW51bSgpLCAicmVuZGVyaW5nIiwgbnVsbCwgMCwgMSwgUmVwb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVwb3J0X0V4dGVybmFsQ3NzVVJJKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleHRlcm5hbENzc1VSSSIsIG51bGwsIDAsIDEsIFJlcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFJlcG9ydF9FeHRlcm5hbENzc1VSSUJ1bmRsZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXh0ZXJuYWxDc3NVUklCdW5kbGUiLCBudWxsLCAwLCAxLCBSZXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnRfUGFnZVRlbXBsYXRlKCksIHRoaXMuZ2V0UGFnZVRlbXBsYXRlKCksIG51bGwsICJwYWdlVGVtcGxhdGUiLCBudWxsLCAwLCAxLCBSZXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJlcG9ydF9NZWRpYSgpLCB0aGlzLmdldE1lZGlhKCksIG51bGwsICJtZWRpYSIsIG51bGwsIDAsIDEsIFJlcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0X1Rvb2xiYXIoKSwgdGhlQWN0aW9uRFNMUGFja2FnZS5nZXRBY3Rpb25Ub29sYmFyKCksIG51bGwsICJ0b29sYmFyIiwgbnVsbCwgMCwgMSwgUmVwb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnRfRGVzaWduKCksIHRoaXMuZ2V0UmVwb3J0RGVzaWduKCksIG51bGwsICJkZXNpZ24iLCBudWxsLCAwLCAxLCBSZXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyZXBvcnREZXNpZ25FQ2xhc3MsIFJlcG9ydERlc2lnbi5jbGFzcywgIlJlcG9ydERlc2lnbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhyZXBvcnREZXNpZ25GaWxlRUNsYXNzLCBSZXBvcnREZXNpZ25GaWxlLmNsYXNzLCAiUmVwb3J0RGVzaWduRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVwb3J0RGVzaWduRmlsZV9OYW1lKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVwb3J0RGVzaWduRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyZXBvcnREZXNpZ25UZW1wbGF0ZUVDbGFzcywgUmVwb3J0RGVzaWduVGVtcGxhdGUuY2xhc3MsICJSZXBvcnREZXNpZ25UZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVfRGVzY3JpcHRpb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUmVwb3J0RGVzaWduVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZV9IZWFkZXIoKSwgdGhpcy5nZXRQYWdlSGVhZGVyKCksIG51bGwsICJoZWFkZXIiLCBudWxsLCAwLCAxLCBSZXBvcnREZXNpZ25UZW1wbGF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVfRGV0YWlsKCksIHRoaXMuZ2V0UGFnZURldGFpbCgpLCBudWxsLCAiZGV0YWlsIiwgbnVsbCwgMCwgMSwgUmVwb3J0RGVzaWduVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJlcG9ydERlc2lnblRlbXBsYXRlX0Zvb3RlcigpLCB0aGlzLmdldFBhZ2VGb290ZXIoKSwgbnVsbCwgImZvb3RlciIsIG51bGwsIDAsIDEsIFJlcG9ydERlc2lnblRlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY29udGFpbmVyRUNsYXNzLCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIuY2xhc3MsICJDb250YWluZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lcl9FbGVtZW50cygpLCB0aGlzLmdldEVsZW1lbnQoKSwgbnVsbCwgImVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBhZ2VIZWFkZXJFQ2xhc3MsIFBhZ2VIZWFkZXIuY2xhc3MsICJQYWdlSGVhZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQYWdlSGVhZGVyX1Nob3dPbkZpcnN0KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic2hvd09uRmlyc3QiLCBudWxsLCAwLCAxLCBQYWdlSGVhZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZUhlYWRlcl9IZWlnaHRWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiaGVpZ2h0VmFsdWUiLCBudWxsLCAwLCAxLCBQYWdlSGVhZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZUhlYWRlcl9IZWlnaHRVbml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgImhlaWdodFVuaXQiLCBudWxsLCAwLCAxLCBQYWdlSGVhZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHBhZ2VEZXRhaWxFQ2xhc3MsIFBhZ2VEZXRhaWwuY2xhc3MsICJQYWdlRGV0YWlsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MocGFnZUZvb3RlckVDbGFzcywgUGFnZUZvb3Rlci5jbGFzcywgIlBhZ2VGb290ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFBhZ2VGb290ZXJfU2hvd09uTGFzdCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNob3dPbkxhc3QiLCBudWxsLCAwLCAxLCBQYWdlRm9vdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZUZvb3Rlcl9IZWlnaHRWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiaGVpZ2h0VmFsdWUiLCBudWxsLCAwLCAxLCBQYWdlRm9vdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFnZUZvb3Rlcl9IZWlnaHRVbml0KCksIHRoaXMuZ2V0VW5pdEVudW0oKSwgImhlaWdodFVuaXQiLCBudWxsLCAwLCAxLCBQYWdlRm9vdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGVsZW1lbnRFQ2xhc3MsIEVsZW1lbnQuY2xhc3MsICJFbGVtZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHdpdGhTdHlsZUVDbGFzcywgV2l0aFN0eWxlLmNsYXNzLCAiV2l0aFN0eWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRXaXRoU3R5bGVfU3R5bGUoKSwgdGhpcy5nZXRTdHlsZSgpLCBudWxsLCAic3R5bGUiLCBudWxsLCAwLCAxLCBXaXRoU3R5bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0ZXh0RWxlbWVudEVDbGFzcywgVGV4dEVsZW1lbnQuY2xhc3MsICJUZXh0RWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGV4dEVsZW1lbnRfVGV4dCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGV4dCIsIG51bGwsIDAsIDEsIFRleHRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRpdGxlRUNsYXNzLCBUaXRsZS5jbGFzcywgIlRpdGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3Moc3ViVGl0bGVFQ2xhc3MsIFN1YlRpdGxlLmNsYXNzLCAiU3ViVGl0bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhzdWJTdWJUaXRsZUVDbGFzcywgU3ViU3ViVGl0bGUuY2xhc3MsICJTdWJTdWJUaXRsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKGxhYmVsRUNsYXNzLCBMYWJlbC5jbGFzcywgIkxhYmVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3ModGV4dEVDbGFzcywgVGV4dC5jbGFzcywgIlRleHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhhdXRvVGV4dEVDbGFzcywgQXV0b1RleHQuY2xhc3MsICJBdXRvVGV4dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0b1RleHRfVHlwZSgpLCB0aGlzLmdldEF1dG9UZXh0RW51bSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIEF1dG9UZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGltYWdlRUNsYXNzLCBJbWFnZS5jbGFzcywgIkltYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRJbWFnZV9TaXplKCksIHRoaXMuZ2V0SW1hZ2VTaXplRW51bSgpLCAic2l6ZSIsIG51bGwsIDAsIDEsIEltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW1hZ2VfU2NhbGUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVEb3VibGUoKSwgInNjYWxlIiwgbnVsbCwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRJbWFnZV9Tb3VyY2VUeXBlKCksIHRoaXMuZ2V0SW1hZ2VTb3VyY2VFbnVtKCksICJzb3VyY2VUeXBlIiwgbnVsbCwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRJbWFnZV9GaWxlbmFtZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmlsZW5hbWUiLCBudWxsLCAwLCAxLCBJbWFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh3aXRoSGVhZGVyRm9vdGVyRUNsYXNzLCBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzLCAiV2l0aEhlYWRlckZvb3RlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2l0aEhlYWRlckZvb3Rlcl9EZXRhaWxoZWFkZXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkZXRhaWxoZWFkZXIiLCBudWxsLCAwLCAxLCBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0V2l0aEhlYWRlckZvb3Rlcl9IZWFkZXJzdHlsZSgpLCB0aGlzLmdldFN0eWxlKCksIG51bGwsICJoZWFkZXJzdHlsZSIsIG51bGwsIDAsIDEsIFdpdGhIZWFkZXJGb290ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFdpdGhIZWFkZXJGb290ZXJfRGV0YWlsZm9vdGVyKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGV0YWlsZm9vdGVyIiwgbnVsbCwgMCwgMSwgV2l0aEhlYWRlckZvb3Rlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFdpdGhIZWFkZXJGb290ZXJfRm9vdGVyc3R5bGUoKSwgdGhpcy5nZXRTdHlsZSgpLCBudWxsLCAiZm9vdGVyc3R5bGUiLCBudWxsLCAwLCAxLCBXaXRoSGVhZGVyRm9vdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoZGF0YW1hcnRUYWJsZUVDbGFzcywgRGF0YW1hcnRUYWJsZS5jbGFzcywgIkRhdGFtYXJ0VGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFtYXJ0VGFibGVfR3JvdXBzKCksIHRoaXMuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwKCksIG51bGwsICJncm91cHMiLCBudWxsLCAwLCAtMSwgRGF0YW1hcnRUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YW1hcnRUYWJsZV9EZXRhaWwoKSwgdGhpcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsKCksIG51bGwsICJkZXRhaWwiLCBudWxsLCAwLCAxLCBEYXRhbWFydFRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoZGF0YW1hcnRUYWJsZUdyb3VwRUNsYXNzLCBEYXRhbWFydFRhYmxlR3JvdXAuY2xhc3MsICJEYXRhbWFydFRhYmxlR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFtYXJ0VGFibGVHcm91cF9Hcm91cGluZ1JlZigpLCB0aGVEYXRhbWFydERTTFBhY2thZ2UuZ2V0RGF0YW1hcnRQcm9wZXJ0eSgpLCBudWxsLCAiZ3JvdXBpbmdSZWYiLCBudWxsLCAwLCAxLCBEYXRhbWFydFRhYmxlR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFtYXJ0VGFibGVHcm91cF9IZWFkZXIoKSwgdGhpcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoKSwgbnVsbCwgImhlYWRlciIsIG51bGwsIDAsIDEsIERhdGFtYXJ0VGFibGVHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YW1hcnRUYWJsZUdyb3VwX0Zvb3RlcigpLCB0aGlzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlcigpLCBudWxsLCAiZm9vdGVyIiwgbnVsbCwgMCwgMSwgRGF0YW1hcnRUYWJsZUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Moc29tZUdyaWRFQ2xhc3MsIFNvbWVHcmlkLmNsYXNzLCAiU29tZUdyaWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFNvbWVHcmlkX1Jvd3MoKSwgdGhpcy5nZXRHcmlkUm93KCksIG51bGwsICJyb3dzIiwgbnVsbCwgMCwgLTEsIFNvbWVHcmlkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoZGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyRUNsYXNzLCBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIuY2xhc3MsICJEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhkYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFQ2xhc3MsIERhdGFtYXJ0VGFibGVHcm91cEZvb3Rlci5jbGFzcywgIkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKGRhdGFtYXJ0VGFibGVEZXRhaWxFQ2xhc3MsIERhdGFtYXJ0VGFibGVEZXRhaWwuY2xhc3MsICJEYXRhbWFydFRhYmxlRGV0YWlsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXREYXRhbWFydFRhYmxlRGV0YWlsX0NvbHVtbkZvcm1hdHRlcnMoKSwgdGhpcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHkoKSwgbnVsbCwgImNvbHVtbkZvcm1hdHRlcnMiLCBudWxsLCAwLCAtMSwgRGF0YW1hcnRUYWJsZURldGFpbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGRhdGFtYXJ0VGFibGVQcm9wZXJ0eUVDbGFzcywgRGF0YW1hcnRUYWJsZVByb3BlcnR5LmNsYXNzLCAiRGF0YW1hcnRUYWJsZVByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfQ29sdW1uKCksIHRoaXMuZ2V0VGFibGVWYWx1ZUVsZW1lbnQoKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDAsIDEsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0ludGVydmFscygpLCB0aGlzLmdldFRhYmxlSW50ZXJ2YWwoKSwgbnVsbCwgImludGVydmFscyIsIG51bGwsIDAsIC0xLCBEYXRhbWFydFRhYmxlUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9IaWRlTGFiZWxJbnRlcnZhbCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImhpZGVMYWJlbEludGVydmFsIiwgbnVsbCwgMCwgMSwgRGF0YW1hcnRUYWJsZVByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5X0xvb2t1cHMoKSwgdGhpcy5nZXRUYWJsZUxvb2t1cCgpLCBudWxsLCAibG9va3VwcyIsIG51bGwsIDAsIC0xLCBEYXRhbWFydFRhYmxlUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9IaWRlTGFiZWxMb29rdXAoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJoaWRlTGFiZWxMb29rdXAiLCBudWxsLCAwLCAxLCBEYXRhbWFydFRhYmxlUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhbWFydFRhYmxlUHJvcGVydHlfSGFzSW1hZ2UoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJoYXNJbWFnZSIsIG51bGwsIDAsIDEsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eV9JbWFnZSgpLCB0aGlzLmdldFRhYmxlSW1hZ2UoKSwgbnVsbCwgImltYWdlIiwgbnVsbCwgMCwgMSwgRGF0YW1hcnRUYWJsZVByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVGb3JtYXR0ZXJFQ2xhc3MsIFRhYmxlRm9ybWF0dGVyLmNsYXNzLCAiVGFibGVGb3JtYXR0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFRhYmxlRm9ybWF0dGVyX0Zvcm1hdCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZm9ybWF0IiwgbnVsbCwgMCwgMSwgVGFibGVGb3JtYXR0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVJbWFnZUVDbGFzcywgVGFibGVJbWFnZS5jbGFzcywgIlRhYmxlSW1hZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFRhYmxlSW1hZ2VfSW1hZ2VQYXRoUGF0dGVybigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW1hZ2VQYXRoUGF0dGVybiIsIG51bGwsIDAsIDEsIFRhYmxlSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRUYWJsZUltYWdlX0hpZGVJbWFnZUxhYmVsKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGlkZUltYWdlTGFiZWwiLCBudWxsLCAwLCAxLCBUYWJsZUltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVJbWFnZV9IYXNQYXJhbWV0ZXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJoYXNQYXJhbWV0ZXIiLCBudWxsLCAwLCAxLCBUYWJsZUltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVJbWFnZV9SZXNpemUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZXNpemUiLCBudWxsLCAwLCAxLCBUYWJsZUltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVJbWFnZV9SZXNpemVTdHJpbmcoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc2l6ZVN0cmluZyIsIG51bGwsIDAsIDEsIFRhYmxlSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRUYWJsZUltYWdlX0ltYWdlUGF0aFBhcmFtZXRlcigpLCB0aGlzLmdldFRhYmxlVmFsdWVFbGVtZW50KCksIG51bGwsICJpbWFnZVBhdGhQYXJhbWV0ZXIiLCBudWxsLCAwLCAxLCBUYWJsZUltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVWYWx1ZUVsZW1lbnRFQ2xhc3MsIFRhYmxlVmFsdWVFbGVtZW50LmNsYXNzLCAiVGFibGVWYWx1ZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3ModGFibGVQcm9wZXJ0eUVDbGFzcywgVGFibGVQcm9wZXJ0eS5jbGFzcywgIlRhYmxlUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlUHJvcGVydHlfVmFsdWVSZWYoKSwgdGhlRGF0YW1hcnREU0xQYWNrYWdlLmdldERhdGFtYXJ0UHJvcGVydHkoKSwgbnVsbCwgInZhbHVlUmVmIiwgbnVsbCwgMCwgMSwgVGFibGVQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRhYmxlQWdncmVnYXRpb25FQ2xhc3MsIFRhYmxlQWdncmVnYXRpb24uY2xhc3MsICJUYWJsZUFnZ3JlZ2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRUYWJsZUFnZ3JlZ2F0aW9uX1RleHQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRleHQiLCBudWxsLCAwLCAxLCBUYWJsZUFnZ3JlZ2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFibGVBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpLCB0aGlzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uKCksIG51bGwsICJhZ2dyZWdhdGlvbiIsIG51bGwsIDAsIDEsIFRhYmxlQWdncmVnYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlQWdncmVnYXRpb25fT25Hcm91cCgpLCB0aGlzLmdldERhdGFtYXJ0VGFibGVHcm91cCgpLCBudWxsLCAib25Hcm91cCIsIG51bGwsIDAsIDEsIFRhYmxlQWdncmVnYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZUJhc2VBZ2dyZWdhdGlvbkVDbGFzcywgVGFibGVCYXNlQWdncmVnYXRpb24uY2xhc3MsICJUYWJsZUJhc2VBZ2dyZWdhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFibGVCYXNlQWdncmVnYXRpb25fVmFsdWVSZWZzKCksIHRoZURhdGFtYXJ0RFNMUGFja2FnZS5nZXREYXRhbWFydFByb3BlcnR5KCksIG51bGwsICJ2YWx1ZVJlZnMiLCBudWxsLCAwLCAtMSwgVGFibGVCYXNlQWdncmVnYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZVB1cmVBZ2dyZWdhdGlvbkVDbGFzcywgVGFibGVQdXJlQWdncmVnYXRpb24uY2xhc3MsICJUYWJsZVB1cmVBZ2dyZWdhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVQdXJlQWdncmVnYXRpb25fQWdncmVnYXRpb24oKSwgdGhpcy5nZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bSgpLCAiYWdncmVnYXRpb24iLCBudWxsLCAwLCAxLCBUYWJsZVB1cmVBZ2dyZWdhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZVVuYXJ5QWdncmVnYXRpb25FQ2xhc3MsIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbi5jbGFzcywgIlRhYmxlVW5hcnlBZ2dyZWdhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCksIHRoaXMuZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtKCksICJhZ2dyZWdhdGlvbiIsIG51bGwsIDAsIDEsIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZU11bHRpcGxlQWdncmVnYXRpb25FQ2xhc3MsIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbi5jbGFzcywgIlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uX0FnZ3JlZ2F0aW9uKCksIHRoaXMuZ2V0TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtKCksICJhZ2dyZWdhdGlvbiIsIG51bGwsIDAsIDEsIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRUNsYXNzLCBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uLmNsYXNzLCAiVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbl9BZ2dyZWdhdGlvbigpLCB0aGlzLmdldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0oKSwgImFnZ3JlZ2F0aW9uIiwgbnVsbCwgMCwgMSwgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZUludGVydmFsRUNsYXNzLCBUYWJsZUludGVydmFsLmNsYXNzLCAiVGFibGVJbnRlcnZhbCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZU51bWJlckludGVydmFsRUNsYXNzLCBUYWJsZU51bWJlckludGVydmFsLmNsYXNzLCAiVGFibGVOdW1iZXJJbnRlcnZhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVOdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJudW1iZXJJbnRlcnZhbFZhbHVlIiwgbnVsbCwgMCwgMSwgVGFibGVOdW1iZXJJbnRlcnZhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlTnVtYmVySW50ZXJ2YWxfTnVtYmVyUmFuZ2UoKSwgdGhpcy5nZXRUYWJsZVJhbmdlRWxlbWVudCgpLCBudWxsLCAibnVtYmVyUmFuZ2UiLCBudWxsLCAwLCAxLCBUYWJsZU51bWJlckludGVydmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVEYXRlRGF5SW50ZXJ2YWxFQ2xhc3MsIFRhYmxlRGF0ZURheUludGVydmFsLmNsYXNzLCAiVGFibGVEYXRlRGF5SW50ZXJ2YWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFRhYmxlRGF0ZURheUludGVydmFsX0RhdGVJbnRlcnZhbFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJkYXRlSW50ZXJ2YWxWYWx1ZSIsIG51bGwsIDAsIDEsIFRhYmxlRGF0ZURheUludGVydmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxfRGF0ZVJhbmdlKCksIHRoaXMuZ2V0VGFibGVSYW5nZUVsZW1lbnQoKSwgbnVsbCwgImRhdGVSYW5nZSIsIG51bGwsIDAsIDEsIFRhYmxlRGF0ZURheUludGVydmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVMb29rdXBFQ2xhc3MsIFRhYmxlTG9va3VwLmNsYXNzLCAiVGFibGVMb29rdXAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3ModGFibGVOdW1iZXJMb29rdXBFQ2xhc3MsIFRhYmxlTnVtYmVyTG9va3VwLmNsYXNzLCAiVGFibGVOdW1iZXJMb29rdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFRhYmxlTnVtYmVyTG9va3VwX0xvb2t1cFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJsb29rdXBWYWx1ZSIsIG51bGwsIDAsIDEsIFRhYmxlTnVtYmVyTG9va3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFibGVOdW1iZXJMb29rdXBfRGlzY3JldGUoKSwgdGhpcy5nZXRUYWJsZVJhbmdlRWxlbWVudCgpLCBudWxsLCAiZGlzY3JldGUiLCBudWxsLCAwLCAxLCBUYWJsZU51bWJlckxvb2t1cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRhYmxlU3RyaW5nTG9va3VwRUNsYXNzLCBUYWJsZVN0cmluZ0xvb2t1cC5jbGFzcywgIlRhYmxlU3RyaW5nTG9va3VwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRUYWJsZVN0cmluZ0xvb2t1cF9Mb29rdXBWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9va3VwVmFsdWUiLCBudWxsLCAwLCAxLCBUYWJsZVN0cmluZ0xvb2t1cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlU3RyaW5nTG9va3VwX0Rpc2NyZXRlKCksIHRoaXMuZ2V0VGFibGVSYW5nZUVsZW1lbnQoKSwgbnVsbCwgImRpc2NyZXRlIiwgbnVsbCwgMCwgMSwgVGFibGVTdHJpbmdMb29rdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZURhdGVEYXlMb29rdXBFQ2xhc3MsIFRhYmxlRGF0ZURheUxvb2t1cC5jbGFzcywgIlRhYmxlRGF0ZURheUxvb2t1cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVEYXRlRGF5TG9va3VwX0xvb2t1cFZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFRG91YmxlKCksICJsb29rdXBWYWx1ZSIsIG51bGwsIDAsIDEsIFRhYmxlRGF0ZURheUxvb2t1cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlRGF0ZURheUxvb2t1cF9EaXNjcmV0ZSgpLCB0aGlzLmdldFRhYmxlUmFuZ2VFbGVtZW50KCksIG51bGwsICJkaXNjcmV0ZSIsIG51bGwsIDAsIDEsIFRhYmxlRGF0ZURheUxvb2t1cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRhYmxlUmFuZ2VFbGVtZW50RUNsYXNzLCBUYWJsZVJhbmdlRWxlbWVudC5jbGFzcywgIlRhYmxlUmFuZ2VFbGVtZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHRhYmxlVGV4dENvbG9yRUNsYXNzLCBUYWJsZVRleHRDb2xvci5jbGFzcywgIlRhYmxlVGV4dENvbG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRUYWJsZVRleHRDb2xvcl9Db2xvcigpLCB0aGlzLmdldENvbG9yKCksIG51bGwsICJjb2xvciIsIG51bGwsIDAsIDEsIFRhYmxlVGV4dENvbG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVDZWxsQ29sb3JFQ2xhc3MsIFRhYmxlQ2VsbENvbG9yLmNsYXNzLCAiVGFibGVDZWxsQ29sb3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFRhYmxlQ2VsbENvbG9yX0NvbG9yKCksIHRoaXMuZ2V0Q29sb3IoKSwgbnVsbCwgImNvbG9yIiwgbnVsbCwgMCwgMSwgVGFibGVDZWxsQ29sb3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh0YWJsZUljb25FQ2xhc3MsIFRhYmxlSWNvbi5jbGFzcywgIlRhYmxlSWNvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFibGVJY29uX0ljb24oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImljb24iLCBudWxsLCAwLCAxLCBUYWJsZUljb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3ModGFibGVUcmVuZEVDbGFzcywgVGFibGVUcmVuZC5jbGFzcywgIlRhYmxlVHJlbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFRhYmxlVHJlbmRfSWNvbigpLCB0aGlzLmdldFRyZW5kSWNvbkVudW0oKSwgImljb24iLCBudWxsLCAwLCAxLCBUYWJsZVRyZW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHRhYmxlVG9vbHRpcEVDbGFzcywgVGFibGVUb29sdGlwLmNsYXNzLCAiVGFibGVUb29sdGlwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRUYWJsZVRvb2x0aXBfVG9vbHRpcCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidG9vbHRpcCIsIG51bGwsIDAsIDEsIFRhYmxlVG9vbHRpcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhncmlkRUNsYXNzLCBHcmlkLmNsYXNzLCAiR3JpZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKGdyaWRSb3dFQ2xhc3MsIEdyaWRSb3cuY2xhc3MsICJHcmlkUm93IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRHcmlkUm93X0NlbGxzKCksIHRoaXMuZ2V0R3JpZENlbGwoKSwgbnVsbCwgImNlbGxzIiwgbnVsbCwgMCwgLTEsIEdyaWRSb3cuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhncmlkQ2VsbEVDbGFzcywgR3JpZENlbGwuY2xhc3MsICJHcmlkQ2VsbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3JpZENlbGxfQ29sdW1uc3BhbigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiY29sdW1uc3BhbiIsIG51bGwsIDAsIDEsIEdyaWRDZWxsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQlpbml0RUVudW0odW5pdEVudW1FRW51bSwgVW5pdEVudW0uY2xhc3MsICJVbml0RW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwodW5pdEVudW1FRW51bSwgVW5pdEVudW0uTlVMTCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5NTSk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5DTSk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5QVCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5JTik7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5QQyk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5FTSk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5FWCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5QWCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh1bml0RW51bUVFbnVtLCBVbml0RW51bS5QRVJDRU5UQUdFKTsKKworCQlpbml0RUVudW0ocGFnZVNpemVFbnVtRUVudW0sIFBhZ2VTaXplRW51bS5jbGFzcywgIlBhZ2VTaXplRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwocGFnZVNpemVFbnVtRUVudW0sIFBhZ2VTaXplRW51bS5BNCk7CisJCWFkZEVFbnVtTGl0ZXJhbChwYWdlU2l6ZUVudW1FRW51bSwgUGFnZVNpemVFbnVtLkEzKTsKKwkJYWRkRUVudW1MaXRlcmFsKHBhZ2VTaXplRW51bUVFbnVtLCBQYWdlU2l6ZUVudW0uQTUpOworCQlhZGRFRW51bUxpdGVyYWwocGFnZVNpemVFbnVtRUVudW0sIFBhZ2VTaXplRW51bS5VU19MRVRURVIpOworCQlhZGRFRW51bUxpdGVyYWwocGFnZVNpemVFbnVtRUVudW0sIFBhZ2VTaXplRW51bS5VU19MRUdBTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChwYWdlU2l6ZUVudW1FRW51bSwgUGFnZVNpemVFbnVtLlVTX0xFREdFUik7CisJCWFkZEVFbnVtTGl0ZXJhbChwYWdlU2l6ZUVudW1FRW51bSwgUGFnZVNpemVFbnVtLlVTX1NVUEVSX0IpOworCisJCWluaXRFRW51bShvcmllbnRhdGlvbkVudW1FRW51bSwgT3JpZW50YXRpb25FbnVtLmNsYXNzLCAiT3JpZW50YXRpb25FbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChvcmllbnRhdGlvbkVudW1FRW51bSwgT3JpZW50YXRpb25FbnVtLlBPUlRSQUlUKTsKKwkJYWRkRUVudW1MaXRlcmFsKG9yaWVudGF0aW9uRW51bUVFbnVtLCBPcmllbnRhdGlvbkVudW0uTEFORFNDQVBFKTsKKworCQlpbml0RUVudW0oZm9udFN0eWxlRW51bUVFbnVtLCBGb250U3R5bGVFbnVtLmNsYXNzLCAiRm9udFN0eWxlRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwoZm9udFN0eWxlRW51bUVFbnVtLCBGb250U3R5bGVFbnVtLk5PUk1BTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChmb250U3R5bGVFbnVtRUVudW0sIEZvbnRTdHlsZUVudW0uSVRBTElDKTsKKwkJYWRkRUVudW1MaXRlcmFsKGZvbnRTdHlsZUVudW1FRW51bSwgRm9udFN0eWxlRW51bS5PQkxJUVVFKTsKKworCQlpbml0RUVudW0oYnVpbGRJbkZvbnRGYW1pbHlFbnVtRUVudW0sIEJ1aWxkSW5Gb250RmFtaWx5RW51bS5jbGFzcywgIkJ1aWxkSW5Gb250RmFtaWx5RW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwoYnVpbGRJbkZvbnRGYW1pbHlFbnVtRUVudW0sIEJ1aWxkSW5Gb250RmFtaWx5RW51bS5NT05PU1BBQ0UpOworCQlhZGRFRW51bUxpdGVyYWwoYnVpbGRJbkZvbnRGYW1pbHlFbnVtRUVudW0sIEJ1aWxkSW5Gb250RmFtaWx5RW51bS5TQU5TX1NFUklGKTsKKwkJYWRkRUVudW1MaXRlcmFsKGJ1aWxkSW5Gb250RmFtaWx5RW51bUVFbnVtLCBCdWlsZEluRm9udEZhbWlseUVudW0uU0VSSUYpOworCisJCWluaXRFRW51bShib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5jbGFzcywgIkJvcmRlclR5cGVFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5OT05FKTsKKwkJYWRkRUVudW1MaXRlcmFsKGJvcmRlclR5cGVFbnVtRUVudW0sIEJvcmRlclR5cGVFbnVtLlNPTElEKTsKKwkJYWRkRUVudW1MaXRlcmFsKGJvcmRlclR5cGVFbnVtRUVudW0sIEJvcmRlclR5cGVFbnVtLkRPVFRFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5EQVNIRUQpOworCQlhZGRFRW51bUxpdGVyYWwoYm9yZGVyVHlwZUVudW1FRW51bSwgQm9yZGVyVHlwZUVudW0uRE9VQkxFKTsKKwkJYWRkRUVudW1MaXRlcmFsKGJvcmRlclR5cGVFbnVtRUVudW0sIEJvcmRlclR5cGVFbnVtLkdST09WRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5SSURHRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5JTlNFVCk7CisJCWFkZEVFbnVtTGl0ZXJhbChib3JkZXJUeXBlRW51bUVFbnVtLCBCb3JkZXJUeXBlRW51bS5PVVRTRVQpOworCisJCWluaXRFRW51bSh0ZXh0QWxpZ25FbnVtRUVudW0sIFRleHRBbGlnbkVudW0uY2xhc3MsICJUZXh0QWxpZ25FbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbCh0ZXh0QWxpZ25FbnVtRUVudW0sIFRleHRBbGlnbkVudW0uTlVMTCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0ZXh0QWxpZ25FbnVtRUVudW0sIFRleHRBbGlnbkVudW0uTEVGVCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0ZXh0QWxpZ25FbnVtRUVudW0sIFRleHRBbGlnbkVudW0uQ0VOVEVSKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRleHRBbGlnbkVudW1FRW51bSwgVGV4dEFsaWduRW51bS5SSUdIVCk7CisKKwkJaW5pdEVFbnVtKG51bWJlckZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0uY2xhc3MsICJOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKG51bWJlckZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0uVU5GT1JNQVRURUQpOworCQlhZGRFRW51bUxpdGVyYWwobnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0sIE51bWJlckZvcm1hdENhdGVnb3J5RW51bS5HRU5FUkFMX05VTUJFUik7CisJCWFkZEVFbnVtTGl0ZXJhbChudW1iZXJGb3JtYXRDYXRlZ29yeUVudW1FRW51bSwgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLkZJWEVEKTsKKwkJYWRkRUVudW1MaXRlcmFsKG51bWJlckZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0uUEVSQ0VOVCk7CisJCWFkZEVFbnVtTGl0ZXJhbChudW1iZXJGb3JtYXRDYXRlZ29yeUVudW1FRW51bSwgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtLlNDSUVOVElGSUMpOworCQlhZGRFRW51bUxpdGVyYWwobnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0sIE51bWJlckZvcm1hdENhdGVnb3J5RW51bS5DVVNUT00pOworCisJCWluaXRFRW51bShjdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bS5jbGFzcywgIkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChjdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bS5VTkZPUk1BVFRFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChjdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bS5DVVJSRU5DWSk7CisJCWFkZEVFbnVtTGl0ZXJhbChjdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bS5DVVNUT00pOworCisJCWluaXRFRW51bShkYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0sIERhdGVGb3JtYXRDYXRlZ29yeUVudW0uY2xhc3MsICJEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChkYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRUVudW0sIERhdGVGb3JtYXRDYXRlZ29yeUVudW0uQ1VTVE9NKTsKKworCQlpbml0RUVudW0oZGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSwgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0uY2xhc3MsICJEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwoZGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FRW51bSwgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0uQ1VTVE9NKTsKKworCQlpbml0RUVudW0odGltZUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLmNsYXNzLCAiVGltZUZvcm1hdENhdGVnb3J5RW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwodGltZUZvcm1hdENhdGVnb3J5RW51bUVFbnVtLCBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLkNVU1RPTSk7CisKKwkJaW5pdEVFbnVtKGF1dG9UZXh0RW51bUVFbnVtLCBBdXRvVGV4dEVudW0uY2xhc3MsICJBdXRvVGV4dEVudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKGF1dG9UZXh0RW51bUVFbnVtLCBBdXRvVGV4dEVudW0uUEFHRV9OVU1CRVIpOworCQlhZGRFRW51bUxpdGVyYWwoYXV0b1RleHRFbnVtRUVudW0sIEF1dG9UZXh0RW51bS5UT1RBTF9QQUdFKTsKKwkJYWRkRUVudW1MaXRlcmFsKGF1dG9UZXh0RW51bUVFbnVtLCBBdXRvVGV4dEVudW0uUEFHRV9OVU1CRVJfVU5GSUxURVJFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChhdXRvVGV4dEVudW1FRW51bSwgQXV0b1RleHRFbnVtLlRPVEFMX1BBR0VfVU5GSUxURVJFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChhdXRvVGV4dEVudW1FRW51bSwgQXV0b1RleHRFbnVtLlBBR0VfVkFSSUFCTEUpOworCisJCWluaXRFRW51bShpbWFnZVNpemVFbnVtRUVudW0sIEltYWdlU2l6ZUVudW0uY2xhc3MsICJJbWFnZVNpemVFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChpbWFnZVNpemVFbnVtRUVudW0sIEltYWdlU2l6ZUVudW0uU0laRV9UT19JTUFHRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChpbWFnZVNpemVFbnVtRUVudW0sIEltYWdlU2l6ZUVudW0uU0NBTEVfVE9fSVRFTSk7CisJCWFkZEVFbnVtTGl0ZXJhbChpbWFnZVNpemVFbnVtRUVudW0sIEltYWdlU2l6ZUVudW0uQ0xJUCk7CisKKwkJaW5pdEVFbnVtKGltYWdlU291cmNlRW51bUVFbnVtLCBJbWFnZVNvdXJjZUVudW0uY2xhc3MsICJJbWFnZVNvdXJjZUVudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKGltYWdlU291cmNlRW51bUVFbnVtLCBJbWFnZVNvdXJjZUVudW0uRklMRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChpbWFnZVNvdXJjZUVudW1FRW51bSwgSW1hZ2VTb3VyY2VFbnVtLlVSTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChpbWFnZVNvdXJjZUVudW1FRW51bSwgSW1hZ2VTb3VyY2VFbnVtLkVNQkVEKTsKKworCQlpbml0RUVudW0ocHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FRW51bSwgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uY2xhc3MsICJQdXJlQWdncmVnYXRpb25UeXBlRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwocHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FRW51bSwgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uQ09VTlQpOworCQlhZGRFRW51bUxpdGVyYWwocHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FRW51bSwgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uUlVOTklOR0NPVU5UKTsKKworCQlpbml0RUVudW0odW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5jbGFzcywgIlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwodW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5TVU0pOworCQlhZGRFRW51bUxpdGVyYWwodW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5BVkUpOworCQlhZGRFRW51bUxpdGVyYWwodW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5NSU4pOworCQlhZGRFRW51bUxpdGVyYWwodW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5NQVgpOworCQlhZGRFRW51bUxpdGVyYWwodW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRUVudW0sIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bS5SVU5OSU5HU1VNKTsKKworCQlpbml0RUVudW0oYmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVFbnVtLCBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLmNsYXNzLCAiQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwoYmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVFbnVtLCBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLkRJVik7CisKKwkJaW5pdEVFbnVtKG11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVFbnVtLCBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0uY2xhc3MsICJNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKG11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVFbnVtLCBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0uQ09OQ0FUKTsKKworCQlpbml0RUVudW0odHJlbmRJY29uRW51bUVFbnVtLCBUcmVuZEljb25FbnVtLmNsYXNzLCAiVHJlbmRJY29uRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwodHJlbmRJY29uRW51bUVFbnVtLCBUcmVuZEljb25FbnVtLlJJU0lORyk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0cmVuZEljb25FbnVtRUVudW0sIFRyZW5kSWNvbkVudW0uQkFEUklTSU5HKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRyZW5kSWNvbkVudW1FRW51bSwgVHJlbmRJY29uRW51bS5TTE9QSU5HKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRyZW5kSWNvbkVudW1FRW51bSwgVHJlbmRJY29uRW51bS5HT09EU0xPUElORyk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0cmVuZEljb25FbnVtRUVudW0sIFRyZW5kSWNvbkVudW0uU1RBR05BVElORyk7CisKKwkJaW5pdEVFbnVtKHJlbmRlcmluZ0VudW1FRW51bSwgUmVuZGVyaW5nRW51bS5jbGFzcywgIlJlbmRlcmluZ0VudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJlbmRlcmluZ0VudW1FRW51bSwgUmVuZGVyaW5nRW51bS5IVE1MKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJlbmRlcmluZ0VudW1FRW51bSwgUmVuZGVyaW5nRW51bS5QREYpOworCisJCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcworCQlpbml0RURhdGFUeXBlKGludGVybmFsRU9iamVjdEVEYXRhVHlwZSwgSW50ZXJuYWxFT2JqZWN0LmNsYXNzLCAiSW50ZXJuYWxFT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIGFubm90YXRpb25zCisJCS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUKKwkJY3JlYXRlRWNvcmVBbm5vdGF0aW9ucygpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZTwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWNvcmVBbm5vdGF0aW9ucygpIHsKKwkJU3RyaW5nIHNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIjsJCisJCWFkZEFubm90YXRpb24KKwkJICAodGhpcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgInJvb3RQYWNrYWdlIiwgInJlcG9ydGRzbCIKKwkJICAgfSk7CisJfQorCit9IC8vUmVwb3J0RFNMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnREZXNpZ25GaWxlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydERlc2lnbkZpbGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhYjdkYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnREZXNpZ25GaWxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgRGVzaWduIEZpbGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RGVzaWduRmlsZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlcG9ydERlc2lnbkZpbGVJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFJlcG9ydERlc2lnbkZpbGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJlcG9ydERlc2lnbkZpbGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfREVTSUdOX0ZJTEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9GSUxFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fRklMRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9GSUxFX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX0ZJTEVfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX0ZJTEVfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9SZXBvcnREZXNpZ25GaWxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydERlc2lnblRlbXBsYXRlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydERlc2lnblRlbXBsYXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTYzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0RGVzaWduVGVtcGxhdGVJbXBsLmphdmEKQEAgLTAsMCArMSwzODggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZURldGFpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydCBEZXNpZ24gVGVtcGxhdGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RGVzaWduVGVtcGxhdGVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnREZXNpZ25UZW1wbGF0ZUltcGwjZ2V0SGVhZGVyIDxlbT5IZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0RGVzaWduVGVtcGxhdGVJbXBsI2dldERldGFpbCA8ZW0+RGV0YWlsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydERlc2lnblRlbXBsYXRlSW1wbCNnZXRGb290ZXIgPGVtPkZvb3RlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlcG9ydERlc2lnblRlbXBsYXRlSW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBSZXBvcnREZXNpZ25UZW1wbGF0ZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQYWdlSGVhZGVyIGhlYWRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERldGFpbCgpIDxlbT5EZXRhaWw8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERldGFpbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFBhZ2VEZXRhaWwgZGV0YWlsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9vdGVyKCkgPGVtPkZvb3RlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9vdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFnZUZvb3RlciBmb290ZXI7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVwb3J0RGVzaWduVGVtcGxhdGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfREVTSUdOX1RFTVBMQVRFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlSGVhZGVyIGdldEhlYWRlcigpIHsKKwkJcmV0dXJuIGhlYWRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRIZWFkZXIoUGFnZUhlYWRlciBuZXdIZWFkZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJUGFnZUhlYWRlciBvbGRIZWFkZXIgPSBoZWFkZXI7CisJCWhlYWRlciA9IG5ld0hlYWRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19IRUFERVIsIG9sZEhlYWRlciwgbmV3SGVhZGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIZWFkZXIoUGFnZUhlYWRlciBuZXdIZWFkZXIpIHsKKwkJaWYgKG5ld0hlYWRlciAhPSBoZWFkZXIpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGhlYWRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloZWFkZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0hFQURFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SGVhZGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hlYWRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fSEVBREVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEhlYWRlcihuZXdIZWFkZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19IRUFERVIsIG5ld0hlYWRlciwgbmV3SGVhZGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VEZXRhaWwgZ2V0RGV0YWlsKCkgeworCQlyZXR1cm4gZGV0YWlsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERldGFpbChQYWdlRGV0YWlsIG5ld0RldGFpbCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlQYWdlRGV0YWlsIG9sZERldGFpbCA9IGRldGFpbDsKKwkJZGV0YWlsID0gbmV3RGV0YWlsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFVEFJTCwgb2xkRGV0YWlsLCBuZXdEZXRhaWwpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERldGFpbChQYWdlRGV0YWlsIG5ld0RldGFpbCkgeworCQlpZiAobmV3RGV0YWlsICE9IGRldGFpbCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGV0YWlsICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRldGFpbCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVUQUlMLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEZXRhaWwgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGV0YWlsKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19ERVRBSUwsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0RGV0YWlsKG5ld0RldGFpbCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFVEFJTCwgbmV3RGV0YWlsLCBuZXdEZXRhaWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGFnZUZvb3RlciBnZXRGb290ZXIoKSB7CisJCXJldHVybiBmb290ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Rm9vdGVyKFBhZ2VGb290ZXIgbmV3Rm9vdGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVBhZ2VGb290ZXIgb2xkRm9vdGVyID0gZm9vdGVyOworCQlmb290ZXIgPSBuZXdGb290ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSLCBvbGRGb290ZXIsIG5ld0Zvb3Rlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9vdGVyKFBhZ2VGb290ZXIgbmV3Rm9vdGVyKSB7CisJCWlmIChuZXdGb290ZXIgIT0gZm9vdGVyKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChmb290ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZm9vdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19GT09URVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0Zvb3RlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdGb290ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0ZPT1RFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRGb290ZXIobmV3Rm9vdGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSLCBuZXdGb290ZXIsIG5ld0Zvb3RlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19IRUFERVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0SGVhZGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFVEFJTDoKKwkJCQlyZXR1cm4gYmFzaWNTZXREZXRhaWwobnVsbCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSOgorCQkJCXJldHVybiBiYXNpY1NldEZvb3RlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0hFQURFUjoKKwkJCQlyZXR1cm4gZ2V0SGVhZGVyKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVUQUlMOgorCQkJCXJldHVybiBnZXREZXRhaWwoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19GT09URVI6CisJCQkJcmV0dXJuIGdldEZvb3RlcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0hFQURFUjoKKwkJCQlzZXRIZWFkZXIoKFBhZ2VIZWFkZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19ERVRBSUw6CisJCQkJc2V0RGV0YWlsKChQYWdlRGV0YWlsKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fRk9PVEVSOgorCQkJCXNldEZvb3RlcigoUGFnZUZvb3RlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0hFQURFUjoKKwkJCQlzZXRIZWFkZXIoKFBhZ2VIZWFkZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0RFVEFJTDoKKwkJCQlzZXREZXRhaWwoKFBhZ2VEZXRhaWwpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0ZPT1RFUjoKKwkJCQlzZXRGb290ZXIoKFBhZ2VGb290ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURV9fSEVBREVSOgorCQkJCXJldHVybiBoZWFkZXIgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX1RFTVBMQVRFX19ERVRBSUw6CisJCQkJcmV0dXJuIGRldGFpbCAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR05fVEVNUExBVEVfX0ZPT1RFUjoKKwkJCQlyZXR1cm4gZm9vdGVyICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9SZXBvcnREZXNpZ25UZW1wbGF0ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzk2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNzE3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLkFjdGlvblRvb2xiYXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVmaW5pdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsI2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydEltcGwjZ2V0RGVzY3JpcHRpb25WYWx1ZSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0SW1wbCNnZXREYXRhbWFydFJlZiA8ZW0+RGF0YW1hcnQgUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydEltcGwjZ2V0UmVuZGVyaW5nIDxlbT5SZW5kZXJpbmc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0SW1wbCNnZXRFeHRlcm5hbENzc1VSSSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlIDxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsI2dldFBhZ2VUZW1wbGF0ZSA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsI2dldE1lZGlhIDxlbT5NZWRpYTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRJbXBsI2dldFRvb2xiYXIgPGVtPlRvb2xiYXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0SW1wbCNnZXREZXNpZ24gPGVtPkRlc2lnbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlcG9ydEltcGwgZXh0ZW5kcyBSZXBvcnRCYXNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERVNDUklQVElPTl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblZhbHVlKCkgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvblZhbHVlKCkgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uVmFsdWUgPSBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFtYXJ0UmVmKCkgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF0YW1hcnRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnRSZWY7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVuZGVyaW5nKCkgPGVtPlJlbmRlcmluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVuZGVyaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlbmRlcmluZ0VudW0gUkVOREVSSU5HX0VERUZBVUxUID0gUmVuZGVyaW5nRW51bS5IVE1MOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVuZGVyaW5nKCkgPGVtPlJlbmRlcmluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVuZGVyaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVuZGVyaW5nRW51bSByZW5kZXJpbmcgPSBSRU5ERVJJTkdfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxDc3NVUkkoKSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXh0ZXJuYWxDc3NVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0NTU19VUklfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxDc3NVUkkoKSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXh0ZXJuYWxDc3NVUkkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxDc3NVUkkgPSBFWFRFUk5BTF9DU1NfVVJJX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCkgPGVtPkV4dGVybmFsIENzcyBVUkkgQnVuZGxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsQ3NzVVJJQnVuZGxlID0gRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWdlVGVtcGxhdGUoKSA8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFnZVRlbXBsYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGFnZVRlbXBsYXRlIHBhZ2VUZW1wbGF0ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lZGlhKCkgPGVtPk1lZGlhPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNZWRpYSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE1lZGlhIG1lZGlhOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbGJhcigpIDxlbT5Ub29sYmFyPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb29sYmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWN0aW9uVG9vbGJhciB0b29sYmFyOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzaWduKCkgPGVtPkRlc2lnbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzaWduKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVwb3J0RGVzaWduIGRlc2lnbjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXBvcnRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGJvb2xlYW4gbmV3RGVzY3JpcHRpb24pIHsKKwkJYm9vbGVhbiBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25WYWx1ZShTdHJpbmcgbmV3RGVzY3JpcHRpb25WYWx1ZSkgeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uVmFsdWU7CisJCWRlc2NyaXB0aW9uVmFsdWUgPSBuZXdEZXNjcmlwdGlvblZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTQ1JJUFRJT05fVkFMVUUsIG9sZERlc2NyaXB0aW9uVmFsdWUsIGRlc2NyaXB0aW9uVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnREZWZpbml0aW9uIGdldERhdGFtYXJ0UmVmKCkgeworCQlpZiAoZGF0YW1hcnRSZWYgIT0gbnVsbCAmJiBkYXRhbWFydFJlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGF0YW1hcnRSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KWRhdGFtYXJ0UmVmOworCQkJZGF0YW1hcnRSZWYgPSAoRGF0YW1hcnREZWZpbml0aW9uKWVSZXNvbHZlUHJveHkob2xkRGF0YW1hcnRSZWYpOworCQkJaWYgKGRhdGFtYXJ0UmVmICE9IG9sZERhdGFtYXJ0UmVmKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RBVEFNQVJUX1JFRiwgb2xkRGF0YW1hcnRSZWYsIGRhdGFtYXJ0UmVmKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRhdGFtYXJ0UmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydERlZmluaXRpb24gYmFzaWNHZXREYXRhbWFydFJlZigpIHsKKwkJcmV0dXJuIGRhdGFtYXJ0UmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGFtYXJ0UmVmKERhdGFtYXJ0RGVmaW5pdGlvbiBuZXdEYXRhbWFydFJlZikgeworCQlEYXRhbWFydERlZmluaXRpb24gb2xkRGF0YW1hcnRSZWYgPSBkYXRhbWFydFJlZjsKKwkJZGF0YW1hcnRSZWYgPSBuZXdEYXRhbWFydFJlZjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RBVEFNQVJUX1JFRiwgb2xkRGF0YW1hcnRSZWYsIGRhdGFtYXJ0UmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbmRlcmluZ0VudW0gZ2V0UmVuZGVyaW5nKCkgeworCQlyZXR1cm4gcmVuZGVyaW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbmRlcmluZyhSZW5kZXJpbmdFbnVtIG5ld1JlbmRlcmluZykgeworCQlSZW5kZXJpbmdFbnVtIG9sZFJlbmRlcmluZyA9IHJlbmRlcmluZzsKKwkJcmVuZGVyaW5nID0gbmV3UmVuZGVyaW5nID09IG51bGwgPyBSRU5ERVJJTkdfRURFRkFVTFQgOiBuZXdSZW5kZXJpbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19SRU5ERVJJTkcsIG9sZFJlbmRlcmluZywgcmVuZGVyaW5nKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbENzc1VSSSgpIHsKKwkJcmV0dXJuIGV4dGVybmFsQ3NzVVJJOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ3NzVVJJKFN0cmluZyBuZXdFeHRlcm5hbENzc1VSSSkgeworCQlTdHJpbmcgb2xkRXh0ZXJuYWxDc3NVUkkgPSBleHRlcm5hbENzc1VSSTsKKwkJZXh0ZXJuYWxDc3NVUkkgPSBuZXdFeHRlcm5hbENzc1VSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0VYVEVSTkFMX0NTU19VUkksIG9sZEV4dGVybmFsQ3NzVVJJLCBleHRlcm5hbENzc1VSSSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKSB7CisJCXJldHVybiBleHRlcm5hbENzc1VSSUJ1bmRsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbENzc1VSSUJ1bmRsZShTdHJpbmcgbmV3RXh0ZXJuYWxDc3NVUklCdW5kbGUpIHsKKwkJU3RyaW5nIG9sZEV4dGVybmFsQ3NzVVJJQnVuZGxlID0gZXh0ZXJuYWxDc3NVUklCdW5kbGU7CisJCWV4dGVybmFsQ3NzVVJJQnVuZGxlID0gbmV3RXh0ZXJuYWxDc3NVUklCdW5kbGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19FWFRFUk5BTF9DU1NfVVJJX0JVTkRMRSwgb2xkRXh0ZXJuYWxDc3NVUklCdW5kbGUsIGV4dGVybmFsQ3NzVVJJQnVuZGxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VUZW1wbGF0ZSBnZXRQYWdlVGVtcGxhdGUoKSB7CisJCWlmIChwYWdlVGVtcGxhdGUgIT0gbnVsbCAmJiBwYWdlVGVtcGxhdGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBhZ2VUZW1wbGF0ZSA9IChJbnRlcm5hbEVPYmplY3QpcGFnZVRlbXBsYXRlOworCQkJcGFnZVRlbXBsYXRlID0gKFBhZ2VUZW1wbGF0ZSllUmVzb2x2ZVByb3h5KG9sZFBhZ2VUZW1wbGF0ZSk7CisJCQlpZiAocGFnZVRlbXBsYXRlICE9IG9sZFBhZ2VUZW1wbGF0ZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19QQUdFX1RFTVBMQVRFLCBvbGRQYWdlVGVtcGxhdGUsIHBhZ2VUZW1wbGF0ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBwYWdlVGVtcGxhdGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBhZ2VUZW1wbGF0ZSBiYXNpY0dldFBhZ2VUZW1wbGF0ZSgpIHsKKwkJcmV0dXJuIHBhZ2VUZW1wbGF0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWdlVGVtcGxhdGUoUGFnZVRlbXBsYXRlIG5ld1BhZ2VUZW1wbGF0ZSkgeworCQlQYWdlVGVtcGxhdGUgb2xkUGFnZVRlbXBsYXRlID0gcGFnZVRlbXBsYXRlOworCQlwYWdlVGVtcGxhdGUgPSBuZXdQYWdlVGVtcGxhdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19QQUdFX1RFTVBMQVRFLCBvbGRQYWdlVGVtcGxhdGUsIHBhZ2VUZW1wbGF0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZWRpYSBnZXRNZWRpYSgpIHsKKwkJaWYgKG1lZGlhICE9IG51bGwgJiYgbWVkaWEuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE1lZGlhID0gKEludGVybmFsRU9iamVjdCltZWRpYTsKKwkJCW1lZGlhID0gKE1lZGlhKWVSZXNvbHZlUHJveHkob2xkTWVkaWEpOworCQkJaWYgKG1lZGlhICE9IG9sZE1lZGlhKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX01FRElBLCBvbGRNZWRpYSwgbWVkaWEpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWVkaWE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1lZGlhIGJhc2ljR2V0TWVkaWEoKSB7CisJCXJldHVybiBtZWRpYTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWRpYShNZWRpYSBuZXdNZWRpYSkgeworCQlNZWRpYSBvbGRNZWRpYSA9IG1lZGlhOworCQltZWRpYSA9IG5ld01lZGlhOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fTUVESUEsIG9sZE1lZGlhLCBtZWRpYSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBY3Rpb25Ub29sYmFyIGdldFRvb2xiYXIoKSB7CisJCWlmICh0b29sYmFyICE9IG51bGwgJiYgdG9vbGJhci5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkVG9vbGJhciA9IChJbnRlcm5hbEVPYmplY3QpdG9vbGJhcjsKKwkJCXRvb2xiYXIgPSAoQWN0aW9uVG9vbGJhcillUmVzb2x2ZVByb3h5KG9sZFRvb2xiYXIpOworCQkJaWYgKHRvb2xiYXIgIT0gb2xkVG9vbGJhcikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19UT09MQkFSLCBvbGRUb29sYmFyLCB0b29sYmFyKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRvb2xiYXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFjdGlvblRvb2xiYXIgYmFzaWNHZXRUb29sYmFyKCkgeworCQlyZXR1cm4gdG9vbGJhcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb29sYmFyKEFjdGlvblRvb2xiYXIgbmV3VG9vbGJhcikgeworCQlBY3Rpb25Ub29sYmFyIG9sZFRvb2xiYXIgPSB0b29sYmFyOworCQl0b29sYmFyID0gbmV3VG9vbGJhcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX1RPT0xCQVIsIG9sZFRvb2xiYXIsIHRvb2xiYXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVwb3J0RGVzaWduIGdldERlc2lnbigpIHsKKwkJcmV0dXJuIGRlc2lnbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNpZ24oUmVwb3J0RGVzaWduIG5ld0Rlc2lnbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlSZXBvcnREZXNpZ24gb2xkRGVzaWduID0gZGVzaWduOworCQlkZXNpZ24gPSBuZXdEZXNpZ247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19ERVNJR04sIG9sZERlc2lnbiwgbmV3RGVzaWduKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNpZ24oUmVwb3J0RGVzaWduIG5ld0Rlc2lnbikgeworCQlpZiAobmV3RGVzaWduICE9IGRlc2lnbikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGVzaWduICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlc2lnbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19ERVNJR04sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0Rlc2lnbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNpZ24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTSUdOLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldERlc2lnbihuZXdEZXNpZ24sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0lHTiwgbmV3RGVzaWduLCBuZXdEZXNpZ24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19ERVNJR046CisJCQkJcmV0dXJuIGJhc2ljU2V0RGVzaWduKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gaXNEZXNjcmlwdGlvbigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RBVEFNQVJUX1JFRjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldERhdGFtYXJ0UmVmKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RGF0YW1hcnRSZWYoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX1JFTkRFUklORzoKKwkJCQlyZXR1cm4gZ2V0UmVuZGVyaW5nKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19FWFRFUk5BTF9DU1NfVVJJOgorCQkJCXJldHVybiBnZXRFeHRlcm5hbENzc1VSSSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEU6CisJCQkJcmV0dXJuIGdldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19QQUdFX1RFTVBMQVRFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFnZVRlbXBsYXRlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0UGFnZVRlbXBsYXRlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19NRURJQToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lZGlhKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0TWVkaWEoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX1RPT0xCQVI6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUb29sYmFyKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VG9vbGJhcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTSUdOOgorCQkJCXJldHVybiBnZXREZXNpZ24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0NSSVBUSU9OX1ZBTFVFOgorCQkJCXNldERlc2NyaXB0aW9uVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREFUQU1BUlRfUkVGOgorCQkJCXNldERhdGFtYXJ0UmVmKChEYXRhbWFydERlZmluaXRpb24pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX1JFTkRFUklORzoKKwkJCQlzZXRSZW5kZXJpbmcoKFJlbmRlcmluZ0VudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0VYVEVSTkFMX0NTU19VUkk6CisJCQkJc2V0RXh0ZXJuYWxDc3NVUkkoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEU6CisJCQkJc2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fUEFHRV9URU1QTEFURToKKwkJCQlzZXRQYWdlVGVtcGxhdGUoKFBhZ2VUZW1wbGF0ZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fTUVESUE6CisJCQkJc2V0TWVkaWEoKE1lZGlhKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19UT09MQkFSOgorCQkJCXNldFRvb2xiYXIoKEFjdGlvblRvb2xiYXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0lHTjoKKwkJCQlzZXREZXNpZ24oKFJlcG9ydERlc2lnbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlzZXREZXNjcmlwdGlvblZhbHVlKERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19EQVRBTUFSVF9SRUY6CisJCQkJc2V0RGF0YW1hcnRSZWYoKERhdGFtYXJ0RGVmaW5pdGlvbiludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19SRU5ERVJJTkc6CisJCQkJc2V0UmVuZGVyaW5nKFJFTkRFUklOR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSToKKwkJCQlzZXRFeHRlcm5hbENzc1VSSShFWFRFUk5BTF9DU1NfVVJJX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19FWFRFUk5BTF9DU1NfVVJJX0JVTkRMRToKKwkJCQlzZXRFeHRlcm5hbENzc1VSSUJ1bmRsZShFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fUEFHRV9URU1QTEFURToKKwkJCQlzZXRQYWdlVGVtcGxhdGUoKFBhZ2VUZW1wbGF0ZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19NRURJQToKKwkJCQlzZXRNZWRpYSgoTWVkaWEpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fVE9PTEJBUjoKKwkJCQlzZXRUb29sYmFyKChBY3Rpb25Ub29sYmFyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0lHTjoKKwkJCQlzZXREZXNpZ24oKFJlcG9ydERlc2lnbiludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBkZXNjcmlwdGlvbiAhPSBERVNDUklQVElPTl9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RFU0NSSVBUSU9OX1ZBTFVFOgorCQkJCXJldHVybiBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb25WYWx1ZSAhPSBudWxsIDogIURFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvblZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0RBVEFNQVJUX1JFRjoKKwkJCQlyZXR1cm4gZGF0YW1hcnRSZWYgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX1JFTkRFUklORzoKKwkJCQlyZXR1cm4gcmVuZGVyaW5nICE9IFJFTkRFUklOR19FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX0VYVEVSTkFMX0NTU19VUkk6CisJCQkJcmV0dXJuIEVYVEVSTkFMX0NTU19VUklfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsQ3NzVVJJICE9IG51bGwgOiAhRVhURVJOQUxfQ1NTX1VSSV9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxDc3NVUkkpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEU6CisJCQkJcmV0dXJuIEVYVEVSTkFMX0NTU19VUklfQlVORExFX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbENzc1VSSUJ1bmRsZSAhPSBudWxsIDogIUVYVEVSTkFMX0NTU19VUklfQlVORExFX0VERUZBVUxULmVxdWFscyhleHRlcm5hbENzc1VSSUJ1bmRsZSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX19QQUdFX1RFTVBMQVRFOgorCQkJCXJldHVybiBwYWdlVGVtcGxhdGUgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfX01FRElBOgorCQkJCXJldHVybiBtZWRpYSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fVE9PTEJBUjoKKwkJCQlyZXR1cm4gdG9vbGJhciAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9fREVTSUdOOgorCQkJCXJldHVybiBkZXNpZ24gIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb25WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb25WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmVuZGVyaW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZW5kZXJpbmcpOworCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsQ3NzVVJJOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChleHRlcm5hbENzc1VSSSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxDc3NVUklCdW5kbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsQ3NzVVJJQnVuZGxlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vUmVwb3J0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydExhenlSZXNvbHZlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnRMYXp5UmVzb2x2ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MTVkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9SZXBvcnRMYXp5UmVzb2x2ZXJJbXBsLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLk1pbmltYWxFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpLkVjb3JlVXRpbDM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydExhenlSZXNvbHZlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydCBMYXp5IFJlc29sdmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBleHRlbmRzIE1pbmltYWxFT2JqZWN0SW1wbC5Db250YWluZXIgaW1wbGVtZW50cyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfTEFaWV9SRVNPTFZFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KGZpbmFsIEludGVybmFsRU9iamVjdCBwcm94eSkgeworCQlSZXNvdXJjZSBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTsKKwkJUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOworCQlyZXR1cm4gRWNvcmVVdGlsMy5yZXNvbHZlKHByb3h5LCBfcmVzb3VyY2VTZXQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUludm9rZShpbnQgb3BlcmF0aW9uSUQsIEVMaXN0PD8+IGFyZ3VtZW50cykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlzd2l0Y2ggKG9wZXJhdGlvbklEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOgorCQkJCXJldHVybiBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpYXJndW1lbnRzLmdldCgwKSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZva2Uob3BlcmF0aW9uSUQsIGFyZ3VtZW50cyk7CisJfQorCit9IC8vUmVwb3J0TGF6eVJlc29sdmVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydE1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydE1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDMzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0TW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5NaW5pbWFsRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0IE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydE1vZGVsSW1wbCNnZXRQY2tnIDxlbT5QY2tnPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0TW9kZWxJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIFJlcG9ydE1vZGVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQY2tnKCkgPGVtPlBja2c8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGNrZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFJlcG9ydFBhY2thZ2U+IHBja2c7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVwb3J0TW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfTU9ERUw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFJlcG9ydFBhY2thZ2U+IGdldFBja2coKSB7CisJCWlmIChwY2tnID09IG51bGwpIHsKKwkJCXBja2cgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVwb3J0UGFja2FnZT4oUmVwb3J0UGFja2FnZS5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTU9ERUxfX1BDS0cpOworCQl9CisJCXJldHVybiBwY2tnOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTU9ERUxfX1BDS0c6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQY2tnKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9NT0RFTF9fUENLRzoKKwkJCQlyZXR1cm4gZ2V0UGNrZygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX01PREVMX19QQ0tHOgorCQkJCWdldFBja2coKS5jbGVhcigpOworCQkJCWdldFBja2coKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlcG9ydFBhY2thZ2U+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9NT0RFTF9fUENLRzoKKwkJCQlnZXRQY2tnKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTU9ERUxfX1BDS0c6CisJCQkJcmV0dXJuIHBja2cgIT0gbnVsbCAmJiAhcGNrZy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1JlcG9ydE1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydFBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvUmVwb3J0UGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY1MTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1JlcG9ydFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw3NTggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLmltcGwuTFBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEltcG9ydFNlY3Rpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQgUGFja2FnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRJbXBvcnRTZWN0aW9uIDxlbT5JbXBvcnQgU2VjdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbENzc1VSSSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuUmVwb3J0UGFja2FnZUltcGwjZ2V0UGFnZXRlbXBsYXRlcyA8ZW0+UGFnZXRlbXBsYXRlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRGb3JtYXR0ZXJzIDxlbT5Gb3JtYXR0ZXJzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydFBhY2thZ2VJbXBsI2dldENvbG9ycyA8ZW0+Q29sb3JzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlJlcG9ydFBhY2thZ2VJbXBsI2dldEZvbnRzIDxlbT5Gb250czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRNZWRpYXMgPGVtPk1lZGlhczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRTdHlsZXMgPGVtPlN0eWxlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5SZXBvcnRQYWNrYWdlSW1wbCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0UGFja2FnZUltcGwgZXh0ZW5kcyBMUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZXBvcnRQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBvcnRTZWN0aW9uKCkgPGVtPkltcG9ydCBTZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbXBvcnRTZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWEltcG9ydFNlY3Rpb24gaW1wb3J0U2VjdGlvbjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbENzc1VSSSgpIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfQ1NTX1VSSV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbENzc1VSSSgpIDxlbT5FeHRlcm5hbCBDc3MgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeHRlcm5hbENzc1VSSSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbENzc1VSSSA9IEVYVEVSTkFMX0NTU19VUklfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKSA8ZW0+RXh0ZXJuYWwgQ3NzIFVSSSBCdW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpIDxlbT5FeHRlcm5hbCBDc3MgVVJJIEJ1bmRsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxDc3NVUklCdW5kbGUgPSBFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZ2V0ZW1wbGF0ZXMoKSA8ZW0+UGFnZXRlbXBsYXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFnZXRlbXBsYXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFBhZ2VUZW1wbGF0ZXMgcGFnZXRlbXBsYXRlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1hdHRlcnMoKSA8ZW0+Rm9ybWF0dGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9ybWF0dGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFNvbWVGb3JtYXRzIGZvcm1hdHRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xvcnMoKSA8ZW0+Q29sb3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb2xvcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvcnMgY29sb3JzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9udHMoKSA8ZW0+Rm9udHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZvbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRm9udHMgZm9udHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZWRpYXMoKSA8ZW0+TWVkaWFzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNZWRpYXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNZWRpYXMgbWVkaWFzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGVzKCkgPGVtPlN0eWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGVzIHN0eWxlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydHMoKSA8ZW0+UmVwb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXBvcnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8UmVwb3J0PiByZXBvcnRzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJlcG9ydFBhY2thZ2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfUEFDS0FHRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWEltcG9ydFNlY3Rpb24gZ2V0SW1wb3J0U2VjdGlvbigpIHsKKwkJcmV0dXJuIGltcG9ydFNlY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW1wb3J0U2VjdGlvbihYSW1wb3J0U2VjdGlvbiBuZXdJbXBvcnRTZWN0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVhJbXBvcnRTZWN0aW9uIG9sZEltcG9ydFNlY3Rpb24gPSBpbXBvcnRTZWN0aW9uOworCQlpbXBvcnRTZWN0aW9uID0gbmV3SW1wb3J0U2VjdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fSU1QT1JUX1NFQ1RJT04sIG9sZEltcG9ydFNlY3Rpb24sIG5ld0ltcG9ydFNlY3Rpb24pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEltcG9ydFNlY3Rpb24oWEltcG9ydFNlY3Rpb24gbmV3SW1wb3J0U2VjdGlvbikgeworCQlpZiAobmV3SW1wb3J0U2VjdGlvbiAhPSBpbXBvcnRTZWN0aW9uKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChpbXBvcnRTZWN0aW9uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWltcG9ydFNlY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19JTVBPUlRfU0VDVElPTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SW1wb3J0U2VjdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbXBvcnRTZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fSU1QT1JUX1NFQ1RJT04sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0SW1wb3J0U2VjdGlvbihuZXdJbXBvcnRTZWN0aW9uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0lNUE9SVF9TRUNUSU9OLCBuZXdJbXBvcnRTZWN0aW9uLCBuZXdJbXBvcnRTZWN0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbENzc1VSSSgpIHsKKwkJcmV0dXJuIGV4dGVybmFsQ3NzVVJJOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ3NzVVJJKFN0cmluZyBuZXdFeHRlcm5hbENzc1VSSSkgeworCQlTdHJpbmcgb2xkRXh0ZXJuYWxDc3NVUkkgPSBleHRlcm5hbENzc1VSSTsKKwkJZXh0ZXJuYWxDc3NVUkkgPSBuZXdFeHRlcm5hbENzc1VSSTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRVhURVJOQUxfQ1NTX1VSSSwgb2xkRXh0ZXJuYWxDc3NVUkksIGV4dGVybmFsQ3NzVVJJKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpIHsKKwkJcmV0dXJuIGV4dGVybmFsQ3NzVVJJQnVuZGxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ3NzVVJJQnVuZGxlKFN0cmluZyBuZXdFeHRlcm5hbENzc1VSSUJ1bmRsZSkgeworCQlTdHJpbmcgb2xkRXh0ZXJuYWxDc3NVUklCdW5kbGUgPSBleHRlcm5hbENzc1VSSUJ1bmRsZTsKKwkJZXh0ZXJuYWxDc3NVUklCdW5kbGUgPSBuZXdFeHRlcm5hbENzc1VSSUJ1bmRsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEUsIG9sZEV4dGVybmFsQ3NzVVJJQnVuZGxlLCBleHRlcm5hbENzc1VSSUJ1bmRsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQYWdlVGVtcGxhdGVzIGdldFBhZ2V0ZW1wbGF0ZXMoKSB7CisJCXJldHVybiBwYWdldGVtcGxhdGVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBhZ2V0ZW1wbGF0ZXMoUGFnZVRlbXBsYXRlcyBuZXdQYWdldGVtcGxhdGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVBhZ2VUZW1wbGF0ZXMgb2xkUGFnZXRlbXBsYXRlcyA9IHBhZ2V0ZW1wbGF0ZXM7CisJCXBhZ2V0ZW1wbGF0ZXMgPSBuZXdQYWdldGVtcGxhdGVzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTLCBvbGRQYWdldGVtcGxhdGVzLCBuZXdQYWdldGVtcGxhdGVzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWdldGVtcGxhdGVzKFBhZ2VUZW1wbGF0ZXMgbmV3UGFnZXRlbXBsYXRlcykgeworCQlpZiAobmV3UGFnZXRlbXBsYXRlcyAhPSBwYWdldGVtcGxhdGVzKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChwYWdldGVtcGxhdGVzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBhZ2V0ZW1wbGF0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQYWdldGVtcGxhdGVzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhZ2V0ZW1wbGF0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFBhZ2V0ZW1wbGF0ZXMobmV3UGFnZXRlbXBsYXRlcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTLCBuZXdQYWdldGVtcGxhdGVzLCBuZXdQYWdldGVtcGxhdGVzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFNvbWVGb3JtYXRzIGdldEZvcm1hdHRlcnMoKSB7CisJCXJldHVybiBmb3JtYXR0ZXJzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEZvcm1hdHRlcnMoU29tZUZvcm1hdHMgbmV3Rm9ybWF0dGVycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlTb21lRm9ybWF0cyBvbGRGb3JtYXR0ZXJzID0gZm9ybWF0dGVyczsKKwkJZm9ybWF0dGVycyA9IG5ld0Zvcm1hdHRlcnM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0ZPUk1BVFRFUlMsIG9sZEZvcm1hdHRlcnMsIG5ld0Zvcm1hdHRlcnMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvcm1hdHRlcnMoU29tZUZvcm1hdHMgbmV3Rm9ybWF0dGVycykgeworCQlpZiAobmV3Rm9ybWF0dGVycyAhPSBmb3JtYXR0ZXJzKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChmb3JtYXR0ZXJzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZvcm1hdHRlcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT1JNQVRURVJTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdGb3JtYXR0ZXJzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Zvcm1hdHRlcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT1JNQVRURVJTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEZvcm1hdHRlcnMobmV3Rm9ybWF0dGVycywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT1JNQVRURVJTLCBuZXdGb3JtYXR0ZXJzLCBuZXdGb3JtYXR0ZXJzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9ycyBnZXRDb2xvcnMoKSB7CisJCXJldHVybiBjb2xvcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sb3JzKENvbG9ycyBuZXdDb2xvcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQ29sb3JzIG9sZENvbG9ycyA9IGNvbG9yczsKKwkJY29sb3JzID0gbmV3Q29sb3JzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19DT0xPUlMsIG9sZENvbG9ycywgbmV3Q29sb3JzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2xvcnMoQ29sb3JzIG5ld0NvbG9ycykgeworCQlpZiAobmV3Q29sb3JzICE9IGNvbG9ycykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29sb3JzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbG9ycykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0NPTE9SUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sb3JzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbG9ycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0NPTE9SUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb2xvcnMobmV3Q29sb3JzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0NPTE9SUywgbmV3Q29sb3JzLCBuZXdDb2xvcnMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9udHMgZ2V0Rm9udHMoKSB7CisJCXJldHVybiBmb250czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRGb250cyhGb250cyBuZXdGb250cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlGb250cyBvbGRGb250cyA9IGZvbnRzOworCQlmb250cyA9IG5ld0ZvbnRzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT05UUywgb2xkRm9udHMsIG5ld0ZvbnRzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb250cyhGb250cyBuZXdGb250cykgeworCQlpZiAobmV3Rm9udHMgIT0gZm9udHMpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGZvbnRzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWZvbnRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0ZvbnRzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ZvbnRzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Rm9udHMobmV3Rm9udHMsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFMsIG5ld0ZvbnRzLCBuZXdGb250cykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZWRpYXMgZ2V0TWVkaWFzKCkgeworCQlyZXR1cm4gbWVkaWFzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1lZGlhcyhNZWRpYXMgbmV3TWVkaWFzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCU1lZGlhcyBvbGRNZWRpYXMgPSBtZWRpYXM7CisJCW1lZGlhcyA9IG5ld01lZGlhczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fTUVESUFTLCBvbGRNZWRpYXMsIG5ld01lZGlhcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWVkaWFzKE1lZGlhcyBuZXdNZWRpYXMpIHsKKwkJaWYgKG5ld01lZGlhcyAhPSBtZWRpYXMpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1lZGlhcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltZWRpYXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19NRURJQVMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01lZGlhcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNZWRpYXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19NRURJQVMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TWVkaWFzKG5ld01lZGlhcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19NRURJQVMsIG5ld01lZGlhcywgbmV3TWVkaWFzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlcyBnZXRTdHlsZXMoKSB7CisJCXJldHVybiBzdHlsZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3R5bGVzKFN0eWxlcyBuZXdTdHlsZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJU3R5bGVzIG9sZFN0eWxlcyA9IHN0eWxlczsKKwkJc3R5bGVzID0gbmV3U3R5bGVzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19TVFlMRVMsIG9sZFN0eWxlcywgbmV3U3R5bGVzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHlsZXMoU3R5bGVzIG5ld1N0eWxlcykgeworCQlpZiAobmV3U3R5bGVzICE9IHN0eWxlcykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoc3R5bGVzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0eWxlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1NUWUxFUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U3R5bGVzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0eWxlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1NUWUxFUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRTdHlsZXMobmV3U3R5bGVzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1NUWUxFUywgbmV3U3R5bGVzLCBuZXdTdHlsZXMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8UmVwb3J0PiBnZXRSZXBvcnRzKCkgeworCQlpZiAocmVwb3J0cyA9PSBudWxsKSB7CisJCQlyZXBvcnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlcG9ydD4oUmVwb3J0LmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19SRVBPUlRTKTsKKwkJfQorCQlyZXR1cm4gcmVwb3J0czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0lNUE9SVF9TRUNUSU9OOgorCQkJCXJldHVybiBiYXNpY1NldEltcG9ydFNlY3Rpb24obnVsbCwgbXNncyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1BBR0VURU1QTEFURVM6CisJCQkJcmV0dXJuIGJhc2ljU2V0UGFnZXRlbXBsYXRlcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9STUFUVEVSUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRGb3JtYXR0ZXJzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19DT0xPUlM6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q29sb3JzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT05UUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRGb250cyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fTUVESUFTOgorCQkJCXJldHVybiBiYXNpY1NldE1lZGlhcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fU1RZTEVTOgorCQkJCXJldHVybiBiYXNpY1NldFN0eWxlcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fUkVQT1JUUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlcG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0lNUE9SVF9TRUNUSU9OOgorCQkJCXJldHVybiBnZXRJbXBvcnRTZWN0aW9uKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0VYVEVSTkFMX0NTU19VUkk6CisJCQkJcmV0dXJuIGdldEV4dGVybmFsQ3NzVVJJKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0VYVEVSTkFMX0NTU19VUklfQlVORExFOgorCQkJCXJldHVybiBnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTOgorCQkJCXJldHVybiBnZXRQYWdldGVtcGxhdGVzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0ZPUk1BVFRFUlM6CisJCQkJcmV0dXJuIGdldEZvcm1hdHRlcnMoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fQ09MT1JTOgorCQkJCXJldHVybiBnZXRDb2xvcnMoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFM6CisJCQkJcmV0dXJuIGdldEZvbnRzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX01FRElBUzoKKwkJCQlyZXR1cm4gZ2V0TWVkaWFzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1NUWUxFUzoKKwkJCQlyZXR1cm4gZ2V0U3R5bGVzKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1JFUE9SVFM6CisJCQkJcmV0dXJuIGdldFJlcG9ydHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19JTVBPUlRfU0VDVElPTjoKKwkJCQlzZXRJbXBvcnRTZWN0aW9uKChYSW1wb3J0U2VjdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJOgorCQkJCXNldEV4dGVybmFsQ3NzVVJJKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRVhURVJOQUxfQ1NTX1VSSV9CVU5ETEU6CisJCQkJc2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTOgorCQkJCXNldFBhZ2V0ZW1wbGF0ZXMoKFBhZ2VUZW1wbGF0ZXMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9STUFUVEVSUzoKKwkJCQlzZXRGb3JtYXR0ZXJzKChTb21lRm9ybWF0cyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19DT0xPUlM6CisJCQkJc2V0Q29sb3JzKChDb2xvcnMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFM6CisJCQkJc2V0Rm9udHMoKEZvbnRzKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX01FRElBUzoKKwkJCQlzZXRNZWRpYXMoKE1lZGlhcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19TVFlMRVM6CisJCQkJc2V0U3R5bGVzKChTdHlsZXMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fUkVQT1JUUzoKKwkJCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKKwkJCQlnZXRSZXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXBvcnQ+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19JTVBPUlRfU0VDVElPTjoKKwkJCQlzZXRJbXBvcnRTZWN0aW9uKChYSW1wb3J0U2VjdGlvbiludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0VYVEVSTkFMX0NTU19VUkk6CisJCQkJc2V0RXh0ZXJuYWxDc3NVUkkoRVhURVJOQUxfQ1NTX1VSSV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19FWFRFUk5BTF9DU1NfVVJJX0JVTkRMRToKKwkJCQlzZXRFeHRlcm5hbENzc1VSSUJ1bmRsZShFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTOgorCQkJCXNldFBhZ2V0ZW1wbGF0ZXMoKFBhZ2VUZW1wbGF0ZXMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19GT1JNQVRURVJTOgorCQkJCXNldEZvcm1hdHRlcnMoKFNvbWVGb3JtYXRzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fQ09MT1JTOgorCQkJCXNldENvbG9ycygoQ29sb3JzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFM6CisJCQkJc2V0Rm9udHMoKEZvbnRzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fTUVESUFTOgorCQkJCXNldE1lZGlhcygoTWVkaWFzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fU1RZTEVTOgorCQkJCXNldFN0eWxlcygoU3R5bGVzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fUkVQT1JUUzoKKwkJCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fSU1QT1JUX1NFQ1RJT046CisJCQkJcmV0dXJuIGltcG9ydFNlY3Rpb24gIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRVhURVJOQUxfQ1NTX1VSSToKKwkJCQlyZXR1cm4gRVhURVJOQUxfQ1NTX1VSSV9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxDc3NVUkkgIT0gbnVsbCA6ICFFWFRFUk5BTF9DU1NfVVJJX0VERUZBVUxULmVxdWFscyhleHRlcm5hbENzc1VSSSk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0VYVEVSTkFMX0NTU19VUklfQlVORExFOgorCQkJCXJldHVybiBFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxDc3NVUklCdW5kbGUgIT0gbnVsbCA6ICFFWFRFUk5BTF9DU1NfVVJJX0JVTkRMRV9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxDc3NVUklCdW5kbGUpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFX19QQUdFVEVNUExBVEVTOgorCQkJCXJldHVybiBwYWdldGVtcGxhdGVzICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX0ZPUk1BVFRFUlM6CisJCQkJcmV0dXJuIGZvcm1hdHRlcnMgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fQ09MT1JTOgorCQkJCXJldHVybiBjb2xvcnMgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRV9fRk9OVFM6CisJCQkJcmV0dXJuIGZvbnRzICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX01FRElBUzoKKwkJCQlyZXR1cm4gbWVkaWFzICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1NUWUxFUzoKKwkJCQlyZXR1cm4gc3R5bGVzICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX1BBQ0tBR0VfX1JFUE9SVFM6CisJCQkJcmV0dXJuIHJlcG9ydHMgIT0gbnVsbCAmJiAhcmVwb3J0cy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChleHRlcm5hbENzc1VSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxDc3NVUkkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsQ3NzVVJJQnVuZGxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChleHRlcm5hbENzc1VSSUJ1bmRsZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JlcG9ydFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUZvcm1hdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Tb21lRm9ybWF0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzNiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUZvcm1hdEltcGwuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRBbGlnbkVudW07CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Tb21lIEZvcm1hdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0SW1wbCNnZXRVaV9wYXR0ZXJuIDxlbT5VaSBwYXR0ZXJuPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlNvbWVGb3JtYXRJbXBsI2dldFJlcG9ydF9wYXR0ZXJuIDxlbT5SZXBvcnQgcGF0dGVybjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5Tb21lRm9ybWF0SW1wbCNnZXRUZXh0YWxpZ24gPGVtPlRleHRhbGlnbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNvbWVGb3JtYXRJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBTb21lRm9ybWF0IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VWlfcGF0dGVybigpIDxlbT5VaSBwYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVaV9wYXR0ZXJuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVpX3BhdHRlcm4oKSA8ZW0+VWkgcGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VWlfcGF0dGVybigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB1aV9wYXR0ZXJuID0gVUlfUEFUVEVSTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRfcGF0dGVybigpIDxlbT5SZXBvcnQgcGF0dGVybjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVwb3J0X3BhdHRlcm4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9QQVRURVJOX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydF9wYXR0ZXJuKCkgPGVtPlJlcG9ydCBwYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXBvcnRfcGF0dGVybigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByZXBvcnRfcGF0dGVybiA9IFJFUE9SVF9QQVRURVJOX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHRhbGlnbigpIDxlbT5UZXh0YWxpZ248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRleHRhbGlnbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZXh0QWxpZ25FbnVtIFRFWFRBTElHTl9FREVGQVVMVCA9IFRleHRBbGlnbkVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHRhbGlnbigpIDxlbT5UZXh0YWxpZ248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRleHRhbGlnbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRleHRBbGlnbkVudW0gdGV4dGFsaWduID0gVEVYVEFMSUdOX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFNvbWVGb3JtYXRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVpX3BhdHRlcm4oKSB7CisJCXJldHVybiB1aV9wYXR0ZXJuOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVpX3BhdHRlcm4oU3RyaW5nIG5ld1VpX3BhdHRlcm4pIHsKKwkJU3RyaW5nIG9sZFVpX3BhdHRlcm4gPSB1aV9wYXR0ZXJuOworCQl1aV9wYXR0ZXJuID0gbmV3VWlfcGF0dGVybjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTiwgb2xkVWlfcGF0dGVybiwgdWlfcGF0dGVybikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0X3BhdHRlcm4oKSB7CisJCXJldHVybiByZXBvcnRfcGF0dGVybjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXBvcnRfcGF0dGVybihTdHJpbmcgbmV3UmVwb3J0X3BhdHRlcm4pIHsKKwkJU3RyaW5nIG9sZFJlcG9ydF9wYXR0ZXJuID0gcmVwb3J0X3BhdHRlcm47CisJCXJlcG9ydF9wYXR0ZXJuID0gbmV3UmVwb3J0X3BhdHRlcm47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOLCBvbGRSZXBvcnRfcGF0dGVybiwgcmVwb3J0X3BhdHRlcm4pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGV4dEFsaWduRW51bSBnZXRUZXh0YWxpZ24oKSB7CisJCXJldHVybiB0ZXh0YWxpZ247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGV4dGFsaWduKFRleHRBbGlnbkVudW0gbmV3VGV4dGFsaWduKSB7CisJCVRleHRBbGlnbkVudW0gb2xkVGV4dGFsaWduID0gdGV4dGFsaWduOworCQl0ZXh0YWxpZ24gPSBuZXdUZXh0YWxpZ24gPT0gbnVsbCA/IFRFWFRBTElHTl9FREVGQVVMVCA6IG5ld1RleHRhbGlnbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOLCBvbGRUZXh0YWxpZ24sIHRleHRhbGlnbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTjoKKwkJCQlyZXR1cm4gZ2V0VWlfcGF0dGVybigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTjoKKwkJCQlyZXR1cm4gZ2V0UmVwb3J0X3BhdHRlcm4oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOOgorCQkJCXJldHVybiBnZXRUZXh0YWxpZ24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUX19VSV9QQVRURVJOOgorCQkJCXNldFVpX3BhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTjoKKwkJCQlzZXRSZXBvcnRfcGF0dGVybigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRfX1RFWFRBTElHTjoKKwkJCQlzZXRUZXh0YWxpZ24oKFRleHRBbGlnbkVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRfX1VJX1BBVFRFUk46CisJCQkJc2V0VWlfcGF0dGVybihVSV9QQVRURVJOX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOOgorCQkJCXNldFJlcG9ydF9wYXR0ZXJuKFJFUE9SVF9QQVRURVJOX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRfX1RFWFRBTElHTjoKKwkJCQlzZXRUZXh0YWxpZ24oVEVYVEFMSUdOX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTjoKKwkJCQlyZXR1cm4gVUlfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gdWlfcGF0dGVybiAhPSBudWxsIDogIVVJX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHVpX3BhdHRlcm4pOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTjoKKwkJCQlyZXR1cm4gUkVQT1JUX1BBVFRFUk5fRURFRkFVTFQgPT0gbnVsbCA/IHJlcG9ydF9wYXR0ZXJuICE9IG51bGwgOiAhUkVQT1JUX1BBVFRFUk5fRURFRkFVTFQuZXF1YWxzKHJlcG9ydF9wYXR0ZXJuKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOOgorCQkJCXJldHVybiB0ZXh0YWxpZ24gIT0gVEVYVEFMSUdOX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodWlfcGF0dGVybjogIik7CisJCXJlc3VsdC5hcHBlbmQodWlfcGF0dGVybik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmVwb3J0X3BhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlcG9ydF9wYXR0ZXJuKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0ZXh0YWxpZ246ICIpOworCQlyZXN1bHQuYXBwZW5kKHRleHRhbGlnbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1NvbWVGb3JtYXRJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUZvcm1hdHNJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUZvcm1hdHNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliNzYzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Tb21lRm9ybWF0c0ltcGwuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHM7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Tb21lIEZvcm1hdHM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUZvcm1hdHNJbXBsI2dldEZvcm1hdHRlcnMgPGVtPkZvcm1hdHRlcnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTb21lRm9ybWF0c0ltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgU29tZUZvcm1hdHMgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm1hdHRlcnMoKSA8ZW0+Rm9ybWF0dGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb3JtYXR0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U29tZUZvcm1hdD4gZm9ybWF0dGVyczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTb21lRm9ybWF0c0ltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUUzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U29tZUZvcm1hdD4gZ2V0Rm9ybWF0dGVycygpIHsKKwkJaWYgKGZvcm1hdHRlcnMgPT0gbnVsbCkgeworCQkJZm9ybWF0dGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTb21lRm9ybWF0PihTb21lRm9ybWF0LmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUU19fRk9STUFUVEVSUyk7CisJCX0KKwkJcmV0dXJuIGZvcm1hdHRlcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUU19fRk9STUFUVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEZvcm1hdHRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRTX19GT1JNQVRURVJTOgorCQkJCXJldHVybiBnZXRGb3JtYXR0ZXJzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0ZPUk1BVFNfX0ZPUk1BVFRFUlM6CisJCQkJZ2V0Rm9ybWF0dGVycygpLmNsZWFyKCk7CisJCQkJZ2V0Rm9ybWF0dGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU29tZUZvcm1hdD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRTX19GT1JNQVRURVJTOgorCQkJCWdldEZvcm1hdHRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUU19fRk9STUFUVEVSUzoKKwkJCQlyZXR1cm4gZm9ybWF0dGVycyAhPSBudWxsICYmICFmb3JtYXR0ZXJzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vU29tZUZvcm1hdHNJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUdyaWRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU29tZUdyaWRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZDViMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Tb21lR3JpZEltcGwuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUdyaWQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Tb21lIEdyaWQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU29tZUdyaWRJbXBsI2dldFJvd3MgPGVtPlJvd3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTb21lR3JpZEltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgU29tZUdyaWQgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvd3MoKSA8ZW0+Um93czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSb3dzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8R3JpZFJvdz4gcm93czsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTb21lR3JpZEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfR1JJRDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8R3JpZFJvdz4gZ2V0Um93cygpIHsKKwkJaWYgKHJvd3MgPT0gbnVsbCkgeworCQkJcm93cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxHcmlkUm93PihHcmlkUm93LmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUyk7CisJCX0KKwkJcmV0dXJuIHJvd3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJvd3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9HUklEX19ST1dTOgorCQkJCXJldHVybiBnZXRSb3dzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0dSSURfX1JPV1M6CisJCQkJZ2V0Um93cygpLmNsZWFyKCk7CisJCQkJZ2V0Um93cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JpZFJvdz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9HUklEX19ST1dTOgorCQkJCWdldFJvd3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfR1JJRF9fUk9XUzoKKwkJCQlyZXR1cm4gcm93cyAhPSBudWxsICYmICFyb3dzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vU29tZUdyaWRJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3R5bGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3R5bGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZDJmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9TdHlsZUltcGwuamF2YQpAQCAtMCwwICsxLDE4MDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEFsaWduRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vbml0RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRGb3JtYXQgPGVtPkZvcm1hdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0Rm9udCA8ZW0+Rm9udDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0QmFja2dyb3VuZGNvbG9yIDxlbT5CYWNrZ3JvdW5kY29sb3I8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUgPGVtPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldFRleHRjb2xvciA8ZW0+VGV4dGNvbG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRUZXh0YWxpZ24gPGVtPlRleHRhbGlnbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0Qm9yZGVyVG9wIDxlbT5Cb3JkZXIgVG9wPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRCb3JkZXJCb3R0b20gPGVtPkJvcmRlciBCb3R0b208L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldEJvcmRlckxlZnQgPGVtPkJvcmRlciBMZWZ0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRCb3JkZXJSaWdodCA8ZW0+Qm9yZGVyIFJpZ2h0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRQYWRkaW5nVG9wVmFsdWUgPGVtPlBhZGRpbmcgVG9wIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRQYWRkaW5nVG9wVW5pdCA8ZW0+UGFkZGluZyBUb3AgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0UGFkZGluZ0JvdHRvbVZhbHVlIDxlbT5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0UGFkZGluZ0JvdHRvbVVuaXQgPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldFBhZGRpbmdMZWZ0VmFsdWUgPGVtPlBhZGRpbmcgTGVmdCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0UGFkZGluZ0xlZnRVbml0IDxlbT5QYWRkaW5nIExlZnQgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0UGFkZGluZ1JpZ2h0VmFsdWUgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldFBhZGRpbmdSaWdodFVuaXQgPGVtPlBhZGRpbmcgUmlnaHQgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0TWFyZ2luVG9wVmFsdWUgPGVtPk1hcmdpbiBUb3AgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldE1hcmdpblRvcFVuaXQgPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0TWFyZ2luTGVmdFZhbHVlIDxlbT5NYXJnaW4gTGVmdCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0TWFyZ2luTGVmdFVuaXQgPGVtPk1hcmdpbiBMZWZ0IFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldE1hcmdpbkJvdHRvbVZhbHVlIDxlbT5NYXJnaW4gQm90dG9tIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlSW1wbCNnZXRNYXJnaW5Cb3R0b21Vbml0IDxlbT5NYXJnaW4gQm90dG9tIFVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuU3R5bGVJbXBsI2dldE1hcmdpblJpZ2h0VmFsdWUgPGVtPk1hcmdpbiBSaWdodCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0TWFyZ2luUmlnaHRVbml0IDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0RXh0ZW5kcyA8ZW0+RXh0ZW5kczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5TdHlsZUltcGwjZ2V0TWVkaWFzdHlsZXMgPGVtPk1lZGlhc3R5bGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3R5bGVJbXBsIGV4dGVuZHMgUmVwb3J0QmFzZUltcGwgaW1wbGVtZW50cyBTdHlsZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybWF0KCkgPGVtPkZvcm1hdDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU29tZUZvcm1hdCBmb3JtYXQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb250KCkgPGVtPkZvbnQ8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZvbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBGb250IGZvbnQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kY29sb3IoKSA8ZW0+QmFja2dyb3VuZGNvbG9yPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kY29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kY29sb3I7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCkgPGVtPkJhY2tncm91bmRjb2xvciBhbHRlcm5hdGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dGNvbG9yKCkgPGVtPlRleHRjb2xvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGV4dGNvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sb3IgdGV4dGNvbG9yOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHRhbGlnbigpIDxlbT5UZXh0YWxpZ248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRleHRhbGlnbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZXh0QWxpZ25FbnVtIFRFWFRBTElHTl9FREVGQVVMVCA9IFRleHRBbGlnbkVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHRhbGlnbigpIDxlbT5UZXh0YWxpZ248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRleHRhbGlnbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRleHRBbGlnbkVudW0gdGV4dGFsaWduID0gVEVYVEFMSUdOX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9yZGVyVG9wKCkgPGVtPkJvcmRlciBUb3A8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJvcmRlclRvcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvcmRlclN0eWxlIGJvcmRlclRvcDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvcmRlckJvdHRvbSgpIDxlbT5Cb3JkZXIgQm90dG9tPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3JkZXJCb3R0b20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb3JkZXJTdHlsZSBib3JkZXJCb3R0b207CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb3JkZXJMZWZ0KCkgPGVtPkJvcmRlciBMZWZ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCb3JkZXJMZWZ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9yZGVyU3R5bGUgYm9yZGVyTGVmdDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvcmRlclJpZ2h0KCkgPGVtPkJvcmRlciBSaWdodDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Qm9yZGVyUmlnaHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb3JkZXJTdHlsZSBib3JkZXJSaWdodDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nVG9wVmFsdWUoKSA8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdUb3BWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEFERElOR19UT1BfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nVG9wVmFsdWUoKSA8ZW0+UGFkZGluZyBUb3AgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdUb3BWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBwYWRkaW5nVG9wVmFsdWUgPSBQQURESU5HX1RPUF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nVG9wVW5pdCgpIDxlbT5QYWRkaW5nIFRvcCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nVG9wVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBQQURESU5HX1RPUF9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdUb3BVbml0KCkgPGVtPlBhZGRpbmcgVG9wIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdUb3BVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gcGFkZGluZ1RvcFVuaXQgPSBQQURESU5HX1RPUF9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdCb3R0b21WYWx1ZSgpIDxlbT5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ0JvdHRvbVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBQQURESU5HX0JPVFRPTV9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdCb3R0b21WYWx1ZSgpIDxlbT5QYWRkaW5nIEJvdHRvbSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ0JvdHRvbVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHBhZGRpbmdCb3R0b21WYWx1ZSA9IFBBRERJTkdfQk9UVE9NX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdCb3R0b21Vbml0KCkgPGVtPlBhZGRpbmcgQm90dG9tIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdCb3R0b21Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIFBBRERJTkdfQk9UVE9NX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKSA8ZW0+UGFkZGluZyBCb3R0b20gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBwYWRkaW5nQm90dG9tVW5pdCA9IFBBRERJTkdfQk9UVE9NX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0xlZnRWYWx1ZSgpIDxlbT5QYWRkaW5nIExlZnQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdMZWZ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIFBBRERJTkdfTEVGVF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdMZWZ0VmFsdWUoKSA8ZW0+UGFkZGluZyBMZWZ0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nTGVmdFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHBhZGRpbmdMZWZ0VmFsdWUgPSBQQURESU5HX0xFRlRfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0xlZnRVbml0KCkgPGVtPlBhZGRpbmcgTGVmdCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nTGVmdFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gUEFERElOR19MRUZUX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ0xlZnRVbml0KCkgPGVtPlBhZGRpbmcgTGVmdCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nTGVmdFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBwYWRkaW5nTGVmdFVuaXQgPSBQQURESU5HX0xFRlRfVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nUmlnaHRWYWx1ZSgpIDxlbT5QYWRkaW5nIFJpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYWRkaW5nUmlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgUEFERElOR19SSUdIVF9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZGRpbmdSaWdodFZhbHVlKCkgPGVtPlBhZGRpbmcgUmlnaHQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdSaWdodFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIHBhZGRpbmdSaWdodFZhbHVlID0gUEFERElOR19SSUdIVF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWRkaW5nUmlnaHRVbml0KCkgPGVtPlBhZGRpbmcgUmlnaHQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFkZGluZ1JpZ2h0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBQQURESU5HX1JJR0hUX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFkZGluZ1JpZ2h0VW5pdCgpIDxlbT5QYWRkaW5nIFJpZ2h0IFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhZGRpbmdSaWdodFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBwYWRkaW5nUmlnaHRVbml0ID0gUEFERElOR19SSUdIVF9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblRvcFZhbHVlKCkgPGVtPk1hcmdpbiBUb3AgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpblRvcFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVJHSU5fVE9QX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luVG9wVmFsdWUoKSA8ZW0+TWFyZ2luIFRvcCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luVG9wVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWFyZ2luVG9wVmFsdWUgPSBNQVJHSU5fVE9QX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblRvcFVuaXQoKSA8ZW0+TWFyZ2luIFRvcCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5Ub3BVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIE1BUkdJTl9UT1BfVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5Ub3BVbml0KCkgPGVtPk1hcmdpbiBUb3AgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luVG9wVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIG1hcmdpblRvcFVuaXQgPSBNQVJHSU5fVE9QX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luTGVmdFZhbHVlKCkgPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5MZWZ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIE1BUkdJTl9MRUZUX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luTGVmdFZhbHVlKCkgPGVtPk1hcmdpbiBMZWZ0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5MZWZ0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbWFyZ2luTGVmdFZhbHVlID0gTUFSR0lOX0xFRlRfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luTGVmdFVuaXQoKSA8ZW0+TWFyZ2luIExlZnQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luTGVmdFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5pdEVudW0gTUFSR0lOX0xFRlRfVU5JVF9FREVGQVVMVCA9IFVuaXRFbnVtLk5VTEw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5MZWZ0VW5pdCgpIDxlbT5NYXJnaW4gTGVmdCBVbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5MZWZ0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuaXRFbnVtIG1hcmdpbkxlZnRVbml0ID0gTUFSR0lOX0xFRlRfVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5Cb3R0b21WYWx1ZSgpIDxlbT5NYXJnaW4gQm90dG9tIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5Cb3R0b21WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFSR0lOX0JPVFRPTV9WQUxVRV9FREVGQVVMVCA9IDAuMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpbkJvdHRvbVZhbHVlKCkgPGVtPk1hcmdpbiBCb3R0b20gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkJvdHRvbVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIG1hcmdpbkJvdHRvbVZhbHVlID0gTUFSR0lOX0JPVFRPTV9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5Cb3R0b21Vbml0KCkgPGVtPk1hcmdpbiBCb3R0b20gVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luQm90dG9tVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVbml0RW51bSBNQVJHSU5fQk9UVE9NX1VOSVRfRURFRkFVTFQgPSBVbml0RW51bS5OVUxMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFyZ2luQm90dG9tVW5pdCgpIDxlbT5NYXJnaW4gQm90dG9tIFVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcmdpbkJvdHRvbVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBVbml0RW51bSBtYXJnaW5Cb3R0b21Vbml0ID0gTUFSR0lOX0JPVFRPTV9VTklUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblJpZ2h0VmFsdWUoKSA8ZW0+TWFyZ2luIFJpZ2h0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXJnaW5SaWdodFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBNQVJHSU5fUklHSFRfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXJnaW5SaWdodFZhbHVlKCkgPGVtPk1hcmdpbiBSaWdodCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBtYXJnaW5SaWdodFZhbHVlID0gTUFSR0lOX1JJR0hUX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblJpZ2h0VW5pdCgpIDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luUmlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVuaXRFbnVtIE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUID0gVW5pdEVudW0uTlVMTDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcmdpblJpZ2h0VW5pdCgpIDxlbT5NYXJnaW4gUmlnaHQgVW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFyZ2luUmlnaHRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVW5pdEVudW0gbWFyZ2luUmlnaHRVbml0ID0gTUFSR0lOX1JJR0hUX1VOSVRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRzKCkgPGVtPkV4dGVuZHM8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4dGVuZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBleHRlbmRzXzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lZGlhc3R5bGVzKCkgPGVtPk1lZGlhc3R5bGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1lZGlhc3R5bGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8TWVkaWFTdHlsZT4gbWVkaWFzdHlsZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TVFlMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU29tZUZvcm1hdCBnZXRGb3JtYXQoKSB7CisJCWlmIChmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEZvcm1hdCA9IChJbnRlcm5hbEVPYmplY3QpZm9ybWF0OworCQkJZm9ybWF0ID0gKFNvbWVGb3JtYXQpZVJlc29sdmVQcm94eShvbGRGb3JtYXQpOworCQkJaWYgKGZvcm1hdCAhPSBvbGRGb3JtYXQpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT1JNQVQsIG9sZEZvcm1hdCwgZm9ybWF0KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU29tZUZvcm1hdCBiYXNpY0dldEZvcm1hdCgpIHsKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb3JtYXQoU29tZUZvcm1hdCBuZXdGb3JtYXQpIHsKKwkJU29tZUZvcm1hdCBvbGRGb3JtYXQgPSBmb3JtYXQ7CisJCWZvcm1hdCA9IG5ld0Zvcm1hdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fRk9STUFULCBvbGRGb3JtYXQsIGZvcm1hdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGb250IGdldEZvbnQoKSB7CisJCWlmIChmb250ICE9IG51bGwgJiYgZm9udC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9udCA9IChJbnRlcm5hbEVPYmplY3QpZm9udDsKKwkJCWZvbnQgPSAoRm9udCllUmVzb2x2ZVByb3h5KG9sZEZvbnQpOworCQkJaWYgKGZvbnQgIT0gb2xkRm9udCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0ZPTlQsIG9sZEZvbnQsIGZvbnQpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZm9udDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRm9udCBiYXNpY0dldEZvbnQoKSB7CisJCXJldHVybiBmb250OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBuZXdGb250KSB7CisJCUZvbnQgb2xkRm9udCA9IGZvbnQ7CisJCWZvbnQgPSBuZXdGb250OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT05ULCBvbGRGb250LCBmb250KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGdldEJhY2tncm91bmRjb2xvcigpIHsKKwkJaWYgKGJhY2tncm91bmRjb2xvciAhPSBudWxsICYmIGJhY2tncm91bmRjb2xvci5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQmFja2dyb3VuZGNvbG9yID0gKEludGVybmFsRU9iamVjdCliYWNrZ3JvdW5kY29sb3I7CisJCQliYWNrZ3JvdW5kY29sb3IgPSAoQ29sb3IpZVJlc29sdmVQcm94eShvbGRCYWNrZ3JvdW5kY29sb3IpOworCQkJaWYgKGJhY2tncm91bmRjb2xvciAhPSBvbGRCYWNrZ3JvdW5kY29sb3IpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CQUNLR1JPVU5EQ09MT1IsIG9sZEJhY2tncm91bmRjb2xvciwgYmFja2dyb3VuZGNvbG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJhY2tncm91bmRjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgYmFzaWNHZXRCYWNrZ3JvdW5kY29sb3IoKSB7CisJCXJldHVybiBiYWNrZ3JvdW5kY29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZGNvbG9yKENvbG9yIG5ld0JhY2tncm91bmRjb2xvcikgeworCQlDb2xvciBvbGRCYWNrZ3JvdW5kY29sb3IgPSBiYWNrZ3JvdW5kY29sb3I7CisJCWJhY2tncm91bmRjb2xvciA9IG5ld0JhY2tncm91bmRjb2xvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SLCBvbGRCYWNrZ3JvdW5kY29sb3IsIGJhY2tncm91bmRjb2xvcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKCkgeworCQlpZiAoYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSAhPSBudWxsICYmIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUgPSAoSW50ZXJuYWxFT2JqZWN0KWJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU7CisJCQliYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlID0gKENvbG9yKWVSZXNvbHZlUHJveHkob2xkQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSk7CisJCQlpZiAoYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSAhPSBvbGRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURSwgb2xkQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSwgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBiYXNpY0dldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSB7CisJCXJldHVybiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoQ29sb3IgbmV3QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSkgeworCQlDb2xvciBvbGRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlID0gYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZTsKKwkJYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSA9IG5ld0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEUsIG9sZEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUsIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29sb3IgZ2V0VGV4dGNvbG9yKCkgeworCQlpZiAodGV4dGNvbG9yICE9IG51bGwgJiYgdGV4dGNvbG9yLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRUZXh0Y29sb3IgPSAoSW50ZXJuYWxFT2JqZWN0KXRleHRjb2xvcjsKKwkJCXRleHRjb2xvciA9IChDb2xvcillUmVzb2x2ZVByb3h5KG9sZFRleHRjb2xvcik7CisJCQlpZiAodGV4dGNvbG9yICE9IG9sZFRleHRjb2xvcikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRDT0xPUiwgb2xkVGV4dGNvbG9yLCB0ZXh0Y29sb3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGV4dGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBiYXNpY0dldFRleHRjb2xvcigpIHsKKwkJcmV0dXJuIHRleHRjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZXh0Y29sb3IoQ29sb3IgbmV3VGV4dGNvbG9yKSB7CisJCUNvbG9yIG9sZFRleHRjb2xvciA9IHRleHRjb2xvcjsKKwkJdGV4dGNvbG9yID0gbmV3VGV4dGNvbG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQ09MT1IsIG9sZFRleHRjb2xvciwgdGV4dGNvbG9yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRleHRBbGlnbkVudW0gZ2V0VGV4dGFsaWduKCkgeworCQlyZXR1cm4gdGV4dGFsaWduOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRleHRhbGlnbihUZXh0QWxpZ25FbnVtIG5ld1RleHRhbGlnbikgeworCQlUZXh0QWxpZ25FbnVtIG9sZFRleHRhbGlnbiA9IHRleHRhbGlnbjsKKwkJdGV4dGFsaWduID0gbmV3VGV4dGFsaWduID09IG51bGwgPyBURVhUQUxJR05fRURFRkFVTFQgOiBuZXdUZXh0YWxpZ247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRBTElHTiwgb2xkVGV4dGFsaWduLCB0ZXh0YWxpZ24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9yZGVyU3R5bGUgZ2V0Qm9yZGVyVG9wKCkgeworCQlyZXR1cm4gYm9yZGVyVG9wOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJvcmRlclRvcChCb3JkZXJTdHlsZSBuZXdCb3JkZXJUb3AsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQm9yZGVyU3R5bGUgb2xkQm9yZGVyVG9wID0gYm9yZGVyVG9wOworCQlib3JkZXJUb3AgPSBuZXdCb3JkZXJUb3A7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1AsIG9sZEJvcmRlclRvcCwgbmV3Qm9yZGVyVG9wKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3AoQm9yZGVyU3R5bGUgbmV3Qm9yZGVyVG9wKSB7CisJCWlmIChuZXdCb3JkZXJUb3AgIT0gYm9yZGVyVG9wKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChib3JkZXJUb3AgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYm9yZGVyVG9wKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1RPUCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Qm9yZGVyVG9wICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JvcmRlclRvcCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1AsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Qm9yZGVyVG9wKG5ld0JvcmRlclRvcCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfVE9QLCBuZXdCb3JkZXJUb3AsIG5ld0JvcmRlclRvcCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb3JkZXJTdHlsZSBnZXRCb3JkZXJCb3R0b20oKSB7CisJCXJldHVybiBib3JkZXJCb3R0b207CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Qm9yZGVyQm90dG9tKEJvcmRlclN0eWxlIG5ld0JvcmRlckJvdHRvbSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlCb3JkZXJTdHlsZSBvbGRCb3JkZXJCb3R0b20gPSBib3JkZXJCb3R0b207CisJCWJvcmRlckJvdHRvbSA9IG5ld0JvcmRlckJvdHRvbTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0JPVFRPTSwgb2xkQm9yZGVyQm90dG9tLCBuZXdCb3JkZXJCb3R0b20pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbShCb3JkZXJTdHlsZSBuZXdCb3JkZXJCb3R0b20pIHsKKwkJaWYgKG5ld0JvcmRlckJvdHRvbSAhPSBib3JkZXJCb3R0b20pIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGJvcmRlckJvdHRvbSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClib3JkZXJCb3R0b20pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdCb3JkZXJCb3R0b20gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Qm9yZGVyQm90dG9tKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0JPVFRPTSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRCb3JkZXJCb3R0b20obmV3Qm9yZGVyQm90dG9tLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9CT1RUT00sIG5ld0JvcmRlckJvdHRvbSwgbmV3Qm9yZGVyQm90dG9tKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvcmRlclN0eWxlIGdldEJvcmRlckxlZnQoKSB7CisJCXJldHVybiBib3JkZXJMZWZ0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJvcmRlckxlZnQoQm9yZGVyU3R5bGUgbmV3Qm9yZGVyTGVmdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlCb3JkZXJTdHlsZSBvbGRCb3JkZXJMZWZ0ID0gYm9yZGVyTGVmdDsKKwkJYm9yZGVyTGVmdCA9IG5ld0JvcmRlckxlZnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9MRUZULCBvbGRCb3JkZXJMZWZ0LCBuZXdCb3JkZXJMZWZ0KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0KEJvcmRlclN0eWxlIG5ld0JvcmRlckxlZnQpIHsKKwkJaWYgKG5ld0JvcmRlckxlZnQgIT0gYm9yZGVyTGVmdCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYm9yZGVyTGVmdCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClib3JkZXJMZWZ0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0JvcmRlckxlZnQgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Qm9yZGVyTGVmdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9MRUZULCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEJvcmRlckxlZnQobmV3Qm9yZGVyTGVmdCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfTEVGVCwgbmV3Qm9yZGVyTGVmdCwgbmV3Qm9yZGVyTGVmdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb3JkZXJTdHlsZSBnZXRCb3JkZXJSaWdodCgpIHsKKwkJcmV0dXJuIGJvcmRlclJpZ2h0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJvcmRlclJpZ2h0KEJvcmRlclN0eWxlIG5ld0JvcmRlclJpZ2h0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUJvcmRlclN0eWxlIG9sZEJvcmRlclJpZ2h0ID0gYm9yZGVyUmlnaHQ7CisJCWJvcmRlclJpZ2h0ID0gbmV3Qm9yZGVyUmlnaHQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9SSUdIVCwgb2xkQm9yZGVyUmlnaHQsIG5ld0JvcmRlclJpZ2h0KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodChCb3JkZXJTdHlsZSBuZXdCb3JkZXJSaWdodCkgeworCQlpZiAobmV3Qm9yZGVyUmlnaHQgIT0gYm9yZGVyUmlnaHQpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGJvcmRlclJpZ2h0ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJvcmRlclJpZ2h0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1JJR0hULCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdCb3JkZXJSaWdodCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCb3JkZXJSaWdodCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9SSUdIVCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRCb3JkZXJSaWdodChuZXdCb3JkZXJSaWdodCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfUklHSFQsIG5ld0JvcmRlclJpZ2h0LCBuZXdCb3JkZXJSaWdodCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UGFkZGluZ1RvcFZhbHVlKCkgeworCQlyZXR1cm4gcGFkZGluZ1RvcFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdUb3BWYWx1ZShkb3VibGUgbmV3UGFkZGluZ1RvcFZhbHVlKSB7CisJCWRvdWJsZSBvbGRQYWRkaW5nVG9wVmFsdWUgPSBwYWRkaW5nVG9wVmFsdWU7CisJCXBhZGRpbmdUb3BWYWx1ZSA9IG5ld1BhZGRpbmdUb3BWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19UT1BfVkFMVUUsIG9sZFBhZGRpbmdUb3BWYWx1ZSwgcGFkZGluZ1RvcFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldFBhZGRpbmdUb3BVbml0KCkgeworCQlyZXR1cm4gcGFkZGluZ1RvcFVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ1RvcFVuaXQoVW5pdEVudW0gbmV3UGFkZGluZ1RvcFVuaXQpIHsKKwkJVW5pdEVudW0gb2xkUGFkZGluZ1RvcFVuaXQgPSBwYWRkaW5nVG9wVW5pdDsKKwkJcGFkZGluZ1RvcFVuaXQgPSBuZXdQYWRkaW5nVG9wVW5pdCA9PSBudWxsID8gUEFERElOR19UT1BfVU5JVF9FREVGQVVMVCA6IG5ld1BhZGRpbmdUb3BVbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9VTklULCBvbGRQYWRkaW5nVG9wVW5pdCwgcGFkZGluZ1RvcFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldFBhZGRpbmdCb3R0b21WYWx1ZSgpIHsKKwkJcmV0dXJuIHBhZGRpbmdCb3R0b21WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nQm90dG9tVmFsdWUoZG91YmxlIG5ld1BhZGRpbmdCb3R0b21WYWx1ZSkgeworCQlkb3VibGUgb2xkUGFkZGluZ0JvdHRvbVZhbHVlID0gcGFkZGluZ0JvdHRvbVZhbHVlOworCQlwYWRkaW5nQm90dG9tVmFsdWUgPSBuZXdQYWRkaW5nQm90dG9tVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFLCBvbGRQYWRkaW5nQm90dG9tVmFsdWUsIHBhZGRpbmdCb3R0b21WYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRQYWRkaW5nQm90dG9tVW5pdCgpIHsKKwkJcmV0dXJuIHBhZGRpbmdCb3R0b21Vbml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdCb3R0b21Vbml0KFVuaXRFbnVtIG5ld1BhZGRpbmdCb3R0b21Vbml0KSB7CisJCVVuaXRFbnVtIG9sZFBhZGRpbmdCb3R0b21Vbml0ID0gcGFkZGluZ0JvdHRvbVVuaXQ7CisJCXBhZGRpbmdCb3R0b21Vbml0ID0gbmV3UGFkZGluZ0JvdHRvbVVuaXQgPT0gbnVsbCA/IFBBRERJTkdfQk9UVE9NX1VOSVRfRURFRkFVTFQgOiBuZXdQYWRkaW5nQm90dG9tVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVCwgb2xkUGFkZGluZ0JvdHRvbVVuaXQsIHBhZGRpbmdCb3R0b21Vbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRQYWRkaW5nTGVmdFZhbHVlKCkgeworCQlyZXR1cm4gcGFkZGluZ0xlZnRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nTGVmdFZhbHVlKGRvdWJsZSBuZXdQYWRkaW5nTGVmdFZhbHVlKSB7CisJCWRvdWJsZSBvbGRQYWRkaW5nTGVmdFZhbHVlID0gcGFkZGluZ0xlZnRWYWx1ZTsKKwkJcGFkZGluZ0xlZnRWYWx1ZSA9IG5ld1BhZGRpbmdMZWZ0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRSwgb2xkUGFkZGluZ0xlZnRWYWx1ZSwgcGFkZGluZ0xlZnRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRQYWRkaW5nTGVmdFVuaXQoKSB7CisJCXJldHVybiBwYWRkaW5nTGVmdFVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnRVbml0KFVuaXRFbnVtIG5ld1BhZGRpbmdMZWZ0VW5pdCkgeworCQlVbml0RW51bSBvbGRQYWRkaW5nTGVmdFVuaXQgPSBwYWRkaW5nTGVmdFVuaXQ7CisJCXBhZGRpbmdMZWZ0VW5pdCA9IG5ld1BhZGRpbmdMZWZ0VW5pdCA9PSBudWxsID8gUEFERElOR19MRUZUX1VOSVRfRURFRkFVTFQgOiBuZXdQYWRkaW5nTGVmdFVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9VTklULCBvbGRQYWRkaW5nTGVmdFVuaXQsIHBhZGRpbmdMZWZ0VW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0UGFkZGluZ1JpZ2h0VmFsdWUoKSB7CisJCXJldHVybiBwYWRkaW5nUmlnaHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHRWYWx1ZShkb3VibGUgbmV3UGFkZGluZ1JpZ2h0VmFsdWUpIHsKKwkJZG91YmxlIG9sZFBhZGRpbmdSaWdodFZhbHVlID0gcGFkZGluZ1JpZ2h0VmFsdWU7CisJCXBhZGRpbmdSaWdodFZhbHVlID0gbmV3UGFkZGluZ1JpZ2h0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUUsIG9sZFBhZGRpbmdSaWdodFZhbHVlLCBwYWRkaW5nUmlnaHRWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRQYWRkaW5nUmlnaHRVbml0KCkgeworCQlyZXR1cm4gcGFkZGluZ1JpZ2h0VW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHRVbml0KFVuaXRFbnVtIG5ld1BhZGRpbmdSaWdodFVuaXQpIHsKKwkJVW5pdEVudW0gb2xkUGFkZGluZ1JpZ2h0VW5pdCA9IHBhZGRpbmdSaWdodFVuaXQ7CisJCXBhZGRpbmdSaWdodFVuaXQgPSBuZXdQYWRkaW5nUmlnaHRVbml0ID09IG51bGwgPyBQQURESU5HX1JJR0hUX1VOSVRfRURFRkFVTFQgOiBuZXdQYWRkaW5nUmlnaHRVbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1JJR0hUX1VOSVQsIG9sZFBhZGRpbmdSaWdodFVuaXQsIHBhZGRpbmdSaWdodFVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1hcmdpblRvcFZhbHVlKCkgeworCQlyZXR1cm4gbWFyZ2luVG9wVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFyZ2luVG9wVmFsdWUoZG91YmxlIG5ld01hcmdpblRvcFZhbHVlKSB7CisJCWRvdWJsZSBvbGRNYXJnaW5Ub3BWYWx1ZSA9IG1hcmdpblRvcFZhbHVlOworCQltYXJnaW5Ub3BWYWx1ZSA9IG5ld01hcmdpblRvcFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1ZBTFVFLCBvbGRNYXJnaW5Ub3BWYWx1ZSwgbWFyZ2luVG9wVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0TWFyZ2luVG9wVW5pdCgpIHsKKwkJcmV0dXJuIG1hcmdpblRvcFVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFyZ2luVG9wVW5pdChVbml0RW51bSBuZXdNYXJnaW5Ub3BVbml0KSB7CisJCVVuaXRFbnVtIG9sZE1hcmdpblRvcFVuaXQgPSBtYXJnaW5Ub3BVbml0OworCQltYXJnaW5Ub3BVbml0ID0gbmV3TWFyZ2luVG9wVW5pdCA9PSBudWxsID8gTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUIDogbmV3TWFyZ2luVG9wVW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1RPUF9VTklULCBvbGRNYXJnaW5Ub3BVbml0LCBtYXJnaW5Ub3BVbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGRvdWJsZSBnZXRNYXJnaW5MZWZ0VmFsdWUoKSB7CisJCXJldHVybiBtYXJnaW5MZWZ0VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFyZ2luTGVmdFZhbHVlKGRvdWJsZSBuZXdNYXJnaW5MZWZ0VmFsdWUpIHsKKwkJZG91YmxlIG9sZE1hcmdpbkxlZnRWYWx1ZSA9IG1hcmdpbkxlZnRWYWx1ZTsKKwkJbWFyZ2luTGVmdFZhbHVlID0gbmV3TWFyZ2luTGVmdFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fTEVGVF9WQUxVRSwgb2xkTWFyZ2luTGVmdFZhbHVlLCBtYXJnaW5MZWZ0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVW5pdEVudW0gZ2V0TWFyZ2luTGVmdFVuaXQoKSB7CisJCXJldHVybiBtYXJnaW5MZWZ0VW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0VW5pdChVbml0RW51bSBuZXdNYXJnaW5MZWZ0VW5pdCkgeworCQlVbml0RW51bSBvbGRNYXJnaW5MZWZ0VW5pdCA9IG1hcmdpbkxlZnRVbml0OworCQltYXJnaW5MZWZ0VW5pdCA9IG5ld01hcmdpbkxlZnRVbml0ID09IG51bGwgPyBNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUIDogbmV3TWFyZ2luTGVmdFVuaXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQsIG9sZE1hcmdpbkxlZnRVbml0LCBtYXJnaW5MZWZ0VW5pdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TWFyZ2luQm90dG9tVmFsdWUoKSB7CisJCXJldHVybiBtYXJnaW5Cb3R0b21WYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Cb3R0b21WYWx1ZShkb3VibGUgbmV3TWFyZ2luQm90dG9tVmFsdWUpIHsKKwkJZG91YmxlIG9sZE1hcmdpbkJvdHRvbVZhbHVlID0gbWFyZ2luQm90dG9tVmFsdWU7CisJCW1hcmdpbkJvdHRvbVZhbHVlID0gbmV3TWFyZ2luQm90dG9tVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUUsIG9sZE1hcmdpbkJvdHRvbVZhbHVlLCBtYXJnaW5Cb3R0b21WYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbml0RW51bSBnZXRNYXJnaW5Cb3R0b21Vbml0KCkgeworCQlyZXR1cm4gbWFyZ2luQm90dG9tVW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Cb3R0b21Vbml0KFVuaXRFbnVtIG5ld01hcmdpbkJvdHRvbVVuaXQpIHsKKwkJVW5pdEVudW0gb2xkTWFyZ2luQm90dG9tVW5pdCA9IG1hcmdpbkJvdHRvbVVuaXQ7CisJCW1hcmdpbkJvdHRvbVVuaXQgPSBuZXdNYXJnaW5Cb3R0b21Vbml0ID09IG51bGwgPyBNQVJHSU5fQk9UVE9NX1VOSVRfRURFRkFVTFQgOiBuZXdNYXJnaW5Cb3R0b21Vbml0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fQk9UVE9NX1VOSVQsIG9sZE1hcmdpbkJvdHRvbVVuaXQsIG1hcmdpbkJvdHRvbVVuaXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldE1hcmdpblJpZ2h0VmFsdWUoKSB7CisJCXJldHVybiBtYXJnaW5SaWdodFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0VmFsdWUoZG91YmxlIG5ld01hcmdpblJpZ2h0VmFsdWUpIHsKKwkJZG91YmxlIG9sZE1hcmdpblJpZ2h0VmFsdWUgPSBtYXJnaW5SaWdodFZhbHVlOworCQltYXJnaW5SaWdodFZhbHVlID0gbmV3TWFyZ2luUmlnaHRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFLCBvbGRNYXJnaW5SaWdodFZhbHVlLCBtYXJnaW5SaWdodFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFVuaXRFbnVtIGdldE1hcmdpblJpZ2h0VW5pdCgpIHsKKwkJcmV0dXJuIG1hcmdpblJpZ2h0VW5pdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXJnaW5SaWdodFVuaXQoVW5pdEVudW0gbmV3TWFyZ2luUmlnaHRVbml0KSB7CisJCVVuaXRFbnVtIG9sZE1hcmdpblJpZ2h0VW5pdCA9IG1hcmdpblJpZ2h0VW5pdDsKKwkJbWFyZ2luUmlnaHRVbml0ID0gbmV3TWFyZ2luUmlnaHRVbml0ID09IG51bGwgPyBNQVJHSU5fUklHSFRfVU5JVF9FREVGQVVMVCA6IG5ld01hcmdpblJpZ2h0VW5pdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQsIG9sZE1hcmdpblJpZ2h0VW5pdCwgbWFyZ2luUmlnaHRVbml0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEV4dGVuZHMoKSB7CisJCWlmIChleHRlbmRzXyAhPSBudWxsICYmIGV4dGVuZHNfLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRFeHRlbmRzID0gKEludGVybmFsRU9iamVjdClleHRlbmRzXzsKKwkJCWV4dGVuZHNfID0gKFN0eWxlKWVSZXNvbHZlUHJveHkob2xkRXh0ZW5kcyk7CisJCQlpZiAoZXh0ZW5kc18gIT0gb2xkRXh0ZW5kcykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0VYVEVORFMsIG9sZEV4dGVuZHMsIGV4dGVuZHNfKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGV4dGVuZHNfOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldEV4dGVuZHMoKSB7CisJCXJldHVybiBleHRlbmRzXzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHRlbmRzKFN0eWxlIG5ld0V4dGVuZHMpIHsKKwkJU3R5bGUgb2xkRXh0ZW5kcyA9IGV4dGVuZHNfOworCQlleHRlbmRzXyA9IG5ld0V4dGVuZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0VYVEVORFMsIG9sZEV4dGVuZHMsIGV4dGVuZHNfKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PE1lZGlhU3R5bGU+IGdldE1lZGlhc3R5bGVzKCkgeworCQlpZiAobWVkaWFzdHlsZXMgPT0gbnVsbCkgeworCQkJbWVkaWFzdHlsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVkaWFTdHlsZT4oTWVkaWFTdHlsZS5jbGFzcywgdGhpcywgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUVESUFTVFlMRVMpOworCQl9CisJCXJldHVybiBtZWRpYXN0eWxlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1A6CisJCQkJcmV0dXJuIGJhc2ljU2V0Qm9yZGVyVG9wKG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXJldHVybiBiYXNpY1NldEJvcmRlckJvdHRvbShudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJcmV0dXJuIGJhc2ljU2V0Qm9yZGVyTGVmdChudWxsLCBtc2dzKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1JJR0hUOgorCQkJCXJldHVybiBiYXNpY1NldEJvcmRlclJpZ2h0KG51bGwsIG1zZ3MpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NRURJQVNUWUxFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1lZGlhc3R5bGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT1JNQVQ6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGb3JtYXQoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRGb3JtYXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fRk9OVDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZvbnQoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRGb250KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUjoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEJhY2tncm91bmRjb2xvcigpOworCQkJCXJldHVybiBiYXNpY0dldEJhY2tncm91bmRjb2xvcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CQUNLR1JPVU5EQ09MT1JfQUxURVJOQVRFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSgpOworCQkJCXJldHVybiBiYXNpY0dldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fVEVYVENPTE9SOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGV4dGNvbG9yKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VGV4dGNvbG9yKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRBTElHTjoKKwkJCQlyZXR1cm4gZ2V0VGV4dGFsaWduKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1A6CisJCQkJcmV0dXJuIGdldEJvcmRlclRvcCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXJldHVybiBnZXRCb3JkZXJCb3R0b20oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJcmV0dXJuIGdldEJvcmRlckxlZnQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1JJR0hUOgorCQkJCXJldHVybiBnZXRCb3JkZXJSaWdodCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0UGFkZGluZ1RvcFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6CisJCQkJcmV0dXJuIGdldFBhZGRpbmdUb3BVbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFOgorCQkJCXJldHVybiBnZXRQYWRkaW5nQm90dG9tVmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVDoKKwkJCQlyZXR1cm4gZ2V0UGFkZGluZ0JvdHRvbVVuaXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFOgorCQkJCXJldHVybiBnZXRQYWRkaW5nTGVmdFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUOgorCQkJCXJldHVybiBnZXRQYWRkaW5nTGVmdFVuaXQoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0UGFkZGluZ1JpZ2h0VmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOgorCQkJCXJldHVybiBnZXRQYWRkaW5nUmlnaHRVbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9UT1BfVkFMVUU6CisJCQkJcmV0dXJuIGdldE1hcmdpblRvcFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9UT1BfVU5JVDoKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luVG9wVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fTEVGVF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luTGVmdFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQ6CisJCQkJcmV0dXJuIGdldE1hcmdpbkxlZnRVbml0KCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUU6CisJCQkJcmV0dXJuIGdldE1hcmdpbkJvdHRvbVZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDoKKwkJCQlyZXR1cm4gZ2V0TWFyZ2luQm90dG9tVW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVkFMVUU6CisJCQkJcmV0dXJuIGdldE1hcmdpblJpZ2h0VmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQ6CisJCQkJcmV0dXJuIGdldE1hcmdpblJpZ2h0VW5pdCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19FWFRFTkRTOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RXh0ZW5kcygpOworCQkJCXJldHVybiBiYXNpY0dldEV4dGVuZHMoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUVESUFTVFlMRVM6CisJCQkJcmV0dXJuIGdldE1lZGlhc3R5bGVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fRk9STUFUOgorCQkJCXNldEZvcm1hdCgoU29tZUZvcm1hdCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT05UOgorCQkJCXNldEZvbnQoKEZvbnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SOgorCQkJCXNldEJhY2tncm91bmRjb2xvcigoQ29sb3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURToKKwkJCQlzZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKChDb2xvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQ09MT1I6CisJCQkJc2V0VGV4dGNvbG9yKChDb2xvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQUxJR046CisJCQkJc2V0VGV4dGFsaWduKChUZXh0QWxpZ25FbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1A6CisJCQkJc2V0Qm9yZGVyVG9wKChCb3JkZXJTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXNldEJvcmRlckJvdHRvbSgoQm9yZGVyU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJc2V0Qm9yZGVyTGVmdCgoQm9yZGVyU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1JJR0hUOgorCQkJCXNldEJvcmRlclJpZ2h0KChCb3JkZXJTdHlsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nVG9wVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9VTklUOgorCQkJCXNldFBhZGRpbmdUb3BVbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRToKKwkJCQlzZXRQYWRkaW5nQm90dG9tVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0JPVFRPTV9VTklUOgorCQkJCXNldFBhZGRpbmdCb3R0b21Vbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0xFRlRfVkFMVUU6CisJCQkJc2V0UGFkZGluZ0xlZnRWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUOgorCQkJCXNldFBhZGRpbmdMZWZ0VW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nUmlnaHRWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVDoKKwkJCQlzZXRQYWRkaW5nUmlnaHRVbml0KChVbml0RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1ZBTFVFOgorCQkJCXNldE1hcmdpblRvcFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1RPUF9VTklUOgorCQkJCXNldE1hcmdpblRvcFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFOgorCQkJCXNldE1hcmdpbkxlZnRWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQ6CisJCQkJc2V0TWFyZ2luTGVmdFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUU6CisJCQkJc2V0TWFyZ2luQm90dG9tVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fQk9UVE9NX1VOSVQ6CisJCQkJc2V0TWFyZ2luQm90dG9tVW5pdCgoVW5pdEVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOgorCQkJCXNldE1hcmdpblJpZ2h0VmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVU5JVDoKKwkJCQlzZXRNYXJnaW5SaWdodFVuaXQoKFVuaXRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0VYVEVORFM6CisJCQkJc2V0RXh0ZW5kcygoU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUVESUFTVFlMRVM6CisJCQkJZ2V0TWVkaWFzdHlsZXMoKS5jbGVhcigpOworCQkJCWdldE1lZGlhc3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZWRpYVN0eWxlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fRk9STUFUOgorCQkJCXNldEZvcm1hdCgoU29tZUZvcm1hdCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0ZPTlQ6CisJCQkJc2V0Rm9udCgoRm9udCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUjoKKwkJCQlzZXRCYWNrZ3JvdW5kY29sb3IoKENvbG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURToKKwkJCQlzZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlKChDb2xvciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRDT0xPUjoKKwkJCQlzZXRUZXh0Y29sb3IoKENvbG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fVEVYVEFMSUdOOgorCQkJCXNldFRleHRhbGlnbihURVhUQUxJR05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1RPUDoKKwkJCQlzZXRCb3JkZXJUb3AoKEJvcmRlclN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0JPVFRPTToKKwkJCQlzZXRCb3JkZXJCb3R0b20oKEJvcmRlclN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJc2V0Qm9yZGVyTGVmdCgoQm9yZGVyU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfUklHSFQ6CisJCQkJc2V0Qm9yZGVyUmlnaHQoKEJvcmRlclN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19UT1BfVkFMVUU6CisJCQkJc2V0UGFkZGluZ1RvcFZhbHVlKFBBRERJTkdfVE9QX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6CisJCQkJc2V0UGFkZGluZ1RvcFVuaXQoUEFERElOR19UT1BfVU5JVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRToKKwkJCQlzZXRQYWRkaW5nQm90dG9tVmFsdWUoUEFERElOR19CT1RUT01fVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVDoKKwkJCQlzZXRQYWRkaW5nQm90dG9tVW5pdChQQURESU5HX0JPVFRPTV9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nTGVmdFZhbHVlKFBBRERJTkdfTEVGVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0xFRlRfVU5JVDoKKwkJCQlzZXRQYWRkaW5nTGVmdFVuaXQoUEFERElOR19MRUZUX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRToKKwkJCQlzZXRQYWRkaW5nUmlnaHRWYWx1ZShQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVDoKKwkJCQlzZXRQYWRkaW5nUmlnaHRVbml0KFBBRERJTkdfUklHSFRfVU5JVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1ZBTFVFOgorCQkJCXNldE1hcmdpblRvcFZhbHVlKE1BUkdJTl9UT1BfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1RPUF9VTklUOgorCQkJCXNldE1hcmdpblRvcFVuaXQoTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFOgorCQkJCXNldE1hcmdpbkxlZnRWYWx1ZShNQVJHSU5fTEVGVF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fTEVGVF9VTklUOgorCQkJCXNldE1hcmdpbkxlZnRVbml0KE1BUkdJTl9MRUZUX1VOSVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX0JPVFRPTV9WQUxVRToKKwkJCQlzZXRNYXJnaW5Cb3R0b21WYWx1ZShNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDoKKwkJCQlzZXRNYXJnaW5Cb3R0b21Vbml0KE1BUkdJTl9CT1RUT01fVU5JVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVkFMVUU6CisJCQkJc2V0TWFyZ2luUmlnaHRWYWx1ZShNQVJHSU5fUklHSFRfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1VOSVQ6CisJCQkJc2V0TWFyZ2luUmlnaHRVbml0KE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0VYVEVORFM6CisJCQkJc2V0RXh0ZW5kcygoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NRURJQVNUWUxFUzoKKwkJCQlnZXRNZWRpYXN0eWxlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0ZPUk1BVDoKKwkJCQlyZXR1cm4gZm9ybWF0ICE9IG51bGw7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0ZPTlQ6CisJCQkJcmV0dXJuIGZvbnQgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SOgorCQkJCXJldHVybiBiYWNrZ3JvdW5kY29sb3IgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURToKKwkJCQlyZXR1cm4gYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZSAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQ09MT1I6CisJCQkJcmV0dXJuIHRleHRjb2xvciAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQUxJR046CisJCQkJcmV0dXJuIHRleHRhbGlnbiAhPSBURVhUQUxJR05fRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1A6CisJCQkJcmV0dXJuIGJvcmRlclRvcCAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NOgorCQkJCXJldHVybiBib3JkZXJCb3R0b20gIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0xFRlQ6CisJCQkJcmV0dXJuIGJvcmRlckxlZnQgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX1JJR0hUOgorCQkJCXJldHVybiBib3JkZXJSaWdodCAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9WQUxVRToKKwkJCQlyZXR1cm4gcGFkZGluZ1RvcFZhbHVlICE9IFBBRERJTkdfVE9QX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9VTklUOgorCQkJCXJldHVybiBwYWRkaW5nVG9wVW5pdCAhPSBQQURESU5HX1RPUF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRToKKwkJCQlyZXR1cm4gcGFkZGluZ0JvdHRvbVZhbHVlICE9IFBBRERJTkdfQk9UVE9NX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0JPVFRPTV9VTklUOgorCQkJCXJldHVybiBwYWRkaW5nQm90dG9tVW5pdCAhPSBQQURESU5HX0JPVFRPTV9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0xFRlRfVkFMVUU6CisJCQkJcmV0dXJuIHBhZGRpbmdMZWZ0VmFsdWUgIT0gUEFERElOR19MRUZUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0xFRlRfVU5JVDoKKwkJCQlyZXR1cm4gcGFkZGluZ0xlZnRVbml0ICE9IFBBRERJTkdfTEVGVF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1JJR0hUX1ZBTFVFOgorCQkJCXJldHVybiBwYWRkaW5nUmlnaHRWYWx1ZSAhPSBQQURESU5HX1JJR0hUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1JJR0hUX1VOSVQ6CisJCQkJcmV0dXJuIHBhZGRpbmdSaWdodFVuaXQgIT0gUEFERElOR19SSUdIVF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1ZBTFVFOgorCQkJCXJldHVybiBtYXJnaW5Ub3BWYWx1ZSAhPSBNQVJHSU5fVE9QX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1VOSVQ6CisJCQkJcmV0dXJuIG1hcmdpblRvcFVuaXQgIT0gTUFSR0lOX1RPUF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fTEVGVF9WQUxVRToKKwkJCQlyZXR1cm4gbWFyZ2luTGVmdFZhbHVlICE9IE1BUkdJTl9MRUZUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fTEVGVF9VTklUOgorCQkJCXJldHVybiBtYXJnaW5MZWZ0VW5pdCAhPSBNQVJHSU5fTEVGVF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFOgorCQkJCXJldHVybiBtYXJnaW5Cb3R0b21WYWx1ZSAhPSBNQVJHSU5fQk9UVE9NX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fQk9UVE9NX1VOSVQ6CisJCQkJcmV0dXJuIG1hcmdpbkJvdHRvbVVuaXQgIT0gTUFSR0lOX0JPVFRPTV9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVkFMVUU6CisJCQkJcmV0dXJuIG1hcmdpblJpZ2h0VmFsdWUgIT0gTUFSR0lOX1JJR0hUX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVU5JVDoKKwkJCQlyZXR1cm4gbWFyZ2luUmlnaHRVbml0ICE9IE1BUkdJTl9SSUdIVF9VTklUX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19FWFRFTkRTOgorCQkJCXJldHVybiBleHRlbmRzXyAhPSBudWxsOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NRURJQVNUWUxFUzoKKwkJCQlyZXR1cm4gbWVkaWFzdHlsZXMgIT0gbnVsbCAmJiAhbWVkaWFzdHlsZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7CisJCWlmIChiYXNlQ2xhc3MgPT0gQmFzZVN0eWxlLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0ZPUk1BVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9STUFUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fRk9OVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fRk9OVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQkFDS0dST1VORENPTE9SOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQkFDS0dST1VORENPTE9SX0FMVEVSTkFURTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRDT0xPUjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fVEVYVENPTE9SOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fVEVYVEFMSUdOOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19URVhUQUxJR047CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfVE9QOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfVE9QOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fQk9SREVSX0JPVFRPTTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX0JPVFRPTTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9MRUZUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9SSUdIVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1JJR0hUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19UT1BfVkFMVUU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19UT1BfVU5JVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19UT1BfVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfQk9UVE9NX1VOSVQ7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX0xFRlRfVkFMVUU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfTEVGVF9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0xFRlRfVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVkFMVUU7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1JJR0hUX1VOSVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfUklHSFRfVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9UT1BfVkFMVUU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVkFMVUU7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fVE9QX1VOSVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9UT1BfVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9MRUZUX1VOSVQ7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX0JPVFRPTV9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fQk9UVE9NX1VOSVQ7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19NQVJHSU5fUklHSFRfVkFMVUU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9SSUdIVF9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9SSUdIVF9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVU5JVDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKKwkJaWYgKGJhc2VDbGFzcyA9PSBCYXNlU3R5bGUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19GT1JNQVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT1JNQVQ7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0ZPTlQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19GT05UOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CQUNLR1JPVU5EQ09MT1I6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CQUNLR1JPVU5EQ09MT1I7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JBQ0tHUk9VTkRDT0xPUl9BTFRFUk5BVEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CQUNLR1JPVU5EQ09MT1JfQUxURVJOQVRFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19URVhUQ09MT1I6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19URVhUQ09MT1I7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1RFWFRBTElHTjogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1RFWFRBTElHTjsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fQk9SREVSX1RPUDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9UT1A7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX0JPUkRFUl9CT1RUT006IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfQk9UVE9NOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfTEVGVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX0JPUkRFUl9MRUZUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19CT1JERVJfUklHSFQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19CT1JERVJfUklHSFQ7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19UT1BfVkFMVUU7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX1BBRERJTkdfVE9QX1VOSVQ6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLlNUWUxFX19QQURESU5HX1RPUF9VTklUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9WQUxVRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfQk9UVE9NX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0JPVFRPTV9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19CT1RUT01fVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19MRUZUX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX0xFRlRfVU5JVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX1BBRERJTkdfTEVGVF9VTklUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19QQURESU5HX1JJR0hUX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fUEFERElOR19SSUdIVF9VTklUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fVE9QX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1RPUF9WQUxVRTsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1RPUF9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1RPUF9VTklUOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9WQUxVRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9MRUZUX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fTEVGVF9VTklUOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX0xFRlRfVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX0JPVFRPTV9WQUxVRTogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVkFMVUU7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkJBU0VfU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9CT1RUT01fVU5JVDsKKwkJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQkFTRV9TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5TVFlMRV9fTUFSR0lOX1JJR0hUX1ZBTFVFOworCQkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFX19NQVJHSU5fUklHSFRfVU5JVDogcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVfX01BUkdJTl9SSUdIVF9VTklUOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRleHRhbGlnbjogIik7CisJCXJlc3VsdC5hcHBlbmQodGV4dGFsaWduKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nVG9wVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdUb3BWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGFkZGluZ1RvcFVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdUb3BVbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nQm90dG9tVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdCb3R0b21WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGFkZGluZ0JvdHRvbVVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdCb3R0b21Vbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nTGVmdFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwYWRkaW5nTGVmdFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nTGVmdFVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdMZWZ0VW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGFkZGluZ1JpZ2h0VmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHBhZGRpbmdSaWdodFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYWRkaW5nUmlnaHRVbml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwYWRkaW5nUmlnaHRVbml0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJnaW5Ub3BWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luVG9wVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcmdpblRvcFVuaXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1hcmdpblRvcFVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcmdpbkxlZnRWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luTGVmdFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXJnaW5MZWZ0VW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luTGVmdFVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcmdpbkJvdHRvbVZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5Cb3R0b21WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luQm90dG9tVW5pdDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luQm90dG9tVW5pdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luUmlnaHRWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobWFyZ2luUmlnaHRWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFyZ2luUmlnaHRVbml0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXJnaW5SaWdodFVuaXQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9TdHlsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9TdHlsZXNJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3R5bGVzSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjcwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3R5bGVzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3R5bGVzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlN0eWxlc0ltcGwjZ2V0U3R5bGVzIDxlbT5TdHlsZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdHlsZXNJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFN0eWxlcyB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGVzKCkgPGVtPlN0eWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHlsZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTdHlsZT4gc3R5bGVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN0eWxlc0ltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNUWUxFUzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U3R5bGU+IGdldFN0eWxlcygpIHsKKwkJaWYgKHN0eWxlcyA9PSBudWxsKSB7CisJCQlzdHlsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3R5bGU+KFN0eWxlLmNsYXNzLCB0aGlzLCBSZXBvcnREU0xQYWNrYWdlLlNUWUxFU19fU1RZTEVTKTsKKwkJfQorCQlyZXR1cm4gc3R5bGVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRVNfX1NUWUxFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0eWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRVNfX1NUWUxFUzoKKwkJCQlyZXR1cm4gZ2V0U3R5bGVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRVNfX1NUWUxFUzoKKwkJCQlnZXRTdHlsZXMoKS5jbGVhcigpOworCQkJCWdldFN0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3R5bGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFU19fU1RZTEVTOgorCQkJCWdldFN0eWxlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVTX19TVFlMRVM6CisJCQkJcmV0dXJuIHN0eWxlcyAhPSBudWxsICYmICFzdHlsZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9TdHlsZXNJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3ViU3ViVGl0bGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvU3ViU3ViVGl0bGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmNmIxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9TdWJTdWJUaXRsZUltcGwuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJTdWJUaXRsZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN1YiBTdWIgVGl0bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJTdWJUaXRsZUltcGwgZXh0ZW5kcyBUZXh0RWxlbWVudEltcGwgaW1wbGVtZW50cyBTdWJTdWJUaXRsZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFN1YlN1YlRpdGxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU1VCX1NVQl9USVRMRTsKKwl9CisKK30gLy9TdWJTdWJUaXRsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9TdWJUaXRsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9TdWJUaXRsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U5NTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1N1YlRpdGxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3ViIFRpdGxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgU3ViVGl0bGVJbXBsIGV4dGVuZHMgVGV4dEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU3ViVGl0bGUgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdWJUaXRsZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNVQl9USVRMRTsKKwl9CisKK30gLy9TdWJUaXRsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZUFnZ3JlZ2F0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlQWdncmVnYXRpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkMWFiZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZUFnZ3JlZ2F0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBBZ2dyZWdhdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUFnZ3JlZ2F0aW9uSW1wbCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQWdncmVnYXRpb25JbXBsI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUFnZ3JlZ2F0aW9uSW1wbCNnZXRPbkdyb3VwIDxlbT5PbiBHcm91cDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlQWdncmVnYXRpb25JbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFRhYmxlQWdncmVnYXRpb24geworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRleHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHRleHQgPSBURVhUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWdncmVnYXRpb24oKSA8ZW0+QWdncmVnYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVCYXNlQWdncmVnYXRpb24gYWdncmVnYXRpb247CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPbkdyb3VwKCkgPGVtPk9uIEdyb3VwPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPbkdyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRUYWJsZUdyb3VwIG9uR3JvdXA7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVBZ2dyZWdhdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0FHR1JFR0FUSU9OOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJcmV0dXJuIHRleHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgeworCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQ7CisJCXRleHQgPSBuZXdUZXh0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0FHR1JFR0FUSU9OX19URVhULCBvbGRUZXh0LCB0ZXh0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIGdldEFnZ3JlZ2F0aW9uKCkgeworCQlyZXR1cm4gYWdncmVnYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWdncmVnYXRpb24oVGFibGVCYXNlQWdncmVnYXRpb24gbmV3QWdncmVnYXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJVGFibGVCYXNlQWdncmVnYXRpb24gb2xkQWdncmVnYXRpb24gPSBhZ2dyZWdhdGlvbjsKKwkJYWdncmVnYXRpb24gPSBuZXdBZ2dyZWdhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04sIG9sZEFnZ3JlZ2F0aW9uLCBuZXdBZ2dyZWdhdGlvbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWdncmVnYXRpb24oVGFibGVCYXNlQWdncmVnYXRpb24gbmV3QWdncmVnYXRpb24pIHsKKwkJaWYgKG5ld0FnZ3JlZ2F0aW9uICE9IGFnZ3JlZ2F0aW9uKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhZ2dyZWdhdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhZ2dyZWdhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBZ2dyZWdhdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBZ2dyZWdhdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFnZ3JlZ2F0aW9uKG5ld0FnZ3JlZ2F0aW9uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OLCBuZXdBZ2dyZWdhdGlvbiwgbmV3QWdncmVnYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZUdyb3VwIGdldE9uR3JvdXAoKSB7CisJCWlmIChvbkdyb3VwICE9IG51bGwgJiYgb25Hcm91cC5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkT25Hcm91cCA9IChJbnRlcm5hbEVPYmplY3Qpb25Hcm91cDsKKwkJCW9uR3JvdXAgPSAoRGF0YW1hcnRUYWJsZUdyb3VwKWVSZXNvbHZlUHJveHkob2xkT25Hcm91cCk7CisJCQlpZiAob25Hcm91cCAhPSBvbGRPbkdyb3VwKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fT05fR1JPVVAsIG9sZE9uR3JvdXAsIG9uR3JvdXApKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gb25Hcm91cDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnRUYWJsZUdyb3VwIGJhc2ljR2V0T25Hcm91cCgpIHsKKwkJcmV0dXJuIG9uR3JvdXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T25Hcm91cChEYXRhbWFydFRhYmxlR3JvdXAgbmV3T25Hcm91cCkgeworCQlEYXRhbWFydFRhYmxlR3JvdXAgb2xkT25Hcm91cCA9IG9uR3JvdXA7CisJCW9uR3JvdXAgPSBuZXdPbkdyb3VwOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0FHR1JFR0FUSU9OX19PTl9HUk9VUCwgb2xkT25Hcm91cCwgb25Hcm91cCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT046CisJCQkJcmV0dXJuIGJhc2ljU2V0QWdncmVnYXRpb24obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fVEVYVDoKKwkJCQlyZXR1cm4gZ2V0VGV4dCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlyZXR1cm4gZ2V0QWdncmVnYXRpb24oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fT05fR1JPVVA6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRPbkdyb3VwKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0T25Hcm91cCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX1RFWFQ6CisJCQkJc2V0VGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXNldEFnZ3JlZ2F0aW9uKChUYWJsZUJhc2VBZ2dyZWdhdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0FHR1JFR0FUSU9OX19PTl9HUk9VUDoKKwkJCQlzZXRPbkdyb3VwKChEYXRhbWFydFRhYmxlR3JvdXApbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX1RFWFQ6CisJCQkJc2V0VGV4dChURVhUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXNldEFnZ3JlZ2F0aW9uKChUYWJsZUJhc2VBZ2dyZWdhdGlvbiludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT05fX09OX0dST1VQOgorCQkJCXNldE9uR3JvdXAoKERhdGFtYXJ0VGFibGVHcm91cCludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fVEVYVDoKKwkJCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQuZXF1YWxzKHRleHQpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlyZXR1cm4gYWdncmVnYXRpb24gIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTl9fT05fR1JPVVA6CisJCQkJcmV0dXJuIG9uR3JvdXAgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRleHQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRleHQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UYWJsZUFnZ3JlZ2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjI1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVCYXNlQWdncmVnYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCYXNlQWdncmVnYXRpb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbCNnZXRWYWx1ZVJlZnMgPGVtPlZhbHVlIFJlZnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZUJhc2VBZ2dyZWdhdGlvbkltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVGFibGVCYXNlQWdncmVnYXRpb24geworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUmVmcygpIDxlbT5WYWx1ZSBSZWZzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlUmVmcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IHZhbHVlUmVmczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZUJhc2VBZ2dyZWdhdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0JBU0VfQUdHUkVHQVRJT047CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IGdldFZhbHVlUmVmcygpIHsKKwkJaWYgKHZhbHVlUmVmcyA9PSBudWxsKSB7CisJCQl2YWx1ZVJlZnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PERhdGFtYXJ0UHJvcGVydHk+KERhdGFtYXJ0UHJvcGVydHkuY2xhc3MsIHRoaXMsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUyk7CisJCX0KKwkJcmV0dXJuIHZhbHVlUmVmczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0VmFsdWVSZWZzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CQVNFX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTOgorCQkJCWdldFZhbHVlUmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0VmFsdWVSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhbWFydFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CQVNFX0FHR1JFR0FUSU9OX19WQUxVRV9SRUZTOgorCQkJCWdldFZhbHVlUmVmcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQkFTRV9BR0dSRUdBVElPTl9fVkFMVUVfUkVGUzoKKwkJCQlyZXR1cm4gdmFsdWVSZWZzICE9IG51bGwgJiYgIXZhbHVlUmVmcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThjZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgQmluYXJ5IEFnZ3JlZ2F0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsIGV4dGVuZHMgVGFibGVCYXNlQWdncmVnYXRpb25JbXBsIGltcGxlbWVudHMgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFnZ3JlZ2F0aW9uKCkgPGVtPkFnZ3JlZ2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIEFHR1JFR0FUSU9OX0VERUZBVUxUID0gQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bS5ESVY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGlvbigpIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIGFnZ3JlZ2F0aW9uID0gQUdHUkVHQVRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSBnZXRBZ2dyZWdhdGlvbigpIHsKKwkJcmV0dXJuIGFnZ3JlZ2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFnZ3JlZ2F0aW9uKEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gbmV3QWdncmVnYXRpb24pIHsKKwkJQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSBvbGRBZ2dyZWdhdGlvbiA9IGFnZ3JlZ2F0aW9uOworCQlhZ2dyZWdhdGlvbiA9IG5ld0FnZ3JlZ2F0aW9uID09IG51bGwgPyBBR0dSRUdBVElPTl9FREVGQVVMVCA6IG5ld0FnZ3JlZ2F0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT04sIG9sZEFnZ3JlZ2F0aW9uLCBhZ2dyZWdhdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CSU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXJldHVybiBnZXRBZ2dyZWdhdGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQklOQVJZX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlzZXRBZ2dyZWdhdGlvbigoQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CSU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXNldEFnZ3JlZ2F0aW9uKEFHR1JFR0FUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CSU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXJldHVybiBhZ2dyZWdhdGlvbiAhPSBBR0dSRUdBVElPTl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGFnZ3JlZ2F0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhZ2dyZWdhdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlQmluYXJ5QWdncmVnYXRpb25JbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVDZWxsQ29sb3JJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVDZWxsQ29sb3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZUNlbGxDb2xvckltcGwuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQ2VsbENvbG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgQ2VsbCBDb2xvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUNlbGxDb2xvckltcGwjZ2V0Q29sb3IgPGVtPkNvbG9yPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVDZWxsQ29sb3JJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFRhYmxlQ2VsbENvbG9yIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xvcigpIDxlbT5Db2xvcjwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZUNlbGxDb2xvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0NFTExfQ09MT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGdldENvbG9yKCkgeworCQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvci5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29sb3IgPSAoSW50ZXJuYWxFT2JqZWN0KWNvbG9yOworCQkJY29sb3IgPSAoQ29sb3IpZVJlc29sdmVQcm94eShvbGRDb2xvcik7CisJCQlpZiAoY29sb3IgIT0gb2xkQ29sb3IpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0NFTExfQ09MT1JfX0NPTE9SLCBvbGRDb2xvciwgY29sb3IpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbG9yIGJhc2ljR2V0Q29sb3IoKSB7CisJCXJldHVybiBjb2xvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBuZXdDb2xvcikgeworCQlDb2xvciBvbGRDb2xvciA9IGNvbG9yOworCQljb2xvciA9IG5ld0NvbG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0NFTExfQ09MT1JfX0NPTE9SLCBvbGRDb2xvciwgY29sb3IpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQ0VMTF9DT0xPUl9fQ09MT1I6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDb2xvcigpOworCQkJCXJldHVybiBiYXNpY0dldENvbG9yKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9DRUxMX0NPTE9SX19DT0xPUjoKKwkJCQlzZXRDb2xvcigoQ29sb3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQ0VMTF9DT0xPUl9fQ09MT1I6CisJCQkJc2V0Q29sb3IoKENvbG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0NFTExfQ09MT1JfX0NPTE9SOgorCQkJCXJldHVybiBjb2xvciAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9UYWJsZUNlbGxDb2xvckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZURhdGVEYXlJbnRlcnZhbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZURhdGVEYXlJbnRlcnZhbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M2MTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlRGF0ZURheUludGVydmFsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5SW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBEYXRlIERheSBJbnRlcnZhbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZURhdGVEYXlJbnRlcnZhbEltcGwjZ2V0RGF0ZUludGVydmFsVmFsdWUgPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVEYXRlRGF5SW50ZXJ2YWxJbXBsI2dldERhdGVSYW5nZSA8ZW0+RGF0ZSBSYW5nZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlRGF0ZURheUludGVydmFsSW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUYWJsZURhdGVEYXlJbnRlcnZhbCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGVJbnRlcnZhbFZhbHVlKCkgPGVtPkRhdGUgSW50ZXJ2YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGVJbnRlcnZhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBEQVRFX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0ZUludGVydmFsVmFsdWUoKSA8ZW0+RGF0ZSBJbnRlcnZhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF0ZUludGVydmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgZGF0ZUludGVydmFsVmFsdWUgPSBEQVRFX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0ZVJhbmdlKCkgPGVtPkRhdGUgUmFuZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGVSYW5nZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlUmFuZ2VFbGVtZW50IGRhdGVSYW5nZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZURhdGVEYXlJbnRlcnZhbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RGF0ZUludGVydmFsVmFsdWUoKSB7CisJCXJldHVybiBkYXRlSW50ZXJ2YWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRlSW50ZXJ2YWxWYWx1ZShkb3VibGUgbmV3RGF0ZUludGVydmFsVmFsdWUpIHsKKwkJZG91YmxlIG9sZERhdGVJbnRlcnZhbFZhbHVlID0gZGF0ZUludGVydmFsVmFsdWU7CisJCWRhdGVJbnRlcnZhbFZhbHVlID0gbmV3RGF0ZUludGVydmFsVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfSU5URVJWQUxfVkFMVUUsIG9sZERhdGVJbnRlcnZhbFZhbHVlLCBkYXRlSW50ZXJ2YWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVJhbmdlRWxlbWVudCBnZXREYXRlUmFuZ2UoKSB7CisJCXJldHVybiBkYXRlUmFuZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGF0ZVJhbmdlKFRhYmxlUmFuZ2VFbGVtZW50IG5ld0RhdGVSYW5nZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlUYWJsZVJhbmdlRWxlbWVudCBvbGREYXRlUmFuZ2UgPSBkYXRlUmFuZ2U7CisJCWRhdGVSYW5nZSA9IG5ld0RhdGVSYW5nZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9SQU5HRSwgb2xkRGF0ZVJhbmdlLCBuZXdEYXRlUmFuZ2UpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGVSYW5nZShUYWJsZVJhbmdlRWxlbWVudCBuZXdEYXRlUmFuZ2UpIHsKKwkJaWYgKG5ld0RhdGVSYW5nZSAhPSBkYXRlUmFuZ2UpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGRhdGVSYW5nZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkYXRlUmFuZ2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEYXRlUmFuZ2UgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGF0ZVJhbmdlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9SQU5HRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREYXRlUmFuZ2UobmV3RGF0ZVJhbmdlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfUkFOR0UsIG5ld0RhdGVSYW5nZSwgbmV3RGF0ZVJhbmdlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFOgorCQkJCXJldHVybiBiYXNpY1NldERhdGVSYW5nZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX0lOVEVSVkFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXREYXRlSW50ZXJ2YWxWYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFOgorCQkJCXJldHVybiBnZXREYXRlUmFuZ2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX0lOVEVSVkFMX1ZBTFVFOgorCQkJCXNldERhdGVJbnRlcnZhbFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9SQU5HRToKKwkJCQlzZXREYXRlUmFuZ2UoKFRhYmxlUmFuZ2VFbGVtZW50KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX0lOVEVSVkFMX1ZBTFVFOgorCQkJCXNldERhdGVJbnRlcnZhbFZhbHVlKERBVEVfSU5URVJWQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTF9fREFURV9SQU5HRToKKwkJCQlzZXREYXRlUmFuZ2UoKFRhYmxlUmFuZ2VFbGVtZW50KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX0lOVEVSVkFMX1ZBTFVFOgorCQkJCXJldHVybiBkYXRlSW50ZXJ2YWxWYWx1ZSAhPSBEQVRFX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFOgorCQkJCXJldHVybiBkYXRlUmFuZ2UgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGVJbnRlcnZhbFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkYXRlSW50ZXJ2YWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlRGF0ZURheUludGVydmFsSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlRGF0ZURheUxvb2t1cEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZURhdGVEYXlMb29rdXBJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhOWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZURhdGVEYXlMb29rdXBJbXBsLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVSYW5nZUVsZW1lbnQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBEYXRlIERheSBMb29rdXA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVEYXRlRGF5TG9va3VwSW1wbCNnZXRMb29rdXBWYWx1ZSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlRGF0ZURheUxvb2t1cEltcGwjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVEYXRlRGF5TG9va3VwSW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUYWJsZURhdGVEYXlMb29rdXAgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBWYWx1ZSgpIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBMT09LVVBfVkFMVUVfRURFRkFVTFQgPSAwLjA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBWYWx1ZSgpIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGxvb2t1cFZhbHVlID0gTE9PS1VQX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JldGUoKSA8ZW0+RGlzY3JldGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERpc2NyZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVSYW5nZUVsZW1lbnQgZGlzY3JldGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVEYXRlRGF5TG9va3VwSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfREFURV9EQVlfTE9PS1VQOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TG9va3VwVmFsdWUoKSB7CisJCXJldHVybiBsb29rdXBWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb29rdXBWYWx1ZShkb3VibGUgbmV3TG9va3VwVmFsdWUpIHsKKwkJZG91YmxlIG9sZExvb2t1cFZhbHVlID0gbG9va3VwVmFsdWU7CisJCWxvb2t1cFZhbHVlID0gbmV3TG9va3VwVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQX19MT09LVVBfVkFMVUUsIG9sZExvb2t1cFZhbHVlLCBsb29rdXBWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUYWJsZVJhbmdlRWxlbWVudCBnZXREaXNjcmV0ZSgpIHsKKwkJcmV0dXJuIGRpc2NyZXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50IG5ld0Rpc2NyZXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCVRhYmxlUmFuZ2VFbGVtZW50IG9sZERpc2NyZXRlID0gZGlzY3JldGU7CisJCWRpc2NyZXRlID0gbmV3RGlzY3JldGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQX19ESVNDUkVURSwgb2xkRGlzY3JldGUsIG5ld0Rpc2NyZXRlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNjcmV0ZShUYWJsZVJhbmdlRWxlbWVudCBuZXdEaXNjcmV0ZSkgeworCQlpZiAobmV3RGlzY3JldGUgIT0gZGlzY3JldGUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGRpc2NyZXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc2NyZXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEaXNjcmV0ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNjcmV0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQX19ESVNDUkVURSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXREaXNjcmV0ZShuZXdEaXNjcmV0ZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0xPT0tVUF9fRElTQ1JFVEUsIG5ld0Rpc2NyZXRlLCBuZXdEaXNjcmV0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFOgorCQkJCXJldHVybiBiYXNpY1NldERpc2NyZXRlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQX19MT09LVVBfVkFMVUU6CisJCQkJcmV0dXJuIGdldExvb2t1cFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQX19ESVNDUkVURToKKwkJCQlyZXR1cm4gZ2V0RGlzY3JldGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0xPT0tVUF9fTE9PS1VQX1ZBTFVFOgorCQkJCXNldExvb2t1cFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFOgorCQkJCXNldERpc2NyZXRlKChUYWJsZVJhbmdlRWxlbWVudCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0xPT0tVUF9WQUxVRToKKwkJCQlzZXRMb29rdXBWYWx1ZShMT09LVVBfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFOgorCQkJCXNldERpc2NyZXRlKChUYWJsZVJhbmdlRWxlbWVudCludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0xPT0tVUF9WQUxVRToKKwkJCQlyZXR1cm4gbG9va3VwVmFsdWUgIT0gTE9PS1VQX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0RBVEVfREFZX0xPT0tVUF9fRElTQ1JFVEU6CisJCQkJcmV0dXJuIGRpc2NyZXRlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb29rdXBWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobG9va3VwVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UYWJsZURhdGVEYXlMb29rdXBJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVGb3JtYXR0ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVGb3JtYXR0ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZjdhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZUZvcm1hdHRlckltcGwuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLk1pbmltYWxFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBGb3JtYXR0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVGb3JtYXR0ZXJJbXBsI2dldEZvcm1hdCA8ZW0+Rm9ybWF0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVGb3JtYXR0ZXJJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIFRhYmxlRm9ybWF0dGVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybWF0KCkgPGVtPkZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybWF0KCkgPGVtPkZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Rm9ybWF0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdCA9IEZPUk1BVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZUZvcm1hdHRlckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0ZPUk1BVFRFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZvcm1hdCgpIHsKKwkJcmV0dXJuIGZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb3JtYXQoU3RyaW5nIG5ld0Zvcm1hdCkgeworCQlTdHJpbmcgb2xkRm9ybWF0ID0gZm9ybWF0OworCQlmb3JtYXQgPSBuZXdGb3JtYXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfRk9STUFUVEVSX19GT1JNQVQsIG9sZEZvcm1hdCwgZm9ybWF0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUOgorCQkJCXJldHVybiBnZXRGb3JtYXQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUOgorCQkJCXNldEZvcm1hdCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUOgorCQkJCXNldEZvcm1hdChGT1JNQVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUOgorCQkJCXJldHVybiBGT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGZvcm1hdCAhPSBudWxsIDogIUZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGZvcm1hdDogIik7CisJCXJlc3VsdC5hcHBlbmQoZm9ybWF0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vVGFibGVGb3JtYXR0ZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVJY29uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlSWNvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA5NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlSWNvbkltcGwuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb247CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBJY29uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlSWNvbkltcGwjZ2V0SWNvbiA8ZW0+SWNvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlSWNvbkltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVGFibGVJY29uIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbigpIDxlbT5JY29uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJY29uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb24oKSA8ZW0+SWNvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpY29uID0gSUNPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZUljb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9JQ09OOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKKwkJcmV0dXJuIGljb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWNvbihTdHJpbmcgbmV3SWNvbikgeworCQlTdHJpbmcgb2xkSWNvbiA9IGljb247CisJCWljb24gPSBuZXdJY29uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lDT05fX0lDT04sIG9sZEljb24sIGljb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTl9fSUNPTjoKKwkJCQlyZXR1cm4gZ2V0SWNvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTl9fSUNPTjoKKwkJCQlzZXRJY29uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTl9fSUNPTjoKKwkJCQlzZXRJY29uKElDT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lDT05fX0lDT046CisJCQkJcmV0dXJuIElDT05fRURFRkFVTFQgPT0gbnVsbCA/IGljb24gIT0gbnVsbCA6ICFJQ09OX0VERUZBVUxULmVxdWFscyhpY29uKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGljb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGljb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UYWJsZUljb25JbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVJbWFnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZUltYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDM4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVJbWFnZUltcGwuamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVWYWx1ZUVsZW1lbnQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBJbWFnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUltYWdlSW1wbCNnZXRJbWFnZVBhdGhQYXR0ZXJuIDxlbT5JbWFnZSBQYXRoIFBhdHRlcm48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVJbWFnZUltcGwjaXNIaWRlSW1hZ2VMYWJlbCA8ZW0+SGlkZSBJbWFnZSBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUltYWdlSW1wbCNpc0hhc1BhcmFtZXRlciA8ZW0+SGFzIFBhcmFtZXRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUltYWdlSW1wbCNpc1Jlc2l6ZSA8ZW0+UmVzaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlSW1hZ2VJbXBsI2dldFJlc2l6ZVN0cmluZyA8ZW0+UmVzaXplIFN0cmluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZUltYWdlSW1wbCNnZXRJbWFnZVBhdGhQYXJhbWV0ZXIgPGVtPkltYWdlIFBhdGggUGFyYW1ldGVyPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVJbWFnZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVGFibGVJbWFnZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltYWdlUGF0aFBhdHRlcm4oKSA8ZW0+SW1hZ2UgUGF0aCBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbWFnZVBhdGhQYXR0ZXJuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9QQVRIX1BBVFRFUk5fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1hZ2VQYXRoUGF0dGVybigpIDxlbT5JbWFnZSBQYXRoIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEltYWdlUGF0aFBhdHRlcm4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaW1hZ2VQYXRoUGF0dGVybiA9IElNQUdFX1BBVEhfUEFUVEVSTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVJbWFnZUxhYmVsKCkgPGVtPkhpZGUgSW1hZ2UgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGlkZUltYWdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0lNQUdFX0xBQkVMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVJbWFnZUxhYmVsKCkgPGVtPkhpZGUgSW1hZ2UgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGlkZUltYWdlTGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhpZGVJbWFnZUxhYmVsID0gSElERV9JTUFHRV9MQUJFTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc1BhcmFtZXRlcigpIDxlbT5IYXMgUGFyYW1ldGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0hhc1BhcmFtZXRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19QQVJBTUVURVJfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzUGFyYW1ldGVyKCkgPGVtPkhhcyBQYXJhbWV0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSGFzUGFyYW1ldGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQYXJhbWV0ZXIgPSBIQVNfUEFSQU1FVEVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzaXplKCkgPGVtPlJlc2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZXNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNJWkVfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzaXplKCkgPGVtPlJlc2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZXNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlc2l6ZSA9IFJFU0laRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNpemVTdHJpbmcoKSA8ZW0+UmVzaXplIFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzaXplU3RyaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNJWkVfU1RSSU5HX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc2l6ZVN0cmluZygpIDxlbT5SZXNpemUgU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXNpemVTdHJpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcmVzaXplU3RyaW5nID0gUkVTSVpFX1NUUklOR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltYWdlUGF0aFBhcmFtZXRlcigpIDxlbT5JbWFnZSBQYXRoIFBhcmFtZXRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW1hZ2VQYXRoUGFyYW1ldGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVWYWx1ZUVsZW1lbnQgaW1hZ2VQYXRoUGFyYW1ldGVyOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlSW1hZ2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9JTUFHRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEltYWdlUGF0aFBhdHRlcm4oKSB7CisJCXJldHVybiBpbWFnZVBhdGhQYXR0ZXJuOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEltYWdlUGF0aFBhdHRlcm4oU3RyaW5nIG5ld0ltYWdlUGF0aFBhdHRlcm4pIHsKKwkJU3RyaW5nIG9sZEltYWdlUGF0aFBhdHRlcm4gPSBpbWFnZVBhdGhQYXR0ZXJuOworCQlpbWFnZVBhdGhQYXR0ZXJuID0gbmV3SW1hZ2VQYXRoUGF0dGVybjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVRURVJOLCBvbGRJbWFnZVBhdGhQYXR0ZXJuLCBpbWFnZVBhdGhQYXR0ZXJuKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNIaWRlSW1hZ2VMYWJlbCgpIHsKKwkJcmV0dXJuIGhpZGVJbWFnZUxhYmVsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhpZGVJbWFnZUxhYmVsKGJvb2xlYW4gbmV3SGlkZUltYWdlTGFiZWwpIHsKKwkJYm9vbGVhbiBvbGRIaWRlSW1hZ2VMYWJlbCA9IGhpZGVJbWFnZUxhYmVsOworCQloaWRlSW1hZ2VMYWJlbCA9IG5ld0hpZGVJbWFnZUxhYmVsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19ISURFX0lNQUdFX0xBQkVMLCBvbGRIaWRlSW1hZ2VMYWJlbCwgaGlkZUltYWdlTGFiZWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0hhc1BhcmFtZXRlcigpIHsKKwkJcmV0dXJuIGhhc1BhcmFtZXRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIYXNQYXJhbWV0ZXIoYm9vbGVhbiBuZXdIYXNQYXJhbWV0ZXIpIHsKKwkJYm9vbGVhbiBvbGRIYXNQYXJhbWV0ZXIgPSBoYXNQYXJhbWV0ZXI7CisJCWhhc1BhcmFtZXRlciA9IG5ld0hhc1BhcmFtZXRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSEFTX1BBUkFNRVRFUiwgb2xkSGFzUGFyYW1ldGVyLCBoYXNQYXJhbWV0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc2l6ZSgpIHsKKwkJcmV0dXJuIHJlc2l6ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNpemUoYm9vbGVhbiBuZXdSZXNpemUpIHsKKwkJYm9vbGVhbiBvbGRSZXNpemUgPSByZXNpemU7CisJCXJlc2l6ZSA9IG5ld1Jlc2l6ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fUkVTSVpFLCBvbGRSZXNpemUsIHJlc2l6ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzaXplU3RyaW5nKCkgeworCQlyZXR1cm4gcmVzaXplU3RyaW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc2l6ZVN0cmluZyhTdHJpbmcgbmV3UmVzaXplU3RyaW5nKSB7CisJCVN0cmluZyBvbGRSZXNpemVTdHJpbmcgPSByZXNpemVTdHJpbmc7CisJCXJlc2l6ZVN0cmluZyA9IG5ld1Jlc2l6ZVN0cmluZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fUkVTSVpFX1NUUklORywgb2xkUmVzaXplU3RyaW5nLCByZXNpemVTdHJpbmcpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVWYWx1ZUVsZW1lbnQgZ2V0SW1hZ2VQYXRoUGFyYW1ldGVyKCkgeworCQlyZXR1cm4gaW1hZ2VQYXRoUGFyYW1ldGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEltYWdlUGF0aFBhcmFtZXRlcihUYWJsZVZhbHVlRWxlbWVudCBuZXdJbWFnZVBhdGhQYXJhbWV0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJVGFibGVWYWx1ZUVsZW1lbnQgb2xkSW1hZ2VQYXRoUGFyYW1ldGVyID0gaW1hZ2VQYXRoUGFyYW1ldGVyOworCQlpbWFnZVBhdGhQYXJhbWV0ZXIgPSBuZXdJbWFnZVBhdGhQYXJhbWV0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0lNQUdFX1BBVEhfUEFSQU1FVEVSLCBvbGRJbWFnZVBhdGhQYXJhbWV0ZXIsIG5ld0ltYWdlUGF0aFBhcmFtZXRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW1hZ2VQYXRoUGFyYW1ldGVyKFRhYmxlVmFsdWVFbGVtZW50IG5ld0ltYWdlUGF0aFBhcmFtZXRlcikgeworCQlpZiAobmV3SW1hZ2VQYXRoUGFyYW1ldGVyICE9IGltYWdlUGF0aFBhcmFtZXRlcikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoaW1hZ2VQYXRoUGFyYW1ldGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWltYWdlUGF0aFBhcmFtZXRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0lNQUdFX1BBVEhfUEFSQU1FVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdJbWFnZVBhdGhQYXJhbWV0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW1hZ2VQYXRoUGFyYW1ldGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVJBTUVURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0SW1hZ2VQYXRoUGFyYW1ldGVyKG5ld0ltYWdlUGF0aFBhcmFtZXRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBUkFNRVRFUiwgbmV3SW1hZ2VQYXRoUGFyYW1ldGVyLCBuZXdJbWFnZVBhdGhQYXJhbWV0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0lNQUdFX1BBVEhfUEFSQU1FVEVSOgorCQkJCXJldHVybiBiYXNpY1NldEltYWdlUGF0aFBhcmFtZXRlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBVFRFUk46CisJCQkJcmV0dXJuIGdldEltYWdlUGF0aFBhdHRlcm4oKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSElERV9JTUFHRV9MQUJFTDoKKwkJCQlyZXR1cm4gaXNIaWRlSW1hZ2VMYWJlbCgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19IQVNfUEFSQU1FVEVSOgorCQkJCXJldHVybiBpc0hhc1BhcmFtZXRlcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19SRVNJWkU6CisJCQkJcmV0dXJuIGlzUmVzaXplKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX1JFU0laRV9TVFJJTkc6CisJCQkJcmV0dXJuIGdldFJlc2l6ZVN0cmluZygpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBUkFNRVRFUjoKKwkJCQlyZXR1cm4gZ2V0SW1hZ2VQYXRoUGFyYW1ldGVyKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSU1BR0VfUEFUSF9QQVRURVJOOgorCQkJCXNldEltYWdlUGF0aFBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19ISURFX0lNQUdFX0xBQkVMOgorCQkJCXNldEhpZGVJbWFnZUxhYmVsKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0hBU19QQVJBTUVURVI6CisJCQkJc2V0SGFzUGFyYW1ldGVyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX1JFU0laRToKKwkJCQlzZXRSZXNpemUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fUkVTSVpFX1NUUklORzoKKwkJCQlzZXRSZXNpemVTdHJpbmcoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBUkFNRVRFUjoKKwkJCQlzZXRJbWFnZVBhdGhQYXJhbWV0ZXIoKFRhYmxlVmFsdWVFbGVtZW50KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBVFRFUk46CisJCQkJc2V0SW1hZ2VQYXRoUGF0dGVybihJTUFHRV9QQVRIX1BBVFRFUk5fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fSElERV9JTUFHRV9MQUJFTDoKKwkJCQlzZXRIaWRlSW1hZ2VMYWJlbChISURFX0lNQUdFX0xBQkVMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0hBU19QQVJBTUVURVI6CisJCQkJc2V0SGFzUGFyYW1ldGVyKEhBU19QQVJBTUVURVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fUkVTSVpFOgorCQkJCXNldFJlc2l6ZShSRVNJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9JTUFHRV9fUkVTSVpFX1NUUklORzoKKwkJCQlzZXRSZXNpemVTdHJpbmcoUkVTSVpFX1NUUklOR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBUkFNRVRFUjoKKwkJCQlzZXRJbWFnZVBhdGhQYXJhbWV0ZXIoKFRhYmxlVmFsdWVFbGVtZW50KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19JTUFHRV9QQVRIX1BBVFRFUk46CisJCQkJcmV0dXJuIElNQUdFX1BBVEhfUEFUVEVSTl9FREVGQVVMVCA9PSBudWxsID8gaW1hZ2VQYXRoUGF0dGVybiAhPSBudWxsIDogIUlNQUdFX1BBVEhfUEFUVEVSTl9FREVGQVVMVC5lcXVhbHMoaW1hZ2VQYXRoUGF0dGVybik7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0hJREVfSU1BR0VfTEFCRUw6CisJCQkJcmV0dXJuIGhpZGVJbWFnZUxhYmVsICE9IEhJREVfSU1BR0VfTEFCRUxfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0hBU19QQVJBTUVURVI6CisJCQkJcmV0dXJuIGhhc1BhcmFtZXRlciAhPSBIQVNfUEFSQU1FVEVSX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFX19SRVNJWkU6CisJCQkJcmV0dXJuIHJlc2l6ZSAhPSBSRVNJWkVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX1JFU0laRV9TVFJJTkc6CisJCQkJcmV0dXJuIFJFU0laRV9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlc2l6ZVN0cmluZyAhPSBudWxsIDogIVJFU0laRV9TVFJJTkdfRURFRkFVTFQuZXF1YWxzKHJlc2l6ZVN0cmluZyk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSU1BR0VfX0lNQUdFX1BBVEhfUEFSQU1FVEVSOgorCQkJCXJldHVybiBpbWFnZVBhdGhQYXJhbWV0ZXIgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGltYWdlUGF0aFBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKGltYWdlUGF0aFBhdHRlcm4pOworCQlyZXN1bHQuYXBwZW5kKCIsIGhpZGVJbWFnZUxhYmVsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChoaWRlSW1hZ2VMYWJlbCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGFzUGFyYW1ldGVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChoYXNQYXJhbWV0ZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlc2l6ZTogIik7CisJCXJlc3VsdC5hcHBlbmQocmVzaXplKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXNpemVTdHJpbmc6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlc2l6ZVN0cmluZyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlSW1hZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTMxMjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uSW1wbCNnZXRBZ2dyZWdhdGlvbiA8ZW0+QWdncmVnYXRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZU11bHRpcGxlQWdncmVnYXRpb25JbXBsIGV4dGVuZHMgVGFibGVCYXNlQWdncmVnYXRpb25JbXBsIGltcGxlbWVudHMgVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWdncmVnYXRpb24oKSA8ZW0+QWdncmVnYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBBR0dSRUdBVElPTl9FREVGQVVMVCA9IE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bS5DT05DQVQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGlvbigpIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gYWdncmVnYXRpb24gPSBBR0dSRUdBVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZU11bHRpcGxlQWdncmVnYXRpb25JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9NVUxUSVBMRV9BR0dSRUdBVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIGdldEFnZ3JlZ2F0aW9uKCkgeworCQlyZXR1cm4gYWdncmVnYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWdncmVnYXRpb24oTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIG5ld0FnZ3JlZ2F0aW9uKSB7CisJCU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBvbGRBZ2dyZWdhdGlvbiA9IGFnZ3JlZ2F0aW9uOworCQlhZ2dyZWdhdGlvbiA9IG5ld0FnZ3JlZ2F0aW9uID09IG51bGwgPyBBR0dSRUdBVElPTl9FREVGQVVMVCA6IG5ld0FnZ3JlZ2F0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTiwgb2xkQWdncmVnYXRpb24sIGFnZ3JlZ2F0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlyZXR1cm4gZ2V0QWdncmVnYXRpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlzZXRBZ2dyZWdhdGlvbigoTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX01VTFRJUExFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlzZXRBZ2dyZWdhdGlvbihBR0dSRUdBVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXJldHVybiBhZ2dyZWdhdGlvbiAhPSBBR0dSRUdBVElPTl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGFnZ3JlZ2F0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhZ2dyZWdhdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZU51bWJlckludGVydmFsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlTnVtYmVySW50ZXJ2YWxJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ZDAwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZU51bWJlckludGVydmFsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVJhbmdlRWxlbWVudDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIE51bWJlciBJbnRlcnZhbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckludGVydmFsSW1wbCNnZXROdW1iZXJJbnRlcnZhbFZhbHVlIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVOdW1iZXJJbnRlcnZhbEltcGwjZ2V0TnVtYmVyUmFuZ2UgPGVtPk51bWJlciBSYW5nZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlTnVtYmVySW50ZXJ2YWxJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFRhYmxlTnVtYmVySW50ZXJ2YWwgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXJJbnRlcnZhbFZhbHVlKCkgPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTlVNQkVSX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bWJlckludGVydmFsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBkb3VibGUgbnVtYmVySW50ZXJ2YWxWYWx1ZSA9IE5VTUJFUl9JTlRFUlZBTF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlclJhbmdlKCkgPGVtPk51bWJlciBSYW5nZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtYmVyUmFuZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZVJhbmdlRWxlbWVudCBudW1iZXJSYW5nZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZU51bWJlckludGVydmFsSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfTlVNQkVSX0lOVEVSVkFMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpIHsKKwkJcmV0dXJuIG51bWJlckludGVydmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVtYmVySW50ZXJ2YWxWYWx1ZShkb3VibGUgbmV3TnVtYmVySW50ZXJ2YWxWYWx1ZSkgeworCQlkb3VibGUgb2xkTnVtYmVySW50ZXJ2YWxWYWx1ZSA9IG51bWJlckludGVydmFsVmFsdWU7CisJCW51bWJlckludGVydmFsVmFsdWUgPSBuZXdOdW1iZXJJbnRlcnZhbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX0lOVEVSVkFMX1ZBTFVFLCBvbGROdW1iZXJJbnRlcnZhbFZhbHVlLCBudW1iZXJJbnRlcnZhbFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlUmFuZ2VFbGVtZW50IGdldE51bWJlclJhbmdlKCkgeworCQlyZXR1cm4gbnVtYmVyUmFuZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TnVtYmVyUmFuZ2UoVGFibGVSYW5nZUVsZW1lbnQgbmV3TnVtYmVyUmFuZ2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJVGFibGVSYW5nZUVsZW1lbnQgb2xkTnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTsKKwkJbnVtYmVyUmFuZ2UgPSBuZXdOdW1iZXJSYW5nZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSwgb2xkTnVtYmVyUmFuZ2UsIG5ld051bWJlclJhbmdlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROdW1iZXJSYW5nZShUYWJsZVJhbmdlRWxlbWVudCBuZXdOdW1iZXJSYW5nZSkgeworCQlpZiAobmV3TnVtYmVyUmFuZ2UgIT0gbnVtYmVyUmFuZ2UpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG51bWJlclJhbmdlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW51bWJlclJhbmdlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TnVtYmVyUmFuZ2UgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TnVtYmVyUmFuZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE51bWJlclJhbmdlKG5ld051bWJlclJhbmdlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UsIG5ld051bWJlclJhbmdlLCBuZXdOdW1iZXJSYW5nZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRToKKwkJCQlyZXR1cm4gYmFzaWNTZXROdW1iZXJSYW5nZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX0lOVEVSVkFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXROdW1iZXJJbnRlcnZhbFZhbHVlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0U6CisJCQkJcmV0dXJuIGdldE51bWJlclJhbmdlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRToKKwkJCQlzZXROdW1iZXJJbnRlcnZhbFZhbHVlKChEb3VibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRToKKwkJCQlzZXROdW1iZXJSYW5nZSgoVGFibGVSYW5nZUVsZW1lbnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUU6CisJCQkJc2V0TnVtYmVySW50ZXJ2YWxWYWx1ZShOVU1CRVJfSU5URVJWQUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRToKKwkJCQlzZXROdW1iZXJSYW5nZSgoVGFibGVSYW5nZUVsZW1lbnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUU6CisJCQkJcmV0dXJuIG51bWJlckludGVydmFsVmFsdWUgIT0gTlVNQkVSX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFOgorCQkJCXJldHVybiBudW1iZXJSYW5nZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobnVtYmVySW50ZXJ2YWxWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobnVtYmVySW50ZXJ2YWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlTnVtYmVySW50ZXJ2YWxJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVOdW1iZXJMb29rdXBJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVOdW1iZXJMb29rdXBJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZU51bWJlckxvb2t1cEltcGwuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVyTG9va3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUmFuZ2VFbGVtZW50OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgTnVtYmVyIExvb2t1cDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckxvb2t1cEltcGwjZ2V0TG9va3VwVmFsdWUgPGVtPkxvb2t1cCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZU51bWJlckxvb2t1cEltcGwjZ2V0RGlzY3JldGUgPGVtPkRpc2NyZXRlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVOdW1iZXJMb29rdXBJbXBsIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFRhYmxlTnVtYmVyTG9va3VwIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwVmFsdWUoKSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUgTE9PS1VQX1ZBTFVFX0VERUZBVUxUID0gMC4wOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwVmFsdWUoKSA8ZW0+TG9va3VwIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGRvdWJsZSBsb29rdXBWYWx1ZSA9IExPT0tVUF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NyZXRlKCkgPGVtPkRpc2NyZXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREaXNjcmV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlUmFuZ2VFbGVtZW50IGRpc2NyZXRlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlTnVtYmVyTG9va3VwSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfTlVNQkVSX0xPT0tVUDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgZG91YmxlIGdldExvb2t1cFZhbHVlKCkgeworCQlyZXR1cm4gbG9va3VwVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwVmFsdWUoZG91YmxlIG5ld0xvb2t1cFZhbHVlKSB7CisJCWRvdWJsZSBvbGRMb29rdXBWYWx1ZSA9IGxvb2t1cFZhbHVlOworCQlsb29rdXBWYWx1ZSA9IG5ld0xvb2t1cFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVBfX0xPT0tVUF9WQUxVRSwgb2xkTG9va3VwVmFsdWUsIGxvb2t1cFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRhYmxlUmFuZ2VFbGVtZW50IGdldERpc2NyZXRlKCkgeworCQlyZXR1cm4gZGlzY3JldGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlzY3JldGUoVGFibGVSYW5nZUVsZW1lbnQgbmV3RGlzY3JldGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJVGFibGVSYW5nZUVsZW1lbnQgb2xkRGlzY3JldGUgPSBkaXNjcmV0ZTsKKwkJZGlzY3JldGUgPSBuZXdEaXNjcmV0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURSwgb2xkRGlzY3JldGUsIG5ld0Rpc2NyZXRlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREaXNjcmV0ZShUYWJsZVJhbmdlRWxlbWVudCBuZXdEaXNjcmV0ZSkgeworCQlpZiAobmV3RGlzY3JldGUgIT0gZGlzY3JldGUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGRpc2NyZXRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc2NyZXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RGlzY3JldGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGlzY3JldGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVBfX0RJU0NSRVRFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldERpc2NyZXRlKG5ld0Rpc2NyZXRlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEUsIG5ld0Rpc2NyZXRlLCBuZXdEaXNjcmV0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURToKKwkJCQlyZXR1cm4gYmFzaWNTZXREaXNjcmV0ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVBfX0xPT0tVUF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0TG9va3VwVmFsdWUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURToKKwkJCQlyZXR1cm4gZ2V0RGlzY3JldGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVBfX0xPT0tVUF9WQUxVRToKKwkJCQlzZXRMb29rdXBWYWx1ZSgoRG91YmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEU6CisJCQkJc2V0RGlzY3JldGUoKFRhYmxlUmFuZ2VFbGVtZW50KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVBfX0xPT0tVUF9WQUxVRToKKwkJCQlzZXRMb29rdXBWYWx1ZShMT09LVVBfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfTE9PS1VQX19ESVNDUkVURToKKwkJCQlzZXREaXNjcmV0ZSgoVGFibGVSYW5nZUVsZW1lbnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0xPT0tVUF9fTE9PS1VQX1ZBTFVFOgorCQkJCXJldHVybiBsb29rdXBWYWx1ZSAhPSBMT09LVVBfVkFMVUVfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEU6CisJCQkJcmV0dXJuIGRpc2NyZXRlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb29rdXBWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobG9va3VwVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UYWJsZU51bWJlckxvb2t1cEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZVByb3BlcnR5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlUHJvcGVydHlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkYjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZVByb3BlcnR5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlUHJvcGVydHlJbXBsI2dldFZhbHVlUmVmIDxlbT5WYWx1ZSBSZWY8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZVByb3BlcnR5SW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUYWJsZVByb3BlcnR5IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVJlZigpIDxlbT5WYWx1ZSBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRQcm9wZXJ0eSB2YWx1ZVJlZjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZVByb3BlcnR5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfUFJPUEVSVFk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFtYXJ0UHJvcGVydHkgZ2V0VmFsdWVSZWYoKSB7CisJCWlmICh2YWx1ZVJlZiAhPSBudWxsICYmIHZhbHVlUmVmLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRWYWx1ZVJlZiA9IChJbnRlcm5hbEVPYmplY3QpdmFsdWVSZWY7CisJCQl2YWx1ZVJlZiA9IChEYXRhbWFydFByb3BlcnR5KWVSZXNvbHZlUHJveHkob2xkVmFsdWVSZWYpOworCQkJaWYgKHZhbHVlUmVmICE9IG9sZFZhbHVlUmVmKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QUk9QRVJUWV9fVkFMVUVfUkVGLCBvbGRWYWx1ZVJlZiwgdmFsdWVSZWYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWVSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFtYXJ0UHJvcGVydHkgYmFzaWNHZXRWYWx1ZVJlZigpIHsKKwkJcmV0dXJuIHZhbHVlUmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlUmVmKERhdGFtYXJ0UHJvcGVydHkgbmV3VmFsdWVSZWYpIHsKKwkJRGF0YW1hcnRQcm9wZXJ0eSBvbGRWYWx1ZVJlZiA9IHZhbHVlUmVmOworCQl2YWx1ZVJlZiA9IG5ld1ZhbHVlUmVmOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BST1BFUlRZX19WQUxVRV9SRUYsIG9sZFZhbHVlUmVmLCB2YWx1ZVJlZikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QUk9QRVJUWV9fVkFMVUVfUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VmFsdWVSZWYoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRWYWx1ZVJlZigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfUFJPUEVSVFlfX1ZBTFVFX1JFRjoKKwkJCQlzZXRWYWx1ZVJlZigoRGF0YW1hcnRQcm9wZXJ0eSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QUk9QRVJUWV9fVkFMVUVfUkVGOgorCQkJCXNldFZhbHVlUmVmKChEYXRhbWFydFByb3BlcnR5KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BST1BFUlRZX19WQUxVRV9SRUY6CisJCQkJcmV0dXJuIHZhbHVlUmVmICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1RhYmxlUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVQdXJlQWdncmVnYXRpb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVQdXJlQWdncmVnYXRpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NWY4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZVB1cmVBZ2dyZWdhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFB1cmUgQWdncmVnYXRpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVQdXJlQWdncmVnYXRpb25JbXBsI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbCBleHRlbmRzIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uSW1wbCBpbXBsZW1lbnRzIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWdncmVnYXRpb24oKSA8ZW0+QWdncmVnYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFnZ3JlZ2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIEFHR1JFR0FUSU9OX0VERUZBVUxUID0gUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0uQ09VTlQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGlvbigpIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQdXJlQWdncmVnYXRpb25UeXBlRW51bSBhZ2dyZWdhdGlvbiA9IEFHR1JFR0FUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfUFVSRV9BR0dSRUdBVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0QWdncmVnYXRpb24oKSB7CisJCXJldHVybiBhZ2dyZWdhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZ2dyZWdhdGlvbihQdXJlQWdncmVnYXRpb25UeXBlRW51bSBuZXdBZ2dyZWdhdGlvbikgeworCQlQdXJlQWdncmVnYXRpb25UeXBlRW51bSBvbGRBZ2dyZWdhdGlvbiA9IGFnZ3JlZ2F0aW9uOworCQlhZ2dyZWdhdGlvbiA9IG5ld0FnZ3JlZ2F0aW9uID09IG51bGwgPyBBR0dSRUdBVElPTl9FREVGQVVMVCA6IG5ld0FnZ3JlZ2F0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BVUkVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OLCBvbGRBZ2dyZWdhdGlvbiwgYWdncmVnYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfUFVSRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT046CisJCQkJcmV0dXJuIGdldEFnZ3JlZ2F0aW9uKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QVVJFX0FHR1JFR0FUSU9OX19BR0dSRUdBVElPTjoKKwkJCQlzZXRBZ2dyZWdhdGlvbigoUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfUFVSRV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT046CisJCQkJc2V0QWdncmVnYXRpb24oQUdHUkVHQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BVUkVfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXJldHVybiBhZ2dyZWdhdGlvbiAhPSBBR0dSRUdBVElPTl9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGFnZ3JlZ2F0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhZ2dyZWdhdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlUHVyZUFnZ3JlZ2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlU3RyaW5nTG9va3VwSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlU3RyaW5nTG9va3VwSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZjdlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVTdHJpbmdMb29rdXBJbXBsLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVJhbmdlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVN0cmluZ0xvb2t1cDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFN0cmluZyBMb29rdXA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVTdHJpbmdMb29rdXBJbXBsI2dldExvb2t1cFZhbHVlIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVTdHJpbmdMb29rdXBJbXBsI2dldERpc2NyZXRlIDxlbT5EaXNjcmV0ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlU3RyaW5nTG9va3VwSW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUYWJsZVN0cmluZ0xvb2t1cCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cFZhbHVlKCkgPGVtPkxvb2t1cCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPT0tVUF9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBWYWx1ZSgpIDxlbT5Mb29rdXAgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cFZhbHVlID0gTE9PS1VQX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JldGUoKSA8ZW0+RGlzY3JldGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERpc2NyZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVSYW5nZUVsZW1lbnQgZGlzY3JldGU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVTdHJpbmdMb29rdXBJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9TVFJJTkdfTE9PS1VQOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwVmFsdWUoKSB7CisJCXJldHVybiBsb29rdXBWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb29rdXBWYWx1ZShTdHJpbmcgbmV3TG9va3VwVmFsdWUpIHsKKwkJU3RyaW5nIG9sZExvb2t1cFZhbHVlID0gbG9va3VwVmFsdWU7CisJCWxvb2t1cFZhbHVlID0gbmV3TG9va3VwVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFLCBvbGRMb29rdXBWYWx1ZSwgbG9va3VwVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGFibGVSYW5nZUVsZW1lbnQgZ2V0RGlzY3JldGUoKSB7CisJCXJldHVybiBkaXNjcmV0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNjcmV0ZShUYWJsZVJhbmdlRWxlbWVudCBuZXdEaXNjcmV0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlUYWJsZVJhbmdlRWxlbWVudCBvbGREaXNjcmV0ZSA9IGRpc2NyZXRlOworCQlkaXNjcmV0ZSA9IG5ld0Rpc2NyZXRlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFLCBvbGREaXNjcmV0ZSwgbmV3RGlzY3JldGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERpc2NyZXRlKFRhYmxlUmFuZ2VFbGVtZW50IG5ld0Rpc2NyZXRlKSB7CisJCWlmIChuZXdEaXNjcmV0ZSAhPSBkaXNjcmV0ZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGlzY3JldGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGlzY3JldGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEaXNjcmV0ZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEaXNjcmV0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUF9fRElTQ1JFVEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0RGlzY3JldGUobmV3RGlzY3JldGUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9TVFJJTkdfTE9PS1VQX19ESVNDUkVURSwgbmV3RGlzY3JldGUsIG5ld0Rpc2NyZXRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFOgorCQkJCXJldHVybiBiYXNpY1NldERpc2NyZXRlKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFOgorCQkJCXJldHVybiBnZXRMb29rdXBWYWx1ZSgpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFOgorCQkJCXJldHVybiBnZXREaXNjcmV0ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFOgorCQkJCXNldExvb2t1cFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9TVFJJTkdfTE9PS1VQX19ESVNDUkVURToKKwkJCQlzZXREaXNjcmV0ZSgoVGFibGVSYW5nZUVsZW1lbnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUF9fTE9PS1VQX1ZBTFVFOgorCQkJCXNldExvb2t1cFZhbHVlKExPT0tVUF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1NUUklOR19MT09LVVBfX0RJU0NSRVRFOgorCQkJCXNldERpc2NyZXRlKChUYWJsZVJhbmdlRWxlbWVudCludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9TVFJJTkdfTE9PS1VQX19MT09LVVBfVkFMVUU6CisJCQkJcmV0dXJuIExPT0tVUF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gbG9va3VwVmFsdWUgIT0gbnVsbCA6ICFMT09LVVBfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGxvb2t1cFZhbHVlKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9TVFJJTkdfTE9PS1VQX19ESVNDUkVURToKKwkJCQlyZXR1cm4gZGlzY3JldGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGxvb2t1cFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsb29rdXBWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RhYmxlU3RyaW5nTG9va3VwSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlVGV4dENvbG9ySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlVGV4dENvbG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2Q0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVUZXh0Q29sb3JJbXBsLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIFRleHQgQ29sb3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGFibGVUZXh0Q29sb3JJbXBsI2dldENvbG9yIDxlbT5Db2xvcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlVGV4dENvbG9ySW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUYWJsZVRleHRDb2xvciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sb3IoKSA8ZW0+Q29sb3I8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29sb3IgY29sb3I7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVUZXh0Q29sb3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9URVhUX0NPTE9SOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsKKwkJaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvbG9yID0gKEludGVybmFsRU9iamVjdCljb2xvcjsKKwkJCWNvbG9yID0gKENvbG9yKWVSZXNvbHZlUHJveHkob2xkQ29sb3IpOworCQkJaWYgKGNvbG9yICE9IG9sZENvbG9yKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9URVhUX0NPTE9SX19DT0xPUiwgb2xkQ29sb3IsIGNvbG9yKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvbG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb2xvciBiYXNpY0dldENvbG9yKCkgeworCQlyZXR1cm4gY29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgbmV3Q29sb3IpIHsKKwkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKKwkJY29sb3IgPSBuZXdDb2xvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9URVhUX0NPTE9SX19DT0xPUiwgb2xkQ29sb3IsIGNvbG9yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RFWFRfQ09MT1JfX0NPTE9SOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q29sb3IoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRDb2xvcigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVEVYVF9DT0xPUl9fQ09MT1I6CisJCQkJc2V0Q29sb3IoKENvbG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RFWFRfQ09MT1JfX0NPTE9SOgorCQkJCXNldENvbG9yKChDb2xvciludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9URVhUX0NPTE9SX19DT0xPUjoKKwkJCQlyZXR1cm4gY29sb3IgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vVGFibGVUZXh0Q29sb3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVUb29sdGlwSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlVG9vbHRpcEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU1NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RhYmxlVG9vbHRpcEltcGwuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRvb2x0aXA7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBUb29sdGlwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRhYmxlVG9vbHRpcEltcGwjZ2V0VG9vbHRpcCA8ZW0+VG9vbHRpcDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlVG9vbHRpcEltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVGFibGVUb29sdGlwIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbHRpcCgpIDxlbT5Ub29sdGlwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb29sdGlwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MVElQX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2x0aXAoKSA8ZW0+VG9vbHRpcDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG9vbHRpcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0b29sdGlwID0gVE9PTFRJUF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUYWJsZVRvb2x0aXBJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9UT09MVElQOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKKwkJcmV0dXJuIHRvb2x0aXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VG9vbHRpcChTdHJpbmcgbmV3VG9vbHRpcCkgeworCQlTdHJpbmcgb2xkVG9vbHRpcCA9IHRvb2x0aXA7CisJCXRvb2x0aXAgPSBuZXdUb29sdGlwOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RPT0xUSVBfX1RPT0xUSVAsIG9sZFRvb2x0aXAsIHRvb2x0aXApKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVE9PTFRJUF9fVE9PTFRJUDoKKwkJCQlyZXR1cm4gZ2V0VG9vbHRpcCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVE9PTFRJUF9fVE9PTFRJUDoKKwkJCQlzZXRUb29sdGlwKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVE9PTFRJUF9fVE9PTFRJUDoKKwkJCQlzZXRUb29sdGlwKFRPT0xUSVBfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RPT0xUSVBfX1RPT0xUSVA6CisJCQkJcmV0dXJuIFRPT0xUSVBfRURFRkFVTFQgPT0gbnVsbCA/IHRvb2x0aXAgIT0gbnVsbCA6ICFUT09MVElQX0VERUZBVUxULmVxdWFscyh0b29sdGlwKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRvb2x0aXA6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRvb2x0aXApOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UYWJsZVRvb2x0aXBJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVUcmVuZEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZVRyZW5kSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzRiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVUcmVuZEltcGwuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRyZW5kSWNvbkVudW07CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBUcmVuZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVRyZW5kSW1wbCNnZXRJY29uIDxlbT5JY29uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGFibGVUcmVuZEltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVGFibGVUcmVuZCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb24oKSA8ZW0+SWNvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVuZEljb25FbnVtIElDT05fRURFRkFVTFQgPSBUcmVuZEljb25FbnVtLlJJU0lORzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb24oKSA8ZW0+SWNvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWNvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRyZW5kSWNvbkVudW0gaWNvbiA9IElDT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGFibGVUcmVuZEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX1RSRU5EOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmVuZEljb25FbnVtIGdldEljb24oKSB7CisJCXJldHVybiBpY29uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEljb24oVHJlbmRJY29uRW51bSBuZXdJY29uKSB7CisJCVRyZW5kSWNvbkVudW0gb2xkSWNvbiA9IGljb247CisJCWljb24gPSBuZXdJY29uID09IG51bGwgPyBJQ09OX0VERUZBVUxUIDogbmV3SWNvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9UUkVORF9fSUNPTiwgb2xkSWNvbiwgaWNvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9UUkVORF9fSUNPTjoKKwkJCQlyZXR1cm4gZ2V0SWNvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVFJFTkRfX0lDT046CisJCQkJc2V0SWNvbigoVHJlbmRJY29uRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9UUkVORF9fSUNPTjoKKwkJCQlzZXRJY29uKElDT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RSRU5EX19JQ09OOgorCQkJCXJldHVybiBpY29uICE9IElDT05fRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpY29uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChpY29uKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vVGFibGVUcmVuZEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVVbmFyeUFnZ3JlZ2F0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWNjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGFibGVVbmFyeUFnZ3JlZ2F0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW07CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UYWJsZVVuYXJ5QWdncmVnYXRpb25JbXBsI2dldEFnZ3JlZ2F0aW9uIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbkltcGwgZXh0ZW5kcyBUYWJsZUJhc2VBZ2dyZWdhdGlvbkltcGwgaW1wbGVtZW50cyBUYWJsZVVuYXJ5QWdncmVnYXRpb24geworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGlvbigpIDxlbT5BZ2dyZWdhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWdncmVnYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIEFHR1JFR0FUSU9OX0VERUZBVUxUID0gVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtLlNVTTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFnZ3JlZ2F0aW9uKCkgPGVtPkFnZ3JlZ2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZ2dyZWdhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSBhZ2dyZWdhdGlvbiA9IEFHR1JFR0FUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX1VOQVJZX0FHR1JFR0FUSU9OOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gZ2V0QWdncmVnYXRpb24oKSB7CisJCXJldHVybiBhZ2dyZWdhdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZ2dyZWdhdGlvbihVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gbmV3QWdncmVnYXRpb24pIHsKKwkJVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIG9sZEFnZ3JlZ2F0aW9uID0gYWdncmVnYXRpb247CisJCWFnZ3JlZ2F0aW9uID0gbmV3QWdncmVnYXRpb24gPT0gbnVsbCA/IEFHR1JFR0FUSU9OX0VERUZBVUxUIDogbmV3QWdncmVnYXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OLCBvbGRBZ2dyZWdhdGlvbiwgYWdncmVnYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXJldHVybiBnZXRBZ2dyZWdhdGlvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXNldEFnZ3JlZ2F0aW9uKChVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVU5BUllfQUdHUkVHQVRJT05fX0FHR1JFR0FUSU9OOgorCQkJCXNldEFnZ3JlZ2F0aW9uKEFHR1JFR0FUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9VTkFSWV9BR0dSRUdBVElPTl9fQUdHUkVHQVRJT046CisJCQkJcmV0dXJuIGFnZ3JlZ2F0aW9uICE9IEFHR1JFR0FUSU9OX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWdncmVnYXRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGFnZ3JlZ2F0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vVGFibGVVbmFyeUFnZ3JlZ2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjZjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuVGV4dEVsZW1lbnRJbXBsI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5UZXh0RWxlbWVudEltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRleHRFbGVtZW50SW1wbCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBUZXh0RWxlbWVudCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3R5bGUoKSA8ZW0+U3R5bGU8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0eWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3R5bGUgc3R5bGU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGV4dCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7CisJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRTdHlsZSA9IChJbnRlcm5hbEVPYmplY3Qpc3R5bGU7CisJCQlzdHlsZSA9IChTdHlsZSllUmVzb2x2ZVByb3h5KG9sZFN0eWxlKTsKKwkJCWlmIChzdHlsZSAhPSBvbGRTdHlsZSkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9FTEVNRU5UX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldFN0eWxlKCkgeworCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgbmV3U3R5bGUpIHsKKwkJU3R5bGUgb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiB0ZXh0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKKwkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0OworCQl0ZXh0ID0gbmV3VGV4dDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQsIG9sZFRleHQsIHRleHQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9FTEVNRU5UX19TVFlMRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFN0eWxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0U3R5bGUoKTsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6CisJCQkJcmV0dXJuIGdldFRleHQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRFWFRfRUxFTUVOVF9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgorCQkJCXNldFRleHQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgorCQkJCXNldFRleHQoVEVYVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVF9FTEVNRU5UX19TVFlMRToKKwkJCQlyZXR1cm4gc3R5bGUgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6CisJCQkJcmV0dXJuIFRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IHRleHQgIT0gbnVsbCA6ICFURVhUX0VERUZBVUxULmVxdWFscyh0ZXh0KTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRFWFRfRUxFTUVOVF9fU1RZTEU6IHJldHVybiBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgeworCQlpZiAoYmFzZUNsYXNzID09IFdpdGhTdHlsZS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOiByZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlRfX1NUWUxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRleHQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRleHQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9UZXh0RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UZXh0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RleHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5ZGMxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGV4dEltcGwgZXh0ZW5kcyBUZXh0RWxlbWVudEltcGwgaW1wbGVtZW50cyBUZXh0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRFWFQ7CisJfQorCit9IC8vVGV4dEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UaW1lRm9ybWF0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RpbWVGb3JtYXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjOGMxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UaW1lRm9ybWF0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdENhdGVnb3J5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgRm9ybWF0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLlRpbWVGb3JtYXRJbXBsI2dldFJlcG9ydF9jYXRlZ29yeSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGltZUZvcm1hdEltcGwgZXh0ZW5kcyBTb21lRm9ybWF0SW1wbCBpbXBsZW1lbnRzIFRpbWVGb3JtYXQgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRfY2F0ZWdvcnkoKSA8ZW0+UmVwb3J0IGNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXBvcnRfY2F0ZWdvcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGltZUZvcm1hdENhdGVnb3J5RW51bSBSRVBPUlRfQ0FURUdPUllfRURFRkFVTFQgPSBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtLkNVU1RPTTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydF9jYXRlZ29yeSgpIDxlbT5SZXBvcnQgY2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcG9ydF9jYXRlZ29yeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X2NhdGVnb3J5ID0gUkVQT1JUX0NBVEVHT1JZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRpbWVGb3JtYXRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5USU1FX0ZPUk1BVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGltZUZvcm1hdENhdGVnb3J5RW51bSBnZXRSZXBvcnRfY2F0ZWdvcnkoKSB7CisJCXJldHVybiByZXBvcnRfY2F0ZWdvcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVwb3J0X2NhdGVnb3J5KFRpbWVGb3JtYXRDYXRlZ29yeUVudW0gbmV3UmVwb3J0X2NhdGVnb3J5KSB7CisJCVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gb2xkUmVwb3J0X2NhdGVnb3J5ID0gcmVwb3J0X2NhdGVnb3J5OworCQlyZXBvcnRfY2F0ZWdvcnkgPSBuZXdSZXBvcnRfY2F0ZWdvcnkgPT0gbnVsbCA/IFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCA6IG5ld1JlcG9ydF9jYXRlZ29yeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZLCBvbGRSZXBvcnRfY2F0ZWdvcnksIHJlcG9ydF9jYXRlZ29yeSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZOgorCQkJCXJldHVybiBnZXRSZXBvcnRfY2F0ZWdvcnkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJc2V0UmVwb3J0X2NhdGVnb3J5KChUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlk6CisJCQkJc2V0UmVwb3J0X2NhdGVnb3J5KFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVElNRV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWToKKwkJCQlyZXR1cm4gcmVwb3J0X2NhdGVnb3J5ICE9IFJFUE9SVF9DQVRFR09SWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJlcG9ydF9jYXRlZ29yeTogIik7CisJCXJlc3VsdC5hcHBlbmQocmVwb3J0X2NhdGVnb3J5KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vVGltZUZvcm1hdEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UaXRsZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9UaXRsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk1YmFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1RpdGxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUaXRsZUltcGwgZXh0ZW5kcyBUZXh0RWxlbWVudEltcGwgaW1wbGVtZW50cyBUaXRsZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFRpdGxlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVElUTEU7CisJfQorCit9IC8vVGl0bGVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVW9tb0Zvcm1hdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9Vb21vRm9ybWF0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2FiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvVW9tb0Zvcm1hdEltcGwuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vb21vRm9ybWF0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW9tbyBGb3JtYXQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBVb21vRm9ybWF0SW1wbCBleHRlbmRzIFNvbWVGb3JtYXRJbXBsIGltcGxlbWVudHMgVW9tb0Zvcm1hdCB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFVvbW9Gb3JtYXRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5VT01PX0ZPUk1BVDsKKwl9CisKK30gLy9Vb21vRm9ybWF0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1dpdGhIZWFkZXJGb290ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvV2l0aEhlYWRlckZvb3RlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU3YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9pbXBsL1dpdGhIZWFkZXJGb290ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoSGVhZGVyRm9vdGVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2l0aCBIZWFkZXIgRm9vdGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLldpdGhIZWFkZXJGb290ZXJJbXBsI2lzRGV0YWlsaGVhZGVyIDxlbT5EZXRhaWxoZWFkZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aEhlYWRlckZvb3RlckltcGwjZ2V0SGVhZGVyc3R5bGUgPGVtPkhlYWRlcnN0eWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5pbXBsLldpdGhIZWFkZXJGb290ZXJJbXBsI2lzRGV0YWlsZm9vdGVyIDxlbT5EZXRhaWxmb290ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGwuV2l0aEhlYWRlckZvb3RlckltcGwjZ2V0Rm9vdGVyc3R5bGUgPGVtPkZvb3RlcnN0eWxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2l0aEhlYWRlckZvb3RlckltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgV2l0aEhlYWRlckZvb3RlciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0YWlsaGVhZGVyKCkgPGVtPkRldGFpbGhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXRhaWxoZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERVRBSUxIRUFERVJfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0YWlsaGVhZGVyKCkgPGVtPkRldGFpbGhlYWRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXRhaWxoZWFkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGRldGFpbGhlYWRlciA9IERFVEFJTEhFQURFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlYWRlcnN0eWxlKCkgPGVtPkhlYWRlcnN0eWxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIZWFkZXJzdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0eWxlIGhlYWRlcnN0eWxlOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0YWlsZm9vdGVyKCkgPGVtPkRldGFpbGZvb3RlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXRhaWxmb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERVRBSUxGT09URVJfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGV0YWlsZm9vdGVyKCkgPGVtPkRldGFpbGZvb3RlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXRhaWxmb290ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGRldGFpbGZvb3RlciA9IERFVEFJTEZPT1RFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvb3RlcnN0eWxlKCkgPGVtPkZvb3RlcnN0eWxlPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGb290ZXJzdHlsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0eWxlIGZvb3RlcnN0eWxlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFdpdGhIZWFkZXJGb290ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5XSVRIX0hFQURFUl9GT09URVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXRhaWxoZWFkZXIoKSB7CisJCXJldHVybiBkZXRhaWxoZWFkZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGV0YWlsaGVhZGVyKGJvb2xlYW4gbmV3RGV0YWlsaGVhZGVyKSB7CisJCWJvb2xlYW4gb2xkRGV0YWlsaGVhZGVyID0gZGV0YWlsaGVhZGVyOworCQlkZXRhaWxoZWFkZXIgPSBuZXdEZXRhaWxoZWFkZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVIsIG9sZERldGFpbGhlYWRlciwgZGV0YWlsaGVhZGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEhlYWRlcnN0eWxlKCkgeworCQlpZiAoaGVhZGVyc3R5bGUgIT0gbnVsbCAmJiBoZWFkZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkSGVhZGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWhlYWRlcnN0eWxlOworCQkJaGVhZGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRIZWFkZXJzdHlsZSk7CisJCQlpZiAoaGVhZGVyc3R5bGUgIT0gb2xkSGVhZGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fSEVBREVSU1RZTEUsIG9sZEhlYWRlcnN0eWxlLCBoZWFkZXJzdHlsZSkpOworCQkJfQorCQl9CisJCXJldHVybiBoZWFkZXJzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgYmFzaWNHZXRIZWFkZXJzdHlsZSgpIHsKKwkJcmV0dXJuIGhlYWRlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlYWRlcnN0eWxlKFN0eWxlIG5ld0hlYWRlcnN0eWxlKSB7CisJCVN0eWxlIG9sZEhlYWRlcnN0eWxlID0gaGVhZGVyc3R5bGU7CisJCWhlYWRlcnN0eWxlID0gbmV3SGVhZGVyc3R5bGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRSwgb2xkSGVhZGVyc3R5bGUsIGhlYWRlcnN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXRhaWxmb290ZXIoKSB7CisJCXJldHVybiBkZXRhaWxmb290ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGV0YWlsZm9vdGVyKGJvb2xlYW4gbmV3RGV0YWlsZm9vdGVyKSB7CisJCWJvb2xlYW4gb2xkRGV0YWlsZm9vdGVyID0gZGV0YWlsZm9vdGVyOworCQlkZXRhaWxmb290ZXIgPSBuZXdEZXRhaWxmb290ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVIsIG9sZERldGFpbGZvb3RlciwgZGV0YWlsZm9vdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0eWxlIGdldEZvb3RlcnN0eWxlKCkgeworCQlpZiAoZm9vdGVyc3R5bGUgIT0gbnVsbCAmJiBmb290ZXJzdHlsZS5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRm9vdGVyc3R5bGUgPSAoSW50ZXJuYWxFT2JqZWN0KWZvb3RlcnN0eWxlOworCQkJZm9vdGVyc3R5bGUgPSAoU3R5bGUpZVJlc29sdmVQcm94eShvbGRGb290ZXJzdHlsZSk7CisJCQlpZiAoZm9vdGVyc3R5bGUgIT0gb2xkRm9vdGVyc3R5bGUpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fRk9PVEVSU1RZTEUsIG9sZEZvb3RlcnN0eWxlLCBmb290ZXJzdHlsZSkpOworCQkJfQorCQl9CisJCXJldHVybiBmb290ZXJzdHlsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3R5bGUgYmFzaWNHZXRGb290ZXJzdHlsZSgpIHsKKwkJcmV0dXJuIGZvb3RlcnN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvb3RlcnN0eWxlKFN0eWxlIG5ld0Zvb3RlcnN0eWxlKSB7CisJCVN0eWxlIG9sZEZvb3RlcnN0eWxlID0gZm9vdGVyc3R5bGU7CisJCWZvb3RlcnN0eWxlID0gbmV3Rm9vdGVyc3R5bGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRSwgb2xkRm9vdGVyc3R5bGUsIGZvb3RlcnN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fREVUQUlMSEVBREVSOgorCQkJCXJldHVybiBpc0RldGFpbGhlYWRlcigpOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fSEVBREVSU1RZTEU6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRIZWFkZXJzdHlsZSgpOworCQkJCXJldHVybiBiYXNpY0dldEhlYWRlcnN0eWxlKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVI6CisJCQkJcmV0dXJuIGlzRGV0YWlsZm9vdGVyKCk7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRToKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEZvb3RlcnN0eWxlKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0Rm9vdGVyc3R5bGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fREVUQUlMSEVBREVSOgorCQkJCXNldERldGFpbGhlYWRlcigoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fSEVBREVSU1RZTEU6CisJCQkJc2V0SGVhZGVyc3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxGT09URVI6CisJCQkJc2V0RGV0YWlsZm9vdGVyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRToKKwkJCQlzZXRGb290ZXJzdHlsZSgoU3R5bGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVI6CisJCQkJc2V0RGV0YWlsaGVhZGVyKERFVEFJTEhFQURFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUl9fSEVBREVSU1RZTEU6CisJCQkJc2V0SGVhZGVyc3R5bGUoKFN0eWxlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEZPT1RFUjoKKwkJCQlzZXREZXRhaWxmb290ZXIoREVUQUlMRk9PVEVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19GT09URVJTVFlMRToKKwkJCQlzZXRGb290ZXJzdHlsZSgoU3R5bGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19ERVRBSUxIRUFERVI6CisJCQkJcmV0dXJuIGRldGFpbGhlYWRlciAhPSBERVRBSUxIRUFERVJfRURFRkFVTFQ7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9IRUFERVJfRk9PVEVSX19IRUFERVJTVFlMRToKKwkJCQlyZXR1cm4gaGVhZGVyc3R5bGUgIT0gbnVsbDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX0hFQURFUl9GT09URVJfX0RFVEFJTEZPT1RFUjoKKwkJCQlyZXR1cm4gZGV0YWlsZm9vdGVyICE9IERFVEFJTEZPT1RFUl9FREVGQVVMVDsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX0hFQURFUl9GT09URVJfX0ZPT1RFUlNUWUxFOgorCQkJCXJldHVybiBmb290ZXJzdHlsZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGV0YWlsaGVhZGVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXRhaWxoZWFkZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRldGFpbGZvb3RlcjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGV0YWlsZm9vdGVyKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vV2l0aEhlYWRlckZvb3RlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvaW1wbC9XaXRoU3R5bGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvV2l0aFN0eWxlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTYxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2ltcGwvV2l0aFN0eWxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aFN0eWxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2l0aCBTdHlsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuaW1wbC5XaXRoU3R5bGVJbXBsI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdpdGhTdHlsZUltcGwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgV2l0aFN0eWxlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3R5bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHlsZSBzdHlsZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBXaXRoU3R5bGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5XSVRIX1NUWUxFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN0eWxlID0gKEludGVybmFsRU9iamVjdClzdHlsZTsKKwkJCXN0eWxlID0gKFN0eWxlKWVSZXNvbHZlUHJveHkob2xkU3R5bGUpOworCQkJaWYgKHN0eWxlICE9IG9sZFN0eWxlKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHlsZSBiYXNpY0dldFN0eWxlKCkgeworCQlyZXR1cm4gc3R5bGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgbmV3U3R5bGUpIHsKKwkJU3R5bGUgb2xkU3R5bGUgPSBzdHlsZTsKKwkJc3R5bGUgPSBuZXdTdHlsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0U3R5bGUoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRTdHlsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuV0lUSF9TVFlMRV9fU1RZTEU6CisJCQkJc2V0U3R5bGUoKFN0eWxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEVfX1NUWUxFOgorCQkJCXNldFN0eWxlKChTdHlsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5XSVRIX1NUWUxFX19TVFlMRToKKwkJCQlyZXR1cm4gc3R5bGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vV2l0aFN0eWxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91dGlsL1JlcG9ydERTTEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3V0aWwvUmVwb3J0RFNMQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91dGlsL1JlcG9ydERTTEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNTkyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUmVwb3J0RFNMUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydERTTEFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IFJlcG9ydERTTFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXBvcnREU0xTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgUmVwb3J0RFNMU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0TW9kZWwoUmVwb3J0TW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydE1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKFJlcG9ydExhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVwb3J0TGF6eVJlc29sdmVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0QmFzZShSZXBvcnRCYXNlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSZXBvcnRCYXNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0UGFja2FnZShSZXBvcnRQYWNrYWdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSZXBvcnRQYWNrYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFnZVRlbXBsYXRlcyhQYWdlVGVtcGxhdGVzIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQYWdlVGVtcGxhdGVzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU29tZUZvcm1hdHMoU29tZUZvcm1hdHMgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNvbWVGb3JtYXRzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29sb3JzKENvbG9ycyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29sb3JzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRm9udHMoRm9udHMgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUZvbnRzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWVkaWFzKE1lZGlhcyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTWVkaWFzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3R5bGVzKFN0eWxlcyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlU3R5bGVzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFnZVRlbXBsYXRlKFBhZ2VUZW1wbGF0ZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUGFnZVRlbXBsYXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29sb3IoQ29sb3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRm9udChGb250IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVGb250QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRm9udEZhbWlseShGb250RmFtaWx5IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVGb250RmFtaWx5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQnVpbGRJbkZvbnRGYW1pbHkoQnVpbGRJbkZvbnRGYW1pbHkgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUJ1aWxkSW5Gb250RmFtaWx5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ3VzdG9tRm9udEZhbWlseShDdXN0b21Gb250RmFtaWx5IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDdXN0b21Gb250RmFtaWx5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWVkaWEoTWVkaWEgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU1lZGlhQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUJvcmRlclN0eWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQmFzZVN0eWxlKEJhc2VTdHlsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQmFzZVN0eWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWVkaWFTdHlsZShNZWRpYVN0eWxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNZWRpYVN0eWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3R5bGUoU3R5bGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN0eWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU29tZUZvcm1hdChTb21lRm9ybWF0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTb21lRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVW9tb0Zvcm1hdChVb21vRm9ybWF0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVVb21vRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTnVtYmVyRm9ybWF0KE51bWJlckZvcm1hdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTnVtYmVyRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ3VycmVuY3lGb3JtYXQoQ3VycmVuY3lGb3JtYXQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUN1cnJlbmN5Rm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0ZUZvcm1hdChEYXRlRm9ybWF0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEYXRlRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0ZVRpbWVGb3JtYXQoRGF0ZVRpbWVGb3JtYXQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURhdGVUaW1lRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGltZUZvcm1hdChUaW1lRm9ybWF0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUaW1lRm9ybWF0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVwb3J0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0RGVzaWduKFJlcG9ydERlc2lnbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVwb3J0RGVzaWduQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0RGVzaWduRmlsZShSZXBvcnREZXNpZ25GaWxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSZXBvcnREZXNpZ25GaWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0RGVzaWduVGVtcGxhdGUoUmVwb3J0RGVzaWduVGVtcGxhdGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydERlc2lnblRlbXBsYXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFnZUhlYWRlcihQYWdlSGVhZGVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQYWdlSGVhZGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFnZURldGFpbChQYWdlRGV0YWlsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQYWdlRGV0YWlsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFnZUZvb3RlcihQYWdlRm9vdGVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVQYWdlRm9vdGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlV2l0aFN0eWxlKFdpdGhTdHlsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlV2l0aFN0eWxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGV4dEVsZW1lbnQoVGV4dEVsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGl0bGUoVGl0bGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRpdGxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3ViVGl0bGUoU3ViVGl0bGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN1YlRpdGxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3ViU3ViVGl0bGUoU3ViU3ViVGl0bGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVN1YlN1YlRpdGxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTGFiZWwoTGFiZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxhYmVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGV4dChUZXh0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUZXh0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXV0b1RleHQoQXV0b1RleHQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUF1dG9UZXh0QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUltYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlV2l0aEhlYWRlckZvb3RlcihXaXRoSGVhZGVyRm9vdGVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVXaXRoSGVhZGVyRm9vdGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZShEYXRhbWFydFRhYmxlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEYXRhbWFydFRhYmxlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZUdyb3VwKERhdGFtYXJ0VGFibGVHcm91cCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU29tZUdyaWQoU29tZUdyaWQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVNvbWVHcmlkQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKERhdGFtYXJ0VGFibGVHcm91cEhlYWRlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZURldGFpbChEYXRhbWFydFRhYmxlRGV0YWlsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVEYXRhbWFydFRhYmxlRGV0YWlsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YW1hcnRUYWJsZVByb3BlcnR5KERhdGFtYXJ0VGFibGVQcm9wZXJ0eSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGF0YW1hcnRUYWJsZVByb3BlcnR5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVGb3JtYXR0ZXIoVGFibGVGb3JtYXR0ZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlRm9ybWF0dGVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVJbWFnZShUYWJsZUltYWdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZUltYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVWYWx1ZUVsZW1lbnQoVGFibGVWYWx1ZUVsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlVmFsdWVFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVQcm9wZXJ0eShUYWJsZVByb3BlcnR5IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZVByb3BlcnR5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVBZ2dyZWdhdGlvbihUYWJsZUFnZ3JlZ2F0aW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVCYXNlQWdncmVnYXRpb24oVGFibGVCYXNlQWdncmVnYXRpb24gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVQdXJlQWdncmVnYXRpb24oVGFibGVQdXJlQWdncmVnYXRpb24gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKFRhYmxlVW5hcnlBZ2dyZWdhdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbihUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVJbnRlcnZhbChUYWJsZUludGVydmFsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZUludGVydmFsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVOdW1iZXJJbnRlcnZhbChUYWJsZU51bWJlckludGVydmFsIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZU51bWJlckludGVydmFsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVEYXRlRGF5SW50ZXJ2YWwoVGFibGVEYXRlRGF5SW50ZXJ2YWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlRGF0ZURheUludGVydmFsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVMb29rdXAoVGFibGVMb29rdXAgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlTG9va3VwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVOdW1iZXJMb29rdXAoVGFibGVOdW1iZXJMb29rdXAgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlTnVtYmVyTG9va3VwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVTdHJpbmdMb29rdXAoVGFibGVTdHJpbmdMb29rdXAgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlU3RyaW5nTG9va3VwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVEYXRlRGF5TG9va3VwKFRhYmxlRGF0ZURheUxvb2t1cCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGFibGVEYXRlRGF5TG9va3VwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVSYW5nZUVsZW1lbnQoVGFibGVSYW5nZUVsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlUmFuZ2VFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVUZXh0Q29sb3IoVGFibGVUZXh0Q29sb3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlVGV4dENvbG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVDZWxsQ29sb3IoVGFibGVDZWxsQ29sb3Igb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRhYmxlQ2VsbENvbG9yQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVJY29uKFRhYmxlSWNvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGFibGVJY29uQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVUcmVuZChUYWJsZVRyZW5kIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVUYWJsZVRyZW5kQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFibGVUb29sdGlwKFRhYmxlVG9vbHRpcCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGFibGVUb29sdGlwQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JpZChHcmlkIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmlkQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JpZFJvdyhHcmlkUm93IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVHcmlkUm93QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JpZENlbGwoR3JpZENlbGwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUdyaWRDZWxsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTExhenlSZXNvbHZlcihMTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMTGF6eVJlc29sdmVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTFBhY2thZ2UoTFBhY2thZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxQYWNrYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsIDxlbT5SZXBvcnQgTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0TW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydExhenlSZXNvbHZlciA8ZW0+UmVwb3J0IExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TGF6eVJlc29sdmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydExhenlSZXNvbHZlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0QmFzZSA8ZW0+UmVwb3J0IEJhc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0QmFzZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRCYXNlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlIDxlbT5SZXBvcnQgUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydFBhY2thZ2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMgPGVtPlBhZ2UgVGVtcGxhdGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFnZVRlbXBsYXRlc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHMgPGVtPlNvbWUgRm9ybWF0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0cworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTb21lRm9ybWF0c0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzIDxlbT5Db2xvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbG9yc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHMgPGVtPkZvbnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvbnRzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYXMgPGVtPk1lZGlhczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVkaWFzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXMgPGVtPlN0eWxlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3R5bGVzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGUgPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhZ2VUZW1wbGF0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3IgPGVtPkNvbG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250IDxlbT5Gb250PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRm9udEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseSA8ZW0+Rm9udCBGYW1pbHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udEZhbWlseQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGb250RmFtaWx5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5CdWlsZEluRm9udEZhbWlseSA8ZW0+QnVpbGQgSW4gRm9udCBGYW1pbHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQnVpbGRJbkZvbnRGYW1pbHlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1c3RvbUZvbnRGYW1pbHkgPGVtPkN1c3RvbSBGb250IEZhbWlseTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DdXN0b21Gb250RmFtaWx5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUZvbnRGYW1pbHlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhIDxlbT5NZWRpYTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5NZWRpYQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZWRpYUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGUgPGVtPkJvcmRlciBTdHlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Cb3JkZXJTdHlsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVCb3JkZXJTdHlsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlIDxlbT5CYXNlIFN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJhc2VTdHlsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlU3R5bGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUgPGVtPk1lZGlhIFN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVkaWFTdHlsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0eWxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0IDxlbT5Tb21lIEZvcm1hdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lRm9ybWF0CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNvbWVGb3JtYXRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQgPGVtPlVvbW8gRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlVvbW9Gb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVW9tb0Zvcm1hdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTnVtYmVyRm9ybWF0IDxlbT5OdW1iZXIgRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVOdW1iZXJGb3JtYXRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0IDxlbT5DdXJyZW5jeSBGb3JtYXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ3VycmVuY3lGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VycmVuY3lGb3JtYXRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQgPGVtPkRhdGUgRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0ZUZvcm1hdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQgPGVtPkRhdGUgVGltZSBGb3JtYXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZVRpbWVGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGF0ZVRpbWVGb3JtYXRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQgPGVtPlRpbWUgRm9ybWF0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZUZvcm1hdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduIDxlbT5SZXBvcnQgRGVzaWduPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnREZXNpZ25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbkZpbGUgPGVtPlJlcG9ydCBEZXNpZ24gRmlsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydERlc2lnbkZpbGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlIDxlbT5SZXBvcnQgRGVzaWduIFRlbXBsYXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydERlc2lnblRlbXBsYXRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIgPGVtPkNvbnRhaW5lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyIDxlbT5QYWdlIEhlYWRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhZ2VIZWFkZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VEZXRhaWwgPGVtPlBhZ2UgRGV0YWlsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VEZXRhaWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFnZURldGFpbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlciA8ZW0+UGFnZSBGb290ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWdlRm9vdGVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aFN0eWxlIDxlbT5XaXRoIFN0eWxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhTdHlsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaXRoU3R5bGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dEVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UaXRsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUaXRsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViVGl0bGUgPGVtPlN1YiBUaXRsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJUaXRsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdWJUaXRsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViU3ViVGl0bGUgPGVtPlN1YiBTdWIgVGl0bGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3ViU3ViVGl0bGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU3ViU3ViVGl0bGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsIDxlbT5MYWJlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5MYWJlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMYWJlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dCA8ZW0+VGV4dDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRleHRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkF1dG9UZXh0IDxlbT5BdXRvIFRleHQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0b1RleHRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlIDxlbT5JbWFnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlciA8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLldpdGhIZWFkZXJGb290ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlV2l0aEhlYWRlckZvb3RlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZSA8ZW0+RGF0YW1hcnQgVGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEYXRhbWFydFRhYmxlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXAgPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEYXRhbWFydFRhYmxlR3JvdXBBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlNvbWVHcmlkIDxlbT5Tb21lIEdyaWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUdyaWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU29tZUdyaWRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlciA8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXAgSGVhZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlciA8ZW0+RGF0YW1hcnQgVGFibGUgR3JvdXAgRm9vdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVEZXRhaWwgPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURhdGFtYXJ0VGFibGVEZXRhaWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSA8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURhdGFtYXJ0VGFibGVQcm9wZXJ0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXIgPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUZvcm1hdHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZUZvcm1hdHRlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZSA8ZW0+VGFibGUgSW1hZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJbWFnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZUltYWdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudCA8ZW0+VGFibGUgVmFsdWUgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZVZhbHVlRWxlbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eSA8ZW0+VGFibGUgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZVByb3BlcnR5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlQWdncmVnYXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmFzZUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmFzZUFnZ3JlZ2F0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbiA8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZVB1cmVBZ2dyZWdhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIDxlbT5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVVuYXJ5QWdncmVnYXRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU11bHRpcGxlQWdncmVnYXRpb24gPGVtPlRhYmxlIE11bHRpcGxlIEFnZ3JlZ2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQmluYXJ5QWdncmVnYXRpb24gPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlQmluYXJ5QWdncmVnYXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWwgPGVtPlRhYmxlIEludGVydmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW50ZXJ2YWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVJbnRlcnZhbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJJbnRlcnZhbCA8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVOdW1iZXJJbnRlcnZhbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVEYXRlRGF5SW50ZXJ2YWwgPGVtPlRhYmxlIERhdGUgRGF5IEludGVydmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUludGVydmFsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlRGF0ZURheUludGVydmFsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUxvb2t1cCA8ZW0+VGFibGUgTG9va3VwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTG9va3VwCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlTG9va3VwQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cCA8ZW0+VGFibGUgTnVtYmVyIExvb2t1cDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZU51bWJlckxvb2t1cAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZU51bWJlckxvb2t1cEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAgPGVtPlRhYmxlIFN0cmluZyBMb29rdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVTdHJpbmdMb29rdXAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVTdHJpbmdMb29rdXBBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cCA8ZW0+VGFibGUgRGF0ZSBEYXkgTG9va3VwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlRGF0ZURheUxvb2t1cAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZURhdGVEYXlMb29rdXBBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUmFuZ2VFbGVtZW50IDxlbT5UYWJsZSBSYW5nZSBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUmFuZ2VFbGVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlUmFuZ2VFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvciA8ZW0+VGFibGUgVGV4dCBDb2xvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWJsZVRleHRDb2xvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVDZWxsQ29sb3IgPGVtPlRhYmxlIENlbGwgQ29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVDZWxsQ29sb3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVDZWxsQ29sb3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSWNvbiA8ZW0+VGFibGUgSWNvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUljb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVJY29uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kIDxlbT5UYWJsZSBUcmVuZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhYmxlVHJlbmRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVG9vbHRpcCA8ZW0+VGFibGUgVG9vbHRpcDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRvb2x0aXAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFibGVUb29sdGlwQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkIDxlbT5HcmlkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JpZEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdyA8ZW0+R3JpZCBSb3c8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmlkUm93QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbCA8ZW0+R3JpZCBDZWxsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyaWRDZWxsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTExhenlSZXNvbHZlciA8ZW0+TExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTExhenlSZXNvbHZlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlIDxlbT5MUGFja2FnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTFBhY2thZ2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vUmVwb3J0RFNMQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdXRpbC9SZXBvcnREU0xTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdXRpbC9SZXBvcnREU0xTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg2MzlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC91dGlsL1JlcG9ydERTTFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTk3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuU3dpdGNoOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xTd2l0Y2g8VD4gZXh0ZW5kcyBTd2l0Y2g8VD4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgUmVwb3J0RFNMUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlcG9ydERTTFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBSZXBvcnREU0xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtZXRlciBlUGFja2FnZSB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbi4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzU3dpdGNoRm9yKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCXJldHVybiBlUGFja2FnZSA9PSBtb2RlbFBhY2thZ2U7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTU9ERUw6IHsKKwkJCQlSZXBvcnRNb2RlbCByZXBvcnRNb2RlbCA9IChSZXBvcnRNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydE1vZGVsKHJlcG9ydE1vZGVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0xBWllfUkVTT0xWRVI6IHsKKwkJCQlSZXBvcnRMYXp5UmVzb2x2ZXIgcmVwb3J0TGF6eVJlc29sdmVyID0gKFJlcG9ydExhenlSZXNvbHZlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihyZXBvcnRMYXp5UmVzb2x2ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfQkFTRTogeworCQkJCVJlcG9ydEJhc2UgcmVwb3J0QmFzZSA9IChSZXBvcnRCYXNlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0QmFzZShyZXBvcnRCYXNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIocmVwb3J0QmFzZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9QQUNLQUdFOiB7CisJCQkJUmVwb3J0UGFja2FnZSByZXBvcnRQYWNrYWdlID0gKFJlcG9ydFBhY2thZ2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZXBvcnRQYWNrYWdlKHJlcG9ydFBhY2thZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxQYWNrYWdlKHJlcG9ydFBhY2thZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxMYXp5UmVzb2x2ZXIocmVwb3J0UGFja2FnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlBBR0VfVEVNUExBVEVTOiB7CisJCQkJUGFnZVRlbXBsYXRlcyBwYWdlVGVtcGxhdGVzID0gKFBhZ2VUZW1wbGF0ZXMpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQYWdlVGVtcGxhdGVzKHBhZ2VUZW1wbGF0ZXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihwYWdlVGVtcGxhdGVzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU09NRV9GT1JNQVRTOiB7CisJCQkJU29tZUZvcm1hdHMgc29tZUZvcm1hdHMgPSAoU29tZUZvcm1hdHMpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0cyhzb21lRm9ybWF0cyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHNvbWVGb3JtYXRzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1JTOiB7CisJCQkJQ29sb3JzIGNvbG9ycyA9IChDb2xvcnMpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb2xvcnMoY29sb3JzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoY29sb3JzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVFM6IHsKKwkJCQlGb250cyBmb250cyA9IChGb250cyl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUZvbnRzKGZvbnRzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZm9udHMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQVM6IHsKKwkJCQlNZWRpYXMgbWVkaWFzID0gKE1lZGlhcyl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZU1lZGlhcyhtZWRpYXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihtZWRpYXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TVFlMRVM6IHsKKwkJCQlTdHlsZXMgc3R5bGVzID0gKFN0eWxlcyl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVN0eWxlcyhzdHlsZXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihzdHlsZXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFOiB7CisJCQkJUGFnZVRlbXBsYXRlIHBhZ2VUZW1wbGF0ZSA9IChQYWdlVGVtcGxhdGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQYWdlVGVtcGxhdGUocGFnZVRlbXBsYXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKHBhZ2VUZW1wbGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHBhZ2VUZW1wbGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNPTE9SOiB7CisJCQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb2xvcihjb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0QmFzZShjb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGNvbG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVDogeworCQkJCUZvbnQgZm9udCA9IChGb250KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlRm9udChmb250KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKGZvbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihmb250KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVF9GQU1JTFk6IHsKKwkJCQlGb250RmFtaWx5IGZvbnRGYW1pbHkgPSAoRm9udEZhbWlseSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUZvbnRGYW1pbHkoZm9udEZhbWlseSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGZvbnRGYW1pbHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWTogeworCQkJCUJ1aWxkSW5Gb250RmFtaWx5IGJ1aWxkSW5Gb250RmFtaWx5ID0gKEJ1aWxkSW5Gb250RmFtaWx5KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQnVpbGRJbkZvbnRGYW1pbHkoYnVpbGRJbkZvbnRGYW1pbHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZvbnRGYW1pbHkoYnVpbGRJbkZvbnRGYW1pbHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihidWlsZEluRm9udEZhbWlseSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVU1RPTV9GT05UX0ZBTUlMWTogeworCQkJCUN1c3RvbUZvbnRGYW1pbHkgY3VzdG9tRm9udEZhbWlseSA9IChDdXN0b21Gb250RmFtaWx5KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ3VzdG9tRm9udEZhbWlseShjdXN0b21Gb250RmFtaWx5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGb250RmFtaWx5KGN1c3RvbUZvbnRGYW1pbHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihjdXN0b21Gb250RmFtaWx5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTUVESUE6IHsKKwkJCQlNZWRpYSBtZWRpYSA9IChNZWRpYSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZU1lZGlhKG1lZGlhKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKG1lZGlhKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIobWVkaWEpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEU6IHsKKwkJCQlCb3JkZXJTdHlsZSBib3JkZXJTdHlsZSA9IChCb3JkZXJTdHlsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUJvcmRlclN0eWxlKGJvcmRlclN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoYm9yZGVyU3R5bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CQVNFX1NUWUxFOiB7CisJCQkJQmFzZVN0eWxlIGJhc2VTdHlsZSA9IChCYXNlU3R5bGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VCYXNlU3R5bGUoYmFzZVN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoYmFzZVN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTUVESUFfU1RZTEU6IHsKKwkJCQlNZWRpYVN0eWxlIG1lZGlhU3R5bGUgPSAoTWVkaWFTdHlsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZU1lZGlhU3R5bGUobWVkaWFTdHlsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQmFzZVN0eWxlKG1lZGlhU3R5bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihtZWRpYVN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEU6IHsKKwkJCQlTdHlsZSBzdHlsZSA9IChTdHlsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVN0eWxlKHN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKHN0eWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCYXNlU3R5bGUoc3R5bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihzdHlsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUOiB7CisJCQkJU29tZUZvcm1hdCBzb21lRm9ybWF0ID0gKFNvbWVGb3JtYXQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0KHNvbWVGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2Uoc29tZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHNvbWVGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5VT01PX0ZPUk1BVDogeworCQkJCVVvbW9Gb3JtYXQgdW9tb0Zvcm1hdCA9IChVb21vRm9ybWF0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVW9tb0Zvcm1hdCh1b21vRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0KHVvbW9Gb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2UodW9tb0Zvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHVvbW9Gb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5OVU1CRVJfRk9STUFUOiB7CisJCQkJTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdCA9IChOdW1iZXJGb3JtYXQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VOdW1iZXJGb3JtYXQobnVtYmVyRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0KG51bWJlckZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0QmFzZShudW1iZXJGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihudW1iZXJGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DVVJSRU5DWV9GT1JNQVQ6IHsKKwkJCQlDdXJyZW5jeUZvcm1hdCBjdXJyZW5jeUZvcm1hdCA9IChDdXJyZW5jeUZvcm1hdCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUN1cnJlbmN5Rm9ybWF0KGN1cnJlbmN5Rm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0KGN1cnJlbmN5Rm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKGN1cnJlbmN5Rm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoY3VycmVuY3lGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX0ZPUk1BVDogeworCQkJCURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IChEYXRlRm9ybWF0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlRGF0ZUZvcm1hdChkYXRlRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lRm9ybWF0KGRhdGVGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2UoZGF0ZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGRhdGVGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUOiB7CisJCQkJRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSAoRGF0ZVRpbWVGb3JtYXQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEYXRlVGltZUZvcm1hdChkYXRlVGltZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU29tZUZvcm1hdChkYXRlVGltZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0QmFzZShkYXRlVGltZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGRhdGVUaW1lRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVElNRV9GT1JNQVQ6IHsKKwkJCQlUaW1lRm9ybWF0IHRpbWVGb3JtYXQgPSAoVGltZUZvcm1hdCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRpbWVGb3JtYXQodGltZUZvcm1hdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU29tZUZvcm1hdCh0aW1lRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKHRpbWVGb3JtYXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0aW1lRm9ybWF0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUOiB7CisJCQkJUmVwb3J0IHJlcG9ydCA9IChSZXBvcnQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZXBvcnQocmVwb3J0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKHJlcG9ydCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHJlcG9ydCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlJFUE9SVF9ERVNJR046IHsKKwkJCQlSZXBvcnREZXNpZ24gcmVwb3J0RGVzaWduID0gKFJlcG9ydERlc2lnbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydERlc2lnbihyZXBvcnREZXNpZ24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihyZXBvcnREZXNpZ24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX0ZJTEU6IHsKKwkJCQlSZXBvcnREZXNpZ25GaWxlIHJlcG9ydERlc2lnbkZpbGUgPSAoUmVwb3J0RGVzaWduRmlsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydERlc2lnbkZpbGUocmVwb3J0RGVzaWduRmlsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0RGVzaWduKHJlcG9ydERlc2lnbkZpbGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihyZXBvcnREZXNpZ25GaWxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURTogeworCQkJCVJlcG9ydERlc2lnblRlbXBsYXRlIHJlcG9ydERlc2lnblRlbXBsYXRlID0gKFJlcG9ydERlc2lnblRlbXBsYXRlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0RGVzaWduVGVtcGxhdGUocmVwb3J0RGVzaWduVGVtcGxhdGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydERlc2lnbihyZXBvcnREZXNpZ25UZW1wbGF0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHJlcG9ydERlc2lnblRlbXBsYXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09OVEFJTkVSOiB7CisJCQkJQ29udGFpbmVyIGNvbnRhaW5lciA9IChDb250YWluZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb250YWluZXIoY29udGFpbmVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoY29udGFpbmVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9IRUFERVI6IHsKKwkJCQlQYWdlSGVhZGVyIHBhZ2VIZWFkZXIgPSAoUGFnZUhlYWRlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBhZ2VIZWFkZXIocGFnZUhlYWRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHBhZ2VIZWFkZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihwYWdlSGVhZGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9ERVRBSUw6IHsKKwkJCQlQYWdlRGV0YWlsIHBhZ2VEZXRhaWwgPSAoUGFnZURldGFpbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBhZ2VEZXRhaWwocGFnZURldGFpbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHBhZ2VEZXRhaWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihwYWdlRGV0YWlsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9GT09URVI6IHsKKwkJCQlQYWdlRm9vdGVyIHBhZ2VGb290ZXIgPSAoUGFnZUZvb3Rlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBhZ2VGb290ZXIocGFnZUZvb3Rlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKHBhZ2VGb290ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihwYWdlRm9vdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRUxFTUVOVDogeworCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfU1RZTEU6IHsKKwkJCQlXaXRoU3R5bGUgd2l0aFN0eWxlID0gKFdpdGhTdHlsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZSh3aXRoU3R5bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih3aXRoU3R5bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUX0VMRU1FTlQ6IHsKKwkJCQlUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCA9IChUZXh0RWxlbWVudCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRleHRFbGVtZW50KHRleHRFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRleHRFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXaXRoU3R5bGUodGV4dEVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0ZXh0RWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRJVExFOiB7CisJCQkJVGl0bGUgdGl0bGUgPSAoVGl0bGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUaXRsZSh0aXRsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGV4dEVsZW1lbnQodGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZSh0aXRsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRpdGxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1VCX1RJVExFOiB7CisJCQkJU3ViVGl0bGUgc3ViVGl0bGUgPSAoU3ViVGl0bGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTdWJUaXRsZShzdWJUaXRsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGV4dEVsZW1lbnQoc3ViVGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3ViVGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZShzdWJUaXRsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHN1YlRpdGxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1VCX1NVQl9USVRMRTogeworCQkJCVN1YlN1YlRpdGxlIHN1YlN1YlRpdGxlID0gKFN1YlN1YlRpdGxlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlU3ViU3ViVGl0bGUoc3ViU3ViVGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRleHRFbGVtZW50KHN1YlN1YlRpdGxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHN1YlN1YlRpdGxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXaXRoU3R5bGUoc3ViU3ViVGl0bGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihzdWJTdWJUaXRsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkxBQkVMOiB7CisJCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VMYWJlbChsYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGV4dEVsZW1lbnQobGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobGFiZWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZShsYWJlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGxhYmVsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEVYVDogeworCQkJCVRleHQgdGV4dCA9IChUZXh0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGV4dCh0ZXh0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUZXh0RWxlbWVudCh0ZXh0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRleHQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZSh0ZXh0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGV4dCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkFVVE9fVEVYVDogeworCQkJCUF1dG9UZXh0IGF1dG9UZXh0ID0gKEF1dG9UZXh0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQXV0b1RleHQoYXV0b1RleHQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXV0b1RleHQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZShhdXRvVGV4dCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKGF1dG9UZXh0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuSU1BR0U6IHsKKwkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUltYWdlKGltYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGltYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXaXRoU3R5bGUoaW1hZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihpbWFnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLldJVEhfSEVBREVSX0ZPT1RFUjogeworCQkJCVdpdGhIZWFkZXJGb290ZXIgd2l0aEhlYWRlckZvb3RlciA9IChXaXRoSGVhZGVyRm9vdGVyKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlV2l0aEhlYWRlckZvb3Rlcih3aXRoSGVhZGVyRm9vdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIod2l0aEhlYWRlckZvb3Rlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFOiB7CisJCQkJRGF0YW1hcnRUYWJsZSBkYXRhbWFydFRhYmxlID0gKERhdGFtYXJ0VGFibGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEYXRhbWFydFRhYmxlKGRhdGFtYXJ0VGFibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2UoZGF0YW1hcnRUYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkYXRhbWFydFRhYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXaXRoU3R5bGUoZGF0YW1hcnRUYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2l0aEhlYWRlckZvb3RlcihkYXRhbWFydFRhYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZGF0YW1hcnRUYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQOiB7CisJCQkJRGF0YW1hcnRUYWJsZUdyb3VwIGRhdGFtYXJ0VGFibGVHcm91cCA9IChEYXRhbWFydFRhYmxlR3JvdXApdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEYXRhbWFydFRhYmxlR3JvdXAoZGF0YW1hcnRUYWJsZUdyb3VwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRCYXNlKGRhdGFtYXJ0VGFibGVHcm91cCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2l0aEhlYWRlckZvb3RlcihkYXRhbWFydFRhYmxlR3JvdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihkYXRhbWFydFRhYmxlR3JvdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5TT01FX0dSSUQ6IHsKKwkJCQlTb21lR3JpZCBzb21lR3JpZCA9IChTb21lR3JpZCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNvbWVHcmlkKHNvbWVHcmlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoc29tZUdyaWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9IRUFERVI6IHsKKwkJCQlEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgZGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyID0gKERhdGFtYXJ0VGFibGVHcm91cEhlYWRlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcihkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lR3JpZChkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZShkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihkYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9HUk9VUF9GT09URVI6IHsKKwkJCQlEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyID0gKERhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcihkYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lR3JpZChkYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdpdGhTdHlsZShkYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihkYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRBTUFSVF9UQUJMRV9ERVRBSUw6IHsKKwkJCQlEYXRhbWFydFRhYmxlRGV0YWlsIGRhdGFtYXJ0VGFibGVEZXRhaWwgPSAoRGF0YW1hcnRUYWJsZURldGFpbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFtYXJ0VGFibGVEZXRhaWwoZGF0YW1hcnRUYWJsZURldGFpbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2l0aFN0eWxlKGRhdGFtYXJ0VGFibGVEZXRhaWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihkYXRhbWFydFRhYmxlRGV0YWlsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFk6IHsKKwkJCQlEYXRhbWFydFRhYmxlUHJvcGVydHkgZGF0YW1hcnRUYWJsZVByb3BlcnR5ID0gKERhdGFtYXJ0VGFibGVQcm9wZXJ0eSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFtYXJ0VGFibGVQcm9wZXJ0eShkYXRhbWFydFRhYmxlUHJvcGVydHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGF0YW1hcnRUYWJsZVByb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXaXRoU3R5bGUoZGF0YW1hcnRUYWJsZVByb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZGF0YW1hcnRUYWJsZVByb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfRk9STUFUVEVSOiB7CisJCQkJVGFibGVGb3JtYXR0ZXIgdGFibGVGb3JtYXR0ZXIgPSAoVGFibGVGb3JtYXR0ZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZUZvcm1hdHRlcih0YWJsZUZvcm1hdHRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFOiB7CisJCQkJVGFibGVJbWFnZSB0YWJsZUltYWdlID0gKFRhYmxlSW1hZ2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZUltYWdlKHRhYmxlSW1hZ2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZUltYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVkFMVUVfRUxFTUVOVDogeworCQkJCVRhYmxlVmFsdWVFbGVtZW50IHRhYmxlVmFsdWVFbGVtZW50ID0gKFRhYmxlVmFsdWVFbGVtZW50KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVWYWx1ZUVsZW1lbnQodGFibGVWYWx1ZUVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZVZhbHVlRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BST1BFUlRZOiB7CisJCQkJVGFibGVQcm9wZXJ0eSB0YWJsZVByb3BlcnR5ID0gKFRhYmxlUHJvcGVydHkpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZVByb3BlcnR5KHRhYmxlUHJvcGVydHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlVmFsdWVFbGVtZW50KHRhYmxlUHJvcGVydHkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZVByb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfQUdHUkVHQVRJT046IHsKKwkJCQlUYWJsZUFnZ3JlZ2F0aW9uIHRhYmxlQWdncmVnYXRpb24gPSAoVGFibGVBZ2dyZWdhdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlQWdncmVnYXRpb24odGFibGVBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGFibGVWYWx1ZUVsZW1lbnQodGFibGVBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlQWdncmVnYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9CQVNFX0FHR1JFR0FUSU9OOiB7CisJCQkJVGFibGVCYXNlQWdncmVnYXRpb24gdGFibGVCYXNlQWdncmVnYXRpb24gPSAoVGFibGVCYXNlQWdncmVnYXRpb24pdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZUJhc2VBZ2dyZWdhdGlvbih0YWJsZUJhc2VBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlQmFzZUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfUFVSRV9BR0dSRUdBVElPTjogeworCQkJCVRhYmxlUHVyZUFnZ3JlZ2F0aW9uIHRhYmxlUHVyZUFnZ3JlZ2F0aW9uID0gKFRhYmxlUHVyZUFnZ3JlZ2F0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVQdXJlQWdncmVnYXRpb24odGFibGVQdXJlQWdncmVnYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uKHRhYmxlUHVyZUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVQdXJlQWdncmVnYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9VTkFSWV9BR0dSRUdBVElPTjogeworCQkJCVRhYmxlVW5hcnlBZ2dyZWdhdGlvbiB0YWJsZVVuYXJ5QWdncmVnYXRpb24gPSAoVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKHRhYmxlVW5hcnlBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGFibGVCYXNlQWdncmVnYXRpb24odGFibGVVbmFyeUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVVbmFyeUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT046IHsKKwkJCQlUYWJsZU11bHRpcGxlQWdncmVnYXRpb24gdGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uID0gKFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbih0YWJsZU11bHRpcGxlQWdncmVnYXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uKHRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTjogeworCQkJCVRhYmxlQmluYXJ5QWdncmVnYXRpb24gdGFibGVCaW5hcnlBZ2dyZWdhdGlvbiA9IChUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbih0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUYWJsZUJhc2VBZ2dyZWdhdGlvbih0YWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVCaW5hcnlBZ2dyZWdhdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lOVEVSVkFMOiB7CisJCQkJVGFibGVJbnRlcnZhbCB0YWJsZUludGVydmFsID0gKFRhYmxlSW50ZXJ2YWwpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZUludGVydmFsKHRhYmxlSW50ZXJ2YWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZUludGVydmFsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTlVNQkVSX0lOVEVSVkFMOiB7CisJCQkJVGFibGVOdW1iZXJJbnRlcnZhbCB0YWJsZU51bWJlckludGVydmFsID0gKFRhYmxlTnVtYmVySW50ZXJ2YWwpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZU51bWJlckludGVydmFsKHRhYmxlTnVtYmVySW50ZXJ2YWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlSW50ZXJ2YWwodGFibGVOdW1iZXJJbnRlcnZhbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlTnVtYmVySW50ZXJ2YWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTDogeworCQkJCVRhYmxlRGF0ZURheUludGVydmFsIHRhYmxlRGF0ZURheUludGVydmFsID0gKFRhYmxlRGF0ZURheUludGVydmFsKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVEYXRlRGF5SW50ZXJ2YWwodGFibGVEYXRlRGF5SW50ZXJ2YWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlSW50ZXJ2YWwodGFibGVEYXRlRGF5SW50ZXJ2YWwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZURhdGVEYXlJbnRlcnZhbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0xPT0tVUDogeworCQkJCVRhYmxlTG9va3VwIHRhYmxlTG9va3VwID0gKFRhYmxlTG9va3VwKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVMb29rdXAodGFibGVMb29rdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZUxvb2t1cCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVA6IHsKKwkJCQlUYWJsZU51bWJlckxvb2t1cCB0YWJsZU51bWJlckxvb2t1cCA9IChUYWJsZU51bWJlckxvb2t1cCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlTnVtYmVyTG9va3VwKHRhYmxlTnVtYmVyTG9va3VwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUYWJsZUxvb2t1cCh0YWJsZU51bWJlckxvb2t1cCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlTnVtYmVyTG9va3VwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfU1RSSU5HX0xPT0tVUDogeworCQkJCVRhYmxlU3RyaW5nTG9va3VwIHRhYmxlU3RyaW5nTG9va3VwID0gKFRhYmxlU3RyaW5nTG9va3VwKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVTdHJpbmdMb29rdXAodGFibGVTdHJpbmdMb29rdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlTG9va3VwKHRhYmxlU3RyaW5nTG9va3VwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVTdHJpbmdMb29rdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9MT09LVVA6IHsKKwkJCQlUYWJsZURhdGVEYXlMb29rdXAgdGFibGVEYXRlRGF5TG9va3VwID0gKFRhYmxlRGF0ZURheUxvb2t1cCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlRGF0ZURheUxvb2t1cCh0YWJsZURhdGVEYXlMb29rdXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVRhYmxlTG9va3VwKHRhYmxlRGF0ZURheUxvb2t1cCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlRGF0ZURheUxvb2t1cCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1JBTkdFX0VMRU1FTlQ6IHsKKwkJCQlUYWJsZVJhbmdlRWxlbWVudCB0YWJsZVJhbmdlRWxlbWVudCA9IChUYWJsZVJhbmdlRWxlbWVudCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlUmFuZ2VFbGVtZW50KHRhYmxlUmFuZ2VFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVSYW5nZUVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9URVhUX0NPTE9SOiB7CisJCQkJVGFibGVUZXh0Q29sb3IgdGFibGVUZXh0Q29sb3IgPSAoVGFibGVUZXh0Q29sb3IpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZVRleHRDb2xvcih0YWJsZVRleHRDb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGFibGVSYW5nZUVsZW1lbnQodGFibGVUZXh0Q29sb3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZVRleHRDb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0NFTExfQ09MT1I6IHsKKwkJCQlUYWJsZUNlbGxDb2xvciB0YWJsZUNlbGxDb2xvciA9IChUYWJsZUNlbGxDb2xvcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlQ2VsbENvbG9yKHRhYmxlQ2VsbENvbG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUYWJsZVJhbmdlRWxlbWVudCh0YWJsZUNlbGxDb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlQ2VsbENvbG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTjogeworCQkJCVRhYmxlSWNvbiB0YWJsZUljb24gPSAoVGFibGVJY29uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGFibGVJY29uKHRhYmxlSWNvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGFibGVSYW5nZUVsZW1lbnQodGFibGVJY29uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIodGFibGVJY29uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVFJFTkQ6IHsKKwkJCQlUYWJsZVRyZW5kIHRhYmxlVHJlbmQgPSAoVGFibGVUcmVuZCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRhYmxlVHJlbmQodGFibGVUcmVuZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVGFibGVSYW5nZUVsZW1lbnQodGFibGVUcmVuZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKHRhYmxlVHJlbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9UT09MVElQOiB7CisJCQkJVGFibGVUb29sdGlwIHRhYmxlVG9vbHRpcCA9IChUYWJsZVRvb2x0aXApdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VUYWJsZVRvb2x0aXAodGFibGVUb29sdGlwKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VUYWJsZVJhbmdlRWxlbWVudCh0YWJsZVRvb2x0aXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcih0YWJsZVRvb2x0aXApOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEOiB7CisJCQkJR3JpZCBncmlkID0gKEdyaWQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VHcmlkKGdyaWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2UoZ3JpZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChncmlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTb21lR3JpZChncmlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZ3JpZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkdSSURfUk9XOiB7CisJCQkJR3JpZFJvdyBncmlkUm93ID0gKEdyaWRSb3cpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VHcmlkUm93KGdyaWRSb3cpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydEJhc2UoZ3JpZFJvdyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV2l0aFN0eWxlKGdyaWRSb3cpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlcG9ydExhenlSZXNvbHZlcihncmlkUm93KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9DRUxMOiB7CisJCQkJR3JpZENlbGwgZ3JpZENlbGwgPSAoR3JpZENlbGwpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VHcmlkQ2VsbChncmlkQ2VsbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVwb3J0QmFzZShncmlkQ2VsbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGFpbmVyKGdyaWRDZWxsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZXBvcnRMYXp5UmVzb2x2ZXIoZ3JpZENlbGwpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydCBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydCBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlcG9ydE1vZGVsKFJlcG9ydE1vZGVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydCBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVwb3J0TGF6eVJlc29sdmVyKFJlcG9ydExhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0IEJhc2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQgQmFzZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlcG9ydEJhc2UoUmVwb3J0QmFzZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0IFBhY2thZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlcG9ydFBhY2thZ2UoUmVwb3J0UGFja2FnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFnZSBUZW1wbGF0ZXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWdlIFRlbXBsYXRlczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVBhZ2VUZW1wbGF0ZXMoUGFnZVRlbXBsYXRlcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U29tZSBGb3JtYXRzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U29tZSBGb3JtYXRzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU29tZUZvcm1hdHMoU29tZUZvcm1hdHMgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbG9yczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbG9yczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNvbG9ycyhDb2xvcnMgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvbnRzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Rm9udHM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VGb250cyhGb250cyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVkaWFzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVkaWFzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTWVkaWFzKE1lZGlhcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3R5bGVzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3R5bGVzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU3R5bGVzKFN0eWxlcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFnZSBUZW1wbGF0ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhZ2UgVGVtcGxhdGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQYWdlVGVtcGxhdGUoUGFnZVRlbXBsYXRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db2xvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ29sb3IoQ29sb3Igb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb250PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRm9udChGb250IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb250IEZhbWlseTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRm9udEZhbWlseShGb250RmFtaWx5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CdWlsZCBJbiBGb250IEZhbWlseTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJ1aWxkIEluIEZvbnQgRmFtaWx5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQnVpbGRJbkZvbnRGYW1pbHkoQnVpbGRJbkZvbnRGYW1pbHkgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBGb250IEZhbWlseTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBGb250IEZhbWlseTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUN1c3RvbUZvbnRGYW1pbHkoQ3VzdG9tRm9udEZhbWlseSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVkaWE8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZWRpYTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZU1lZGlhKE1lZGlhIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb3JkZXIgU3R5bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb3JkZXIgU3R5bGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VCb3JkZXJTdHlsZShCb3JkZXJTdHlsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZSBTdHlsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2UgU3R5bGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VCYXNlU3R5bGUoQmFzZVN0eWxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZWRpYSBTdHlsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lZGlhIFN0eWxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTWVkaWFTdHlsZShNZWRpYVN0eWxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdHlsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0eWxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU3R5bGUoU3R5bGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNvbWUgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U29tZSBGb3JtYXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTb21lRm9ybWF0KFNvbWVGb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVvbW8gRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VW9tbyBGb3JtYXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VVb21vRm9ybWF0KFVvbW9Gb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk51bWJlciBGb3JtYXQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OdW1iZXIgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTnVtYmVyRm9ybWF0KE51bWJlckZvcm1hdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VycmVuY3kgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ3VycmVuY3lGb3JtYXQoQ3VycmVuY3lGb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGUgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0ZSBGb3JtYXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VEYXRlRm9ybWF0KERhdGVGb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGUgVGltZSBGb3JtYXQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRlIFRpbWUgRm9ybWF0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRGF0ZVRpbWVGb3JtYXQoRGF0ZVRpbWVGb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWUgRm9ybWF0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBGb3JtYXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VUaW1lRm9ybWF0KFRpbWVGb3JtYXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydCBEZXNpZ248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQgRGVzaWduPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVwb3J0RGVzaWduKFJlcG9ydERlc2lnbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0IERlc2lnbiBGaWxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0IERlc2lnbiBGaWxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVwb3J0RGVzaWduRmlsZShSZXBvcnREZXNpZ25GaWxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXBvcnQgRGVzaWduIFRlbXBsYXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0IERlc2lnbiBUZW1wbGF0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlcG9ydERlc2lnblRlbXBsYXRlKFJlcG9ydERlc2lnblRlbXBsYXRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250YWluZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250YWluZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDb250YWluZXIoQ29udGFpbmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWdlIEhlYWRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhZ2UgSGVhZGVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGFnZUhlYWRlcihQYWdlSGVhZGVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWdlIERldGFpbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhZ2UgRGV0YWlsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGFnZURldGFpbChQYWdlRGV0YWlsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWdlIEZvb3RlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhZ2UgRm9vdGVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGFnZUZvb3RlcihQYWdlRm9vdGVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2l0aCBTdHlsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldpdGggU3R5bGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VXaXRoU3R5bGUoV2l0aFN0eWxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGl0bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaXRsZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRpdGxlKFRpdGxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdWIgVGl0bGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdWIgVGl0bGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTdWJUaXRsZShTdWJUaXRsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3ViIFN1YiBUaXRsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1YiBTdWIgVGl0bGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTdWJTdWJUaXRsZShTdWJTdWJUaXRsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGFiZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MYWJlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUxhYmVsKExhYmVsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGV4dDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRleHQoVGV4dCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0byBUZXh0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0byBUZXh0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQXV0b1RleHQoQXV0b1RleHQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1hZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJbWFnZShJbWFnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2l0aCBIZWFkZXIgRm9vdGVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlV2l0aEhlYWRlckZvb3RlcihXaXRoSGVhZGVyRm9vdGVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhbWFydCBUYWJsZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRGF0YW1hcnRUYWJsZShEYXRhbWFydFRhYmxlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhbWFydCBUYWJsZSBHcm91cDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlRGF0YW1hcnRUYWJsZUdyb3VwKERhdGFtYXJ0VGFibGVHcm91cCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U29tZSBHcmlkPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U29tZSBHcmlkPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU29tZUdyaWQoU29tZUdyaWQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEhlYWRlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcihEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIEdyb3VwIEZvb3RlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcihEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGFtYXJ0IFRhYmxlIERldGFpbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFtYXJ0VGFibGVEZXRhaWwoRGF0YW1hcnRUYWJsZURldGFpbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YW1hcnQgVGFibGUgUHJvcGVydHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhbWFydCBUYWJsZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZURhdGFtYXJ0VGFibGVQcm9wZXJ0eShEYXRhbWFydFRhYmxlUHJvcGVydHkgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEZvcm1hdHRlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlRm9ybWF0dGVyKFRhYmxlRm9ybWF0dGVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBJbWFnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEltYWdlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVJbWFnZShUYWJsZUltYWdlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBWYWx1ZSBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgVmFsdWUgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlVmFsdWVFbGVtZW50KFRhYmxlVmFsdWVFbGVtZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIFByb3BlcnR5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVQcm9wZXJ0eShUYWJsZVByb3BlcnR5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVBZ2dyZWdhdGlvbihUYWJsZUFnZ3JlZ2F0aW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBCYXNlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgQmFzZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uKFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBQdXJlIEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgUHVyZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uKFRhYmxlUHVyZUFnZ3JlZ2F0aW9uIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBVbmFyeSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIFVuYXJ5IEFnZ3JlZ2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKFRhYmxlVW5hcnlBZ2dyZWdhdGlvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgTXVsdGlwbGUgQWdncmVnYXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBNdWx0aXBsZSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbihUYWJsZU11bHRpcGxlQWdncmVnYXRpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIEJpbmFyeSBBZ2dyZWdhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlQmluYXJ5QWdncmVnYXRpb24oVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgSW50ZXJ2YWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBJbnRlcnZhbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlSW50ZXJ2YWwoVGFibGVJbnRlcnZhbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgTnVtYmVyIEludGVydmFsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVOdW1iZXJJbnRlcnZhbChUYWJsZU51bWJlckludGVydmFsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBEYXRlIERheSBJbnRlcnZhbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIERhdGUgRGF5IEludGVydmFsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVEYXRlRGF5SW50ZXJ2YWwoVGFibGVEYXRlRGF5SW50ZXJ2YWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIExvb2t1cDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlTG9va3VwKFRhYmxlTG9va3VwIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBOdW1iZXIgTG9va3VwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgTnVtYmVyIExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlTnVtYmVyTG9va3VwKFRhYmxlTnVtYmVyTG9va3VwIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBTdHJpbmcgTG9va3VwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgU3RyaW5nIExvb2t1cDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlU3RyaW5nTG9va3VwKFRhYmxlU3RyaW5nTG9va3VwIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBEYXRlIERheSBMb29rdXA8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBEYXRlIERheSBMb29rdXA8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VUYWJsZURhdGVEYXlMb29rdXAoVGFibGVEYXRlRGF5TG9va3VwIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBSYW5nZSBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgUmFuZ2UgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlUmFuZ2VFbGVtZW50KFRhYmxlUmFuZ2VFbGVtZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBUZXh0IENvbG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgVGV4dCBDb2xvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlVGV4dENvbG9yKFRhYmxlVGV4dENvbG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBDZWxsIENvbG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgQ2VsbCBDb2xvcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlQ2VsbENvbG9yKFRhYmxlQ2VsbENvbG9yIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBJY29uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgSWNvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVRhYmxlSWNvbihUYWJsZUljb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIFRyZW5kPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFibGUgVHJlbmQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VUYWJsZVRyZW5kKFRhYmxlVHJlbmQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhYmxlIFRvb2x0aXA8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWJsZSBUb29sdGlwPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGFibGVUb29sdGlwKFRhYmxlVG9vbHRpcCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JpZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyaWQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VHcmlkKEdyaWQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyaWQgUm93PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JpZCBSb3c8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VHcmlkUm93KEdyaWRSb3cgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyaWQgQ2VsbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyaWQgQ2VsbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUdyaWRDZWxsKEdyaWRDZWxsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTExhenlSZXNvbHZlcihMTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MUGFja2FnZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxQYWNrYWdlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTFBhY2thZ2UoTFBhY2thZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vUmVwb3J0RFNMU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5OGFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9tb2RlbC9SZXBvcnREU0wueGNvcmUgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9tb2RlbC9SZXBvcnREU0wueGNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmNlNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL21vZGVsL1JlcG9ydERTTC54Y29yZQpAQCAtMCwwICsxLDU4MSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitAR2VuTW9kZWwoZmlsZUV4dGVuc2lvbnM9InJlcG9ydCIpCitAR2VuTW9kZWwobW9kZWxOYW1lPSJSZXBvcnREU0wiKQorQEdlbk1vZGVsKHByZWZpeD0iUmVwb3J0RFNMIikKK0BHZW5Nb2RlbCh1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIikKK0BHZW5Nb2RlbChjb3B5cmlnaHRUZXh0PSJDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorCisgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgIAorIENvbnRyaWJ1dG9yczogIAorIAkJQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAiKQorQEVjb3JlKG5zVVJJPSJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMIikKK0BFY29yZShuc1ByZWZpeD0icmVwb3J0ZHNsIikKK0BFY29yZShyb290UGFja2FnZT0icmVwb3J0ZHNsIikKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YSW1wb3J0U2VjdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpLkVjb3JlVXRpbDMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25Ub29sYmFyCisKK2NsYXNzIFJlcG9ydE1vZGVsIHsKKwljb250YWlucyBSZXBvcnRQYWNrYWdlW10gcGNrZworfQorCit0eXBlIEludGVybmFsRU9iamVjdCB3cmFwcyBJbnRlcm5hbEVPYmplY3QKKworY2xhc3MgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwlvcCBFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KSB7CisJCXJldHVybiBFY29yZVV0aWwzLnJlc29sdmUocHJveHksIHRoaXMuZVJlc291cmNlKCkucmVzb3VyY2VTZXQpOworCX0KK30KKworY2xhc3MgUmVwb3J0QmFzZSBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJU3RyaW5nIG5hbWUKK30KKworY2xhc3MgUmVwb3J0UGFja2FnZSBleHRlbmRzIExQYWNrYWdlIHsKKwljb250YWlucyBYSW1wb3J0U2VjdGlvbiBpbXBvcnRTZWN0aW9uCisJU3RyaW5nIGV4dGVybmFsQ3NzVVJJCisJU3RyaW5nIGV4dGVybmFsQ3NzVVJJQnVuZGxlCisJY29udGFpbnMgUGFnZVRlbXBsYXRlcyBwYWdldGVtcGxhdGVzCisJY29udGFpbnMgU29tZUZvcm1hdHMgZm9ybWF0dGVycworCWNvbnRhaW5zIENvbG9ycyBjb2xvcnMKKwljb250YWlucyBGb250cyBmb250cworICAgIGNvbnRhaW5zIE1lZGlhcyBtZWRpYXMKKwljb250YWlucyBTdHlsZXMgc3R5bGVzCisJY29udGFpbnMgUmVwb3J0W10gcmVwb3J0cworfQorCitjbGFzcyBQYWdlVGVtcGxhdGVzIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwljb250YWlucyBQYWdlVGVtcGxhdGVbXSBwYWdldGVtcGxhdGVzCit9CisKK2NsYXNzIFNvbWVGb3JtYXRzIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwljb250YWlucyBTb21lRm9ybWF0W10gZm9ybWF0dGVycworfQorCitjbGFzcyBDb2xvcnMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCWNvbnRhaW5zIENvbG9yW10gY29sb3JzCit9CisKK2NsYXNzIEZvbnRzIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwljb250YWlucyBGb250W10gZm9udHMKK30KKworY2xhc3MgTWVkaWFzIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwljb250YWlucyBNZWRpYVtdIG1lZGlhcworfQorCitjbGFzcyBTdHlsZXMgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCWNvbnRhaW5zIFN0eWxlW10gc3R5bGVzCit9CisKK2NsYXNzIFBhZ2VUZW1wbGF0ZSBleHRlbmRzIFJlcG9ydEJhc2UgeworCVBhZ2VTaXplRW51bSBzaXplCisJT3JpZW50YXRpb25FbnVtIG9yaWVudGF0aW9uCisJZG91YmxlIHRvcE1hcmdpblZhbHVlCisJVW5pdEVudW0gdG9wTWFyZ2luVW5pdAorCWRvdWJsZSBsZWZ0TWFyZ2luVmFsdWUKKwlVbml0RW51bSBsZWZ0TWFyZ2luVW5pdAorCWRvdWJsZSBib3R0b21NYXJnaW5WYWx1ZQorCVVuaXRFbnVtIGJvdHRvbU1hcmdpblVuaXQKKwlkb3VibGUgcmlnaHRNYXJnaW5WYWx1ZQorCVVuaXRFbnVtIHJpZ2h0TWFyZ2luVW5pdAorCWNvbnRhaW5zIFBhZ2VIZWFkZXIgaGVhZGVyCisJY29udGFpbnMgUGFnZUZvb3RlciBmb290ZXIKK30KKworZW51bSBVbml0RW51bXsKKwlOVUxMIGFzICcnCisJTU0gYXMgJ21tJworCUNNIGFzICdjbScKKwlQVCBhcyAncHQnCisJSU4gYXMgJ2luY2gnCisJUEMgYXMgJ3BjJworCUVNIGFzICdlbScKKwlFWCBhcyAnZXgnCisJUFggYXMgJ3B4JworCVBFUkNFTlRBR0UgYXMgJyUnCit9CisKK2VudW0gUGFnZVNpemVFbnVteworCUE0IGFzICdhNCcKKwlBMyBhcyAnYTMnCisJQTUgYXMgJ2E1JworCVVTX0xFVFRFUiBhcyAndXMtbGV0dGVyJworCVVTX0xFR0FMIGFzICd1cy1sZWdhbCcKKwlVU19MRURHRVIgYXMgJ3VzLWxlZGdlcicKKwlVU19TVVBFUl9CIGFzICd1cy1zdXBlci1iJworfQorCitlbnVtIE9yaWVudGF0aW9uRW51bXsKKwlQT1JUUkFJVCBhcyAncG9ydHJhaXQnCisJTEFORFNDQVBFIGFzICdsYW5kc2NhcGUnCit9CisKK2NsYXNzIENvbG9yIGV4dGVuZHMgUmVwb3J0QmFzZSB7CisJU3RyaW5nIGNvbG9yCisJcmVmZXJzIENvbG9yIGJhc2Vjb2xvcgorCUludGVnZXIgZGFya2Vuc2J5CisJSW50ZWdlciBsaWdodGVuc2J5CisJSW50ZWdlciB0cmFuc2Zvcm1zYnkKKwlyZWZlcnMgQ29sb3IgdGFyZ2V0Y29sb3IKK30KKworY2xhc3MgRm9udCBleHRlbmRzIFJlcG9ydEJhc2UgeworCXJlZmVycyBGb250IF5leHRlbmRzCisJY29udGFpbnMgRm9udEZhbWlseSBmYW1pbHkKKwlGb250U3R5bGVFbnVtIHN0eWxlCisJYm9vbGVhbiBib2xkCisJZG91YmxlIHNpemV2YWx1ZQorCVVuaXRFbnVtIHNpemV1bml0Cit9CisKK2VudW0gRm9udFN0eWxlRW51bSB7CisJTk9STUFMIGFzICdub3JtYWwnCisJSVRBTElDIGFzICdpdGFsaWMnCisJT0JMSVFVRSBhcyAnb2JsaXF1ZScKK30KKworaW50ZXJmYWNlIEZvbnRGYW1pbHkgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJ7fQorCitjbGFzcyBCdWlsZEluRm9udEZhbWlseSBleHRlbmRzIEZvbnRGYW1pbHkgeworCUJ1aWxkSW5Gb250RmFtaWx5RW51bSBjdXN0b20KK30KKworZW51bSBCdWlsZEluRm9udEZhbWlseUVudW0geworCU1PTk9TUEFDRSBhcyAnbW9ub3NwYWNlJworCVNBTlNfU0VSSUYgYXMgJ3NhbnMtc2VyaWYnCisJU0VSSUYgYXMgJ3NlcmlmJworfQorCitjbGFzcyBDdXN0b21Gb250RmFtaWx5IGV4dGVuZHMgRm9udEZhbWlseSB7CisJU3RyaW5nIGN1c3RvbQorfQorCitjbGFzcyBNZWRpYSBleHRlbmRzIFJlcG9ydEJhc2UgeworfQorCitjbGFzcyBCb3JkZXJTdHlsZSBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisgICAgQm9yZGVyVHlwZUVudW0gXnR5cGUKKwlkb3VibGUgd2lkdGh2YWx1ZQorCVVuaXRFbnVtIHdpZHRodW5pdAorICAgIHJlZmVycyBDb2xvciBjb2xvcgorfQorCitlbnVtIEJvcmRlclR5cGVFbnVtIHsKKyAgICBOT05FIGFzICdub25lJworICAgIFNPTElEIGFzICdzb2xpZCcKKyAgICBET1RURUQgYXMgJ2RvdHRlZCcKKyAgICBEQVNIRUQgYXMgJ2Rhc2hlZCcKKyAgICBET1VCTEUgYXMgJ2RvdWJsZScKKyAgICBHUk9PVkUgYXMgJ2dyb292ZScKKyAgICBSSURHRSBhcyAncmlkZ2UnCisgICAgSU5TRVQgYXMgJ2luc2V0JworICAgIE9VVFNFVCBhcyAnb3V0c2V0JworfQorCitjbGFzcyBCYXNlU3R5bGUgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCXJlZmVycyBTb21lRm9ybWF0IGZvcm1hdAorCXJlZmVycyBGb250IGZvbnQKKwlyZWZlcnMgQ29sb3IgYmFja2dyb3VuZGNvbG9yCisJcmVmZXJzIENvbG9yIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUKKwlyZWZlcnMgQ29sb3IgdGV4dGNvbG9yCisJVGV4dEFsaWduRW51bSB0ZXh0YWxpZ24KKyAgICBjb250YWlucyBCb3JkZXJTdHlsZSBib3JkZXJUb3AKKyAgICBjb250YWlucyBCb3JkZXJTdHlsZSBib3JkZXJCb3R0b20KKyAgICBjb250YWlucyBCb3JkZXJTdHlsZSBib3JkZXJMZWZ0CisgICAgY29udGFpbnMgQm9yZGVyU3R5bGUgYm9yZGVyUmlnaHQKKwlkb3VibGUgcGFkZGluZ1RvcFZhbHVlCisJVW5pdEVudW0gcGFkZGluZ1RvcFVuaXQKKwlkb3VibGUgcGFkZGluZ0JvdHRvbVZhbHVlCisJVW5pdEVudW0gcGFkZGluZ0JvdHRvbVVuaXQKKwlkb3VibGUgcGFkZGluZ0xlZnRWYWx1ZQorCVVuaXRFbnVtIHBhZGRpbmdMZWZ0VW5pdAorCWRvdWJsZSBwYWRkaW5nUmlnaHRWYWx1ZQorCVVuaXRFbnVtIHBhZGRpbmdSaWdodFVuaXQKKwlkb3VibGUgbWFyZ2luVG9wVmFsdWUKKwlVbml0RW51bSBtYXJnaW5Ub3BVbml0CisJZG91YmxlIG1hcmdpbkxlZnRWYWx1ZQorCVVuaXRFbnVtIG1hcmdpbkxlZnRVbml0CisJZG91YmxlIG1hcmdpbkJvdHRvbVZhbHVlCisJVW5pdEVudW0gbWFyZ2luQm90dG9tVW5pdAorCWRvdWJsZSBtYXJnaW5SaWdodFZhbHVlCisJVW5pdEVudW0gbWFyZ2luUmlnaHRVbml0Cit9CisKK2NsYXNzIE1lZGlhU3R5bGUgZXh0ZW5kcyBCYXNlU3R5bGUgeworICAgIHJlZmVycyBNZWRpYSBtZWRpYQorfQorCitjbGFzcyBTdHlsZSBleHRlbmRzIFJlcG9ydEJhc2UsIEJhc2VTdHlsZSB7CisJcmVmZXJzIFN0eWxlIF5leHRlbmRzCisJY29udGFpbnMgTWVkaWFTdHlsZVtdIG1lZGlhc3R5bGVzCit9CisKK2VudW0gVGV4dEFsaWduRW51bSB7CisJTlVMTCBhcyAnJworCUxFRlQgYXMgJ2xlZnQnCisJQ0VOVEVSIGFzICdjZW50ZXInCisJUklHSFQgYXMgJ3JpZ2h0JworfQorCitjbGFzcyBTb21lRm9ybWF0IGV4dGVuZHMgUmVwb3J0QmFzZSB7CisJU3RyaW5nIHVpX3BhdHRlcm4KKwlTdHJpbmcgcmVwb3J0X3BhdHRlcm4KKwlUZXh0QWxpZ25FbnVtIHRleHRhbGlnbgorfQorCitjbGFzcyBVb21vRm9ybWF0IGV4dGVuZHMgU29tZUZvcm1hdCB7Cit9CisKK2NsYXNzIE51bWJlckZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCU51bWJlckZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfY2F0ZWdvcnkKK30KKworZW51bSBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0geworCVVORk9STUFUVEVEIGFzICd1bmZvcm1hdHRlZCcKKwlHRU5FUkFMX05VTUJFUiBhcyAnZ2VuZXJhbC1udW1iZXInCisJRklYRUQgYXMgJ2ZpeGVkJworCVBFUkNFTlQgYXMgJ3BlcmNlbnQnCisJU0NJRU5USUZJQyBhcyAnc2NpZW50aWZpYycKKwlDVVNUT00gYXMgJ2N1c3RvbScKK30KKworY2xhc3MgQ3VycmVuY3lGb3JtYXQgZXh0ZW5kcyBTb21lRm9ybWF0IHsKKwlDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfY2F0ZWdvcnkKK30KKworZW51bSBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSB7CisJVU5GT1JNQVRURUQgYXMgJ3VuZm9ybWF0dGVkJworCUNVUlJFTkNZIGFzICdjdXJyZW5jeScKKwlDVVNUT00gYXMgJ2N1c3RvbScKK30KKworY2xhc3MgRGF0ZUZvcm1hdCBleHRlbmRzIFNvbWVGb3JtYXQgeworCURhdGVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X2NhdGVnb3J5Cit9CisKK2VudW0gRGF0ZUZvcm1hdENhdGVnb3J5RW51bSB7CisJQ1VTVE9NIGFzICdjdXN0b20nCit9CisKK2NsYXNzIERhdGVUaW1lRm9ybWF0IGV4dGVuZHMgU29tZUZvcm1hdCB7CisJRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X2NhdGVnb3J5Cit9CisKK2VudW0gRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0geworCUNVU1RPTSBhcyAnY3VzdG9tJworfQorCitjbGFzcyBUaW1lRm9ybWF0IGV4dGVuZHMgU29tZUZvcm1hdCB7CisJVGltZUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfY2F0ZWdvcnkKK30KKworZW51bSBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHsKKwlDVVNUT00gYXMgJ2N1c3RvbScKK30KKworY2xhc3MgUmVwb3J0IGV4dGVuZHMgUmVwb3J0QmFzZSB7CisJYm9vbGVhbiBkZXNjcmlwdGlvbgorCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlCisJcmVmZXJzIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydFJlZgorCVJlbmRlcmluZ0VudW0gcmVuZGVyaW5nCisJU3RyaW5nIGV4dGVybmFsQ3NzVVJJCisJU3RyaW5nIGV4dGVybmFsQ3NzVVJJQnVuZGxlCisJcmVmZXJzIFBhZ2VUZW1wbGF0ZSBwYWdlVGVtcGxhdGUKKyAgICByZWZlcnMgTWVkaWEgbWVkaWEKKwlyZWZlcnMgQWN0aW9uVG9vbGJhciB0b29sYmFyCisJY29udGFpbnMgUmVwb3J0RGVzaWduIGRlc2lnbgorfQorCitpbnRlcmZhY2UgUmVwb3J0RGVzaWduIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHt9CisKK2NsYXNzIFJlcG9ydERlc2lnbkZpbGUgZXh0ZW5kcyBSZXBvcnREZXNpZ24gewkKKwlTdHJpbmcgbmFtZQorfQorCitjbGFzcyBSZXBvcnREZXNpZ25UZW1wbGF0ZSBleHRlbmRzIFJlcG9ydERlc2lnbiB7CisJU3RyaW5nIGRlc2NyaXB0aW9uCisJY29udGFpbnMgUGFnZUhlYWRlciBoZWFkZXIKKwljb250YWlucyBQYWdlRGV0YWlsIGRldGFpbAorCWNvbnRhaW5zIFBhZ2VGb290ZXIgZm9vdGVyCit9CisKK2NsYXNzIENvbnRhaW5lciBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7CisJY29udGFpbnMgRWxlbWVudFtdIGVsZW1lbnRzCit9CisKK2NsYXNzIFBhZ2VIZWFkZXIgZXh0ZW5kcyBDb250YWluZXIgeworCWJvb2xlYW4gc2hvd09uRmlyc3QKKwlkb3VibGUgaGVpZ2h0VmFsdWUKKwlVbml0RW51bSBoZWlnaHRVbml0Cit9CisKK2NsYXNzIFBhZ2VEZXRhaWwgZXh0ZW5kcyBDb250YWluZXIge30KKworY2xhc3MgUGFnZUZvb3RlciBleHRlbmRzIENvbnRhaW5lciB7CisJYm9vbGVhbiBzaG93T25MYXN0CisJZG91YmxlIGhlaWdodFZhbHVlCisJVW5pdEVudW0gaGVpZ2h0VW5pdAorfQorCitpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlciB7fQorCitjbGFzcyBXaXRoU3R5bGUgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCXJlZmVycyBTdHlsZSBzdHlsZQorfQorCitjbGFzcyBUZXh0RWxlbWVudCBleHRlbmRzIEVsZW1lbnQsIFdpdGhTdHlsZSB7CisJU3RyaW5nIHRleHQKK30KKworY2xhc3MgVGl0bGUgZXh0ZW5kcyBUZXh0RWxlbWVudCB7fQorCitjbGFzcyBTdWJUaXRsZSBleHRlbmRzIFRleHRFbGVtZW50IHt9CisKK2NsYXNzIFN1YlN1YlRpdGxlIGV4dGVuZHMgVGV4dEVsZW1lbnQge30KKworY2xhc3MgTGFiZWwgZXh0ZW5kcyBUZXh0RWxlbWVudCB7fQorCitjbGFzcyBUZXh0IGV4dGVuZHMgVGV4dEVsZW1lbnQge30KKworY2xhc3MgQXV0b1RleHQgZXh0ZW5kcyBFbGVtZW50LCBXaXRoU3R5bGUgeworCUF1dG9UZXh0RW51bSBedHlwZQorfQorCitlbnVtIEF1dG9UZXh0RW51bSB7CisJUEFHRV9OVU1CRVIgYXMgInBhZ2UtbnVtYmVyIgorCVRPVEFMX1BBR0UgYXMgInRvdGFsLXBhZ2UiCisJUEFHRV9OVU1CRVJfVU5GSUxURVJFRCBhcyAicGFnZS1udW1iZXItdW5maWx0ZXJlZCIKKwlUT1RBTF9QQUdFX1VORklMVEVSRUQgYXMgInRvdGFsLXBhZ2UtdW5maWx0ZXJlZCIKKwlQQUdFX1ZBUklBQkxFIGFzICJwYWdlLXZhcmlhYmxlIgorfQorCitjbGFzcyBJbWFnZSBleHRlbmRzIEVsZW1lbnQsIFdpdGhTdHlsZSB7CisJSW1hZ2VTaXplRW51bSBzaXplCisJZG91YmxlIHNjYWxlCisJSW1hZ2VTb3VyY2VFbnVtIHNvdXJjZVR5cGUKKwlTdHJpbmcgZmlsZW5hbWUKK30KKworZW51bSBJbWFnZVNpemVFbnVtIHsKKwlTSVpFX1RPX0lNQUdFIGFzICdzaXplLXRvLWltYWdlJworCVNDQUxFX1RPX0lURU0gYXMgJ3NjYWxlLXRvLWl0ZW0nCisJQ0xJUCBhcyAnY2xpcCcKK30KKworZW51bSBJbWFnZVNvdXJjZUVudW0geworCUZJTEUgYXMgJ2ZpbGUnCisJVVJMIGFzICd1cmwnCisJRU1CRUQgYXMgJ2VtYmVkJworfQorCitjbGFzcyBXaXRoSGVhZGVyRm9vdGVyIGV4dGVuZHMgUmVwb3J0TGF6eVJlc29sdmVyIHsKKwlib29sZWFuIGRldGFpbGhlYWRlcgorCXJlZmVycyBTdHlsZSBoZWFkZXJzdHlsZQorCWJvb2xlYW4gZGV0YWlsZm9vdGVyCisJcmVmZXJzIFN0eWxlIGZvb3RlcnN0eWxlCit9CisKK2NsYXNzIERhdGFtYXJ0VGFibGUgZXh0ZW5kcyBSZXBvcnRCYXNlLCBFbGVtZW50LCBXaXRoU3R5bGUsIFdpdGhIZWFkZXJGb290ZXIgeworLy8JcmVmZXJzIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydFJlZgorCWNvbnRhaW5zIERhdGFtYXJ0VGFibGVHcm91cFtdIGdyb3VwcworCWNvbnRhaW5zIERhdGFtYXJ0VGFibGVEZXRhaWwgZGV0YWlsCit9CisKK2NsYXNzIERhdGFtYXJ0VGFibGVHcm91cCBleHRlbmRzIFJlcG9ydEJhc2UsIFdpdGhIZWFkZXJGb290ZXIgeworCXJlZmVycyBEYXRhbWFydFByb3BlcnR5IGdyb3VwaW5nUmVmCisJY29udGFpbnMgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIGhlYWRlcgorCWNvbnRhaW5zIERhdGFtYXJ0VGFibGVHcm91cEZvb3RlciBmb290ZXIKK30KKworY2xhc3MgU29tZUdyaWQgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCWNvbnRhaW5zIEdyaWRSb3dbXSByb3dzCit9CisKK2NsYXNzIERhdGFtYXJ0VGFibGVHcm91cEhlYWRlciBleHRlbmRzIEVsZW1lbnQsIFNvbWVHcmlkLCBXaXRoU3R5bGUgeworfQorCitjbGFzcyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZXh0ZW5kcyBFbGVtZW50LCBTb21lR3JpZCwgV2l0aFN0eWxlIHsKK30KKworY2xhc3MgRGF0YW1hcnRUYWJsZURldGFpbCBleHRlbmRzIFdpdGhTdHlsZSB7CisJY29udGFpbnMgRGF0YW1hcnRUYWJsZVByb3BlcnR5W10gY29sdW1uRm9ybWF0dGVycworfQorCisvKiAhISEgY29weSBmcm9tIHRhYmxlZHNsIC4uLiAqLworY2xhc3MgRGF0YW1hcnRUYWJsZVByb3BlcnR5IGV4dGVuZHMgRWxlbWVudCwgV2l0aFN0eWxlIHsKKwljb250YWlucyBUYWJsZVZhbHVlRWxlbWVudCBjb2x1bW4KKwljb250YWlucyBUYWJsZUludGVydmFsW10gaW50ZXJ2YWxzCisJYm9vbGVhbiBoaWRlTGFiZWxJbnRlcnZhbAorCWNvbnRhaW5zIFRhYmxlTG9va3VwW10gbG9va3VwcworCWJvb2xlYW4gaGlkZUxhYmVsTG9va3VwCisJYm9vbGVhbiBoYXNJbWFnZQorCWNvbnRhaW5zIFRhYmxlSW1hZ2UgaW1hZ2UKK30KKworZW51bSBQdXJlQWdncmVnYXRpb25UeXBlRW51bSB7CisgICAgQ09VTlQgYXMgJ2NvdW50JworICAgIFJVTk5JTkdDT1VOVCBhcyAncnVubmluZy1jb3VudCcKK30KKworZW51bSBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0geworCVNVTSBhcyAnc3VtJworCUFWRSBhcyAnYXZlcmFnZScKKyAgICBNSU4gYXMgJ21pbmltdW0nCisgICAgTUFYIGFzICdtYXhpbXVtJworICAgIFJVTk5JTkdTVU0gYXMgJ3J1bm5pbmctc3VtJworfQorCitlbnVtIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0geworCURJViBhcyAnZGl2aWRlJworfQorCitlbnVtIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSB7CisJQ09OQ0FUIGFzICdjb25jYXQnCit9CisKK2NsYXNzIFRhYmxlRm9ybWF0dGVyeworCVN0cmluZyBmb3JtYXQKK30KKwkKK2NsYXNzIFRhYmxlSW1hZ2UgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJ7CisJU3RyaW5nIGltYWdlUGF0aFBhdHRlcm4KKwlib29sZWFuIGhpZGVJbWFnZUxhYmVsCisJYm9vbGVhbiBoYXNQYXJhbWV0ZXIKKwlib29sZWFuIHJlc2l6ZQorCVN0cmluZyByZXNpemVTdHJpbmcKKwljb250YWlucyBUYWJsZVZhbHVlRWxlbWVudCBpbWFnZVBhdGhQYXJhbWV0ZXIKK30KKwkKK2ludGVyZmFjZSBUYWJsZVZhbHVlRWxlbWVudCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlcnt9CisKK2NsYXNzIFRhYmxlUHJvcGVydHkgZXh0ZW5kcyBUYWJsZVZhbHVlRWxlbWVudHsKKwlyZWZlcnMgRGF0YW1hcnRQcm9wZXJ0eSB2YWx1ZVJlZgorfQorCitjbGFzcyBUYWJsZUFnZ3JlZ2F0aW9uIGV4dGVuZHMgVGFibGVWYWx1ZUVsZW1lbnQgeworCVN0cmluZyB0ZXh0CisJY29udGFpbnMgVGFibGVCYXNlQWdncmVnYXRpb24gYWdncmVnYXRpb24KKwlyZWZlcnMgRGF0YW1hcnRUYWJsZUdyb3VwIG9uR3JvdXAKK30KKworY2xhc3MgVGFibGVCYXNlQWdncmVnYXRpb24gZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXIgeworCXJlZmVycyBEYXRhbWFydFByb3BlcnR5W10gdmFsdWVSZWZzCit9CisKK2NsYXNzIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uIGV4dGVuZHMgVGFibGVCYXNlQWdncmVnYXRpb24geworCVB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIGFnZ3JlZ2F0aW9uCit9CisKK2NsYXNzIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbiBleHRlbmRzIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uIHsKKwlVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gYWdncmVnYXRpb24KK30KKworY2xhc3MgVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIGV4dGVuZHMgVGFibGVCYXNlQWdncmVnYXRpb24geworCU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSBhZ2dyZWdhdGlvbgorfQorCitjbGFzcyBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uIGV4dGVuZHMgVGFibGVCYXNlQWdncmVnYXRpb24geworCUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gYWdncmVnYXRpb24KK30KKworaW50ZXJmYWNlIFRhYmxlSW50ZXJ2YWwgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJ7fQorCQorY2xhc3MgVGFibGVOdW1iZXJJbnRlcnZhbCBleHRlbmRzIFRhYmxlSW50ZXJ2YWx7CisJZG91YmxlIG51bWJlckludGVydmFsVmFsdWUKKwljb250YWlucyBUYWJsZVJhbmdlRWxlbWVudCBudW1iZXJSYW5nZQorfQorCQorY2xhc3MgVGFibGVEYXRlRGF5SW50ZXJ2YWwgZXh0ZW5kcyBUYWJsZUludGVydmFseworCWRvdWJsZSBkYXRlSW50ZXJ2YWxWYWx1ZQorCWNvbnRhaW5zIFRhYmxlUmFuZ2VFbGVtZW50IGRhdGVSYW5nZQorfQorCitpbnRlcmZhY2UgVGFibGVMb29rdXAgZXh0ZW5kcyBSZXBvcnRMYXp5UmVzb2x2ZXJ7fQorCQorY2xhc3MgVGFibGVOdW1iZXJMb29rdXAgZXh0ZW5kcyBUYWJsZUxvb2t1cHsKKwlkb3VibGUgbG9va3VwVmFsdWUKKwljb250YWlucyBUYWJsZVJhbmdlRWxlbWVudCBkaXNjcmV0ZQorfQorCitjbGFzcyBUYWJsZVN0cmluZ0xvb2t1cCBleHRlbmRzIFRhYmxlTG9va3VweworCVN0cmluZyBsb29rdXBWYWx1ZQorCWNvbnRhaW5zIFRhYmxlUmFuZ2VFbGVtZW50IGRpc2NyZXRlCit9CisJCitjbGFzcyBUYWJsZURhdGVEYXlMb29rdXAgZXh0ZW5kcyBUYWJsZUxvb2t1cHsKKwlkb3VibGUgbG9va3VwVmFsdWUKKwljb250YWlucyBUYWJsZVJhbmdlRWxlbWVudCBkaXNjcmV0ZQorfQorCQkKK2ludGVyZmFjZSBUYWJsZVJhbmdlRWxlbWVudCBleHRlbmRzIFJlcG9ydExhenlSZXNvbHZlcnt9CisJCitjbGFzcyBUYWJsZVRleHRDb2xvciBleHRlbmRzIFRhYmxlUmFuZ2VFbGVtZW50eyAKKwlyZWZlcnMgQ29sb3IgY29sb3IKK30KKwkKK2NsYXNzIFRhYmxlQ2VsbENvbG9yIGV4dGVuZHMgVGFibGVSYW5nZUVsZW1lbnR7IAorCXJlZmVycyBDb2xvciBjb2xvcgorfQorCitjbGFzcyBUYWJsZUljb24gZXh0ZW5kcyBUYWJsZVJhbmdlRWxlbWVudHsKKwlTdHJpbmcgaWNvbgorfQorCitjbGFzcyBUYWJsZVRyZW5kIGV4dGVuZHMgVGFibGVSYW5nZUVsZW1lbnR7CisJVHJlbmRJY29uRW51bSBpY29uCit9CisKK2NsYXNzIFRhYmxlVG9vbHRpcCBleHRlbmRzIFRhYmxlUmFuZ2VFbGVtZW50eworCVN0cmluZyB0b29sdGlwCit9CisJCitlbnVtIFRyZW5kSWNvbkVudW17CisJUklTSU5HIGFzICdyaXNpbmcnCisJQkFEUklTSU5HIGFzICdiYWQtcmlzaW5nJworCVNMT1BJTkcgYXMgJ3Nsb3BpbmcnCisJR09PRFNMT1BJTkcgYXMgJ2dvb2Qtc2xvcGluZycKKwlTVEFHTkFUSU5HIGFzICdzdGFnbmF0aW5nJworfQorLyogLi4uIGNvcHkgZnJvbSB0YWJsZWRzbCAhISEgKi8KKworY2xhc3MgR3JpZCBleHRlbmRzIFJlcG9ydEJhc2UsIEVsZW1lbnQsIFNvbWVHcmlkIHt9CisKK2NsYXNzIEdyaWRSb3cgZXh0ZW5kcyBSZXBvcnRCYXNlLCBXaXRoU3R5bGUgeworCWNvbnRhaW5zIEdyaWRDZWxsW10gY2VsbHMKK30KKworY2xhc3MgR3JpZENlbGwgZXh0ZW5kcyBSZXBvcnRCYXNlLCBDb250YWluZXIgeworCWludCBjb2x1bW5zcGFuCit9CisKK2VudW0gUmVuZGVyaW5nRW51bXsKKwlIVE1MIGFzICdodG1sJworCVBERiBhcyAncGRmJworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTE1OGMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisjIAorIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisjICAgCisjICBDb250cmlidXRvcnM6ICAKKyMgIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyMgIAorCitwbHVnaW5OYW1lID0gUmVwb3J0RFNMIE1vZGVsCitwcm92aWRlck5hbWUgPSBMb2V0eiBHbWJIJkNvLktHLCA2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGMyNzQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvcGx1Z2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8cGx1Z2luPgorCis8IS0tCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgPHBhY2thZ2UgCisgICAgICAgdXJpID0gImh0dHA6Ly93d3cub3NicC5kZS94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5yZXBvcnREU0wuUmVwb3J0RFNMUGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9nZW5lcmF0ZWQvUmVwb3J0RFNMLmdlbm1vZGVsIiAvPiAKKwkKKyAgPC9leHRlbnNpb24+CistLT4KKworCisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgICA8IS0tIEBnZW5lcmF0ZWQgUmVwb3J0RFNMIC0tPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xQYWNrYWdlIgorICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL1JlcG9ydERTTC54Y29yZSIvPgorICAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4NDdjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3BvbS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5hZ2dyZWdhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLjwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9SRUFETUUudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmU1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL1JFQURNRS50eHQKQEAgLTAsMCArMSBAQAorZHVtbXkgZmlsZSBuZWVkZWQgZm9yIGdpdCBmb3IgbmVjZXNzYXJ5IGJ1dCBlbXB0eSBkaXJlY3RvcmllcyEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0Fic3RyYWN0UmVwb3J0RFNMUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9BYnN0cmFjdFJlcG9ydERTTFJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGYxMjJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9BYnN0cmFjdFJlcG9ydERTTFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VydmljZS5EZWZhdWx0UnVudGltZU1vZHVsZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOworCisvKioKKyAqIE1hbnVhbCBtb2RpZmljYXRpb25zIGdvIHRvIHtvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREU0xSdW50aW1lTW9kdWxlfQorICovCisgQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXBvcnREU0xSdW50aW1lTW9kdWxlIGV4dGVuZHMgRGVmYXVsdFJ1bnRpbWVNb2R1bGUgeworCisJcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoQmluZGVyIGJpbmRlcikgeworCQlwcm9wZXJ0aWVzID0gdHJ5QmluZFByb3BlcnRpZXMoYmluZGVyLCAib3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMLnByb3BlcnRpZXMiKTsKKwkJc3VwZXIuY29uZmlndXJlKGJpbmRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxhbmd1YWdlTmFtZShCaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChDb25zdGFudHMuTEFOR1VBR0VfTkFNRSkpLnRvSW5zdGFuY2UoIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTCIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVGaWxlRXh0ZW5zaW9ucyhCaW5kZXIgYmluZGVyKSB7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShDb25zdGFudHMuRklMRV9FWFRFTlNJT05TKSA9PSBudWxsKQorCQkJYmluZGVyLmJpbmQoU3RyaW5nLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKENvbnN0YW50cy5GSUxFX0VYVEVOU0lPTlMpKS50b0luc3RhbmNlKCJyZXBvcnQiKTsKKwl9CisJCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNlcmlhbGl6ZXIuU2VyaWFsaXplckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JU2VtYW50aWNTZXF1ZW5jZXI+IGJpbmRJU2VtYW50aWNTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJpYWxpemVyLlJlcG9ydERTTFNlbWFudGljU2VxdWVuY2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVN5bnRhY3RpY1NlcXVlbmNlcj4gYmluZElTeW50YWN0aWNTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJpYWxpemVyLlJlcG9ydERTTFN5bnRhY3RpY1NlcXVlbmNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3Iuc2VyaWFsaXplci5TZXJpYWxpemVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuSVNlcmlhbGl6ZXI+IGJpbmRJU2VyaWFsaXplcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuaW1wbC5TZXJpYWxpemVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuSVBhcnNlcj4gYmluZElQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHIuUmVwb3J0RFNMUGFyc2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuSVRva2VuVG9TdHJpbmdDb252ZXJ0ZXI+IGJpbmRJVG9rZW5Ub1N0cmluZ0NvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuVG9TdHJpbmdDb252ZXJ0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcj4gYmluZElBbnRsclRva2VuRmlsZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLlJlcG9ydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlcj4gYmluZExleGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMTGV4ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMTGV4ZXI+IHByb3ZpZGVJbnRlcm5hbFJlcG9ydERTTExleGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyUHJvdmlkZXIuY3JlYXRlKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFJlcG9ydERTTExleGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJ1bnRpbWVMZXhlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlckJpbmRpbmdzLlJVTlRJTUUpKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxSZXBvcnREU0xMZXhlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JVG9rZW5EZWZQcm92aWRlcj4gYmluZElUb2tlbkRlZlByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyVG9rZW5EZWZQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklVbm9yZGVyZWRHcm91cEhlbHBlcj4gYmluZElVbm9yZGVyZWRHcm91cEhlbHBlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5Vbm9yZGVyZWRHcm91cEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudmFsaWRhdGlvbi5WYWxpZGF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWxpZGF0aW9uLlJlcG9ydERTTFZhbGlkYXRvcj4gYmluZFJlcG9ydERTTFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnZhbGlkYXRpb24uUmVwb3J0RFNMVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zY29waW5nLkFic3RyYWN0U2NvcGluZ0ZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSWdub3JlQ2FzZUxpbmtpbmcoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZENvbnN0YW50KCkuYW5ub3RhdGVkV2l0aChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklnbm9yZUNhc2VMaW5raW5nLmNsYXNzKS50byhmYWxzZSk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklDb250YWluZXIuTWFuYWdlcj4gYmluZElDb250YWluZXIkTWFuYWdlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuU3RhdGVCYXNlZENvbnRhaW5lck1hbmFnZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuSUFsbENvbnRhaW5lcnNTdGF0ZS5Qcm92aWRlcj4gYmluZElBbGxDb250YWluZXJzU3RhdGUkUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5jb250YWluZXJzLlJlc291cmNlU2V0QmFzZWRBbGxDb250YWluZXJzU3RhdGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUlSZXNvdXJjZURlc2NyaXB0aW9ucyhjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEJhc2VkUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zUGVyc2lzdGVkKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuaW1wbC5SZXNvdXJjZURlc2NyaXB0aW9uc1Byb3ZpZGVyLlBFUlNJU1RFRF9ERVNDUklQVElPTlMpKS50byhvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0QmFzZWRSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmZvcm1hdHRpbmcuRm9ybWF0dGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmZvcm1hdHRpbmcuSUZvcm1hdHRlcj4gYmluZElGb3JtYXR0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mb3JtYXR0aW5nLlJlcG9ydERTTEZvcm1hdHRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuVHlwZXNGYWN0b3J5IGJpbmRUeXBlc0ZhY3RvcnlUb0luc3RhbmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5hY2Nlc3MuSUp2bVR5cGVQcm92aWRlci5GYWN0b3J5PiBiaW5kSUp2bVR5cGVQcm92aWRlciRGYWN0b3J5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5DbGFzc3BhdGhUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQ2xhc3NwYXRoQmFzZWRUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuSUV2YWx1YXRpb25Db250ZXh0PiBiaW5kSUV2YWx1YXRpb25Db250ZXh0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5EZWZhdWx0RXZhbHVhdGlvbkNvbnRleHQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLklFeHByZXNzaW9uSW50ZXJwcmV0ZXI+IGJpbmRJRXhwcmVzc2lvbkludGVycHJldGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5YYmFzZUludGVycHJldGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXI+IGJpbmRJUXVhbGlmaWVkTmFtZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlUXVhbGlmaWVkTmFtZUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI+IGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5YYmFzZVF1YWxpZmllZE5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlPiBiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbnZlcnNpb24uWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxpbmtpbmdJU2NvcGVQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQubGlua2luZy5MaW5raW5nU2NvcGVQcm92aWRlckJpbmRpbmcuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJpYWxpemVySVNjb3BlUHJvdmlkZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZVByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIudG9rZW5zLlNlcmlhbGl6ZXJTY29wZVByb3ZpZGVyQmluZGluZy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VyaWFsaXplci5TZXJpYWxpemVyU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJU2NvcGVQcm92aWRlckRlbGVnYXRlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZVNjb3BlUHJvdmlkZXIuTkFNRURfREVMRUdBVEUpKS50byhvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlSW1wb3J0ZWROYW1lc3BhY2VTY29wZVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubGlua2luZy5JTGlua2VyPiBiaW5kSUxpbmtlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpbmtpbmcuWGJhc2VMYXp5TGlua2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5YdGV4dFJlc291cmNlPiBiaW5kWHRleHRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnJlc291cmNlLkJhdGNoTGlua2FibGVSZXNvdXJjZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yPiBiaW5kSnZtVHlwZVJlZmVyZW5jZXNWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5mZWF0dXJlY2FsbHMuSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyPiBiaW5kSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmVhdHVyZWNhbGxzLklkZW50aWZpYWJsZVNpbXBsZU5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSURlcml2ZWRTdGF0ZUNvbXB1dGVyPiBiaW5kSURlcml2ZWRTdGF0ZUNvbXB1dGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtTW9kZWxBc3NvY2lhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbi5NYW5hZ2VyPiBiaW5kSVJlc291cmNlRGVzY3JpcHRpb24kTWFuYWdlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VEZXNjcmlwdGlvbk1hbmFnZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JR2VuZXJhdG9yPiBiaW5kSUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkp2bU1vZGVsR2VuZXJhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeSBiaW5kWHR5cGVGYWN0b3J5VG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmRlYnVnLklTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQ+IGJpbmRJU3RyYXR1bUJyZWFrcG9pbnRTdXBwb3J0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZGVidWcuWGJhc2VTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5MaW5lU2VwYXJhdG9ySGFybW9uaXplcj4gYmluZExpbmVTZXBhcmF0b3JIYXJtb25pemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIub3V0cHV0LlRyYWNlQXdhcmVQb3N0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRGVmYXVsdFJlc291cmNlRGVzY3JpcHRpb25TdHJhdGVneT4gYmluZElEZWZhdWx0UmVzb3VyY2VEZXNjcmlwdGlvblN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UucmVzb3VyY2UuWGJhc2VSZXNvdXJjZURlc2NyaXB0aW9uU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uU2V2ZXJpdHlDb252ZXJ0ZXI+IGJpbmRTZXZlcml0eUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnZhbGlkYXRpb24uWGJhc2VTZXZlcml0eUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Db25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXI+IGJpbmRDb25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLlhiYXNlQ29uZmlndXJhYmxlSXNzdWVDb2Rlcy5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuRU9iamVjdEF0T2Zmc2V0SGVscGVyPiBiaW5kRU9iamVjdEF0T2Zmc2V0SGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGlua2luZy5Ccm9rZW5Db25zdHJ1Y3RvckNhbGxBd2FyZUVPYmplY3RBdE9mZnNldEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5DYW5jZWxhYmxlRGlhZ25vc3RpY2lhbj4gYmluZENhbmNlbGFibGVEaWFnbm9zdGljaWFuKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5YYmFzZURpYWdub3N0aWNpYW4uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuZmVhdHVyZWNhbGxzLlN0YXRpY0ltcGxpY2l0TWV0aG9kc0ZlYXR1cmVGb3JUeXBlUHJvdmlkZXIuRXh0ZW5zaW9uQ2xhc3NOYW1lUHJvdmlkZXI+IGJpbmRTdGF0aWNJbXBsaWNpdE1ldGhvZHNGZWF0dXJlRm9yVHlwZVByb3ZpZGVyJEV4dGVuc2lvbkNsYXNzTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5iYXRjaC5JbXBsaWNpdGx5SW1wb3J0ZWRUeXBlc0FkYXB0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLk11dGFibGVGaWxlU3lzdGVtU3VwcG9ydD4gYmluZE11dGFibGVGaWxlU3lzdGVtU3VwcG9ydCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuSmF2YUlPRmlsZVN5c3RlbVN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLkZpbGVMb2NhdGlvbnM+IGJpbmRGaWxlTG9jYXRpb25zKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5GaWxlTG9jYXRpb25zSW1wbC5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5Xb3Jrc3BhY2VDb25maWc+PiBwcm92aWRlV29ya3NwYWNlQ29uZmlnKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5SdW50aW1lV29ya3NwYWNlQ29uZmlnUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uY29tcHV0YXRpb24uSVR5cGVDb21wdXRlcj4gYmluZElUeXBlQ29tcHV0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zVHlwZUNvbXB1dGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmJhdGNoLlhiYXNlQmF0Y2hTY29wZVByb3ZpZGVyPiBiaW5kWGJhc2VCYXRjaFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5saW5raW5nLklMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcj4gYmluZElMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5yZXNvbHZlZEFubm90YXRpb25UeXBlQXdhcmVNZXNzYWdlUHJvZHVjZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklMb2NhdGlvbkluRmlsZVByb3ZpZGVyPiBiaW5kSUxvY2F0aW9uSW5GaWxlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1Mb2NhdGlvbkluRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklHbG9iYWxTY29wZVByb3ZpZGVyPiBiaW5kSUdsb2JhbFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuVHlwZXNBd2FyZURlZmF1bHRHbG9iYWxTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkZlYXR1cmVOYW1lVmFsaWRhdG9yPiBiaW5kRmVhdHVyZU5hbWVWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkxvZ2ljYWxDb250YWluZXJBd2FyZUZlYXR1cmVOYW1lVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkRlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuTG9naWNhbENvbnRhaW5lckF3YXJlQmF0Y2hUeXBlUmVzb2x2ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuRGVmYXVsdFJlZW50cmFudFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRSZWVudHJhbnRUeXBlUmVzb2x2ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkxvZ2ljYWxDb250YWluZXJBd2FyZVJlZW50cmFudFR5cGVSZXNvbHZlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5JUmVzb3VyY2VWYWxpZGF0b3I+IGJpbmRJUmVzb3VyY2VWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1Nb2RlbEluZmVycmVyPiBiaW5kSUp2bU1vZGVsSW5mZXJyZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5ncmFtbWFyQWNjZXNzLkdyYW1tYXJBY2Nlc3NGcmFnbWVudAorCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYmluZENsYXNzTG9hZGVyVG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ3JhbW1hckFjY2Vzcy5HcmFtbWFyQWNjZXNzRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LklHcmFtbWFyQWNjZXNzPiBiaW5kSUdyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJ2aWNlcy5SZXBvcnREU0xHcmFtbWFyQWNjZXNzLmNsYXNzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MTk4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LklTZXR1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworLyoqCisgKiBHZW5lcmF0ZWQgZnJvbSBTdGFuZGFsb25lU2V0dXAueHB0IQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQgaW1wbGVtZW50cyBJU2V0dXAgeworCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKSB7CisJCW9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLlhiYXNlV2l0aEFubm90YXRpb25zU3RhbmRhbG9uZVNldHVwLmRvU2V0dXAoKTsKKworCQlJbmplY3RvciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKCk7CisJCXJlZ2lzdGVyKGluamVjdG9yKTsKKwkJcmV0dXJuIGluamVjdG9yOworCX0KKwkKKwlwdWJsaWMgSW5qZWN0b3IgY3JlYXRlSW5qZWN0b3IoKSB7CisJCXJldHVybiBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUnVudGltZU1vZHVsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVnaXN0ZXIoSW5qZWN0b3IgaW5qZWN0b3IpIHsKKworCQlvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VGYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IGluamVjdG9yLmdldEluc3RhbmNlKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkuY2xhc3MpOworCQlvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIgc2VydmljZVByb3ZpZGVyID0gaW5qZWN0b3IuZ2V0SW5zdGFuY2Uob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKwkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInJlcG9ydCIsIHJlc291cmNlRmFjdG9yeSk7CisJCW9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2VQcm92aWRlci5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInJlcG9ydCIsIHNlcnZpY2VQcm92aWRlcik7CisJCQorCisKKworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL1JlcG9ydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL1JlcG9ydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjgxZGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvUmVwb3J0RFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIFJlcG9ydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW50bHJUb2tlbkZpbGVQcm92aWRlciB7CisJCisJcHVibGljIElucHV0U3RyZWFtIGdldEFudGxyVG9rZW5GaWxlKCkgeworCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAJcmV0dXJuIGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oIm9yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC50b2tlbnMiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9SZXBvcnREU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL1JlcG9ydERTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmVkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9SZXBvcnREU0xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2VydmljZXMuUmVwb3J0RFNMR3JhbW1hckFjY2VzczsKKworcHVibGljIGNsYXNzIFJlcG9ydERTTFBhcnNlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BYnN0cmFjdEFudGxyUGFyc2VyIHsKKwkKKwlASW5qZWN0CisJcHJpdmF0ZSBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0SW5pdGlhbEhpZGRlblRva2VucyhYdGV4dFRva2VuU3RyZWFtIHRva2VuU3RyZWFtKSB7CisJCXRva2VuU3RyZWFtLnNldEluaXRpYWxIaWRkZW5Ub2tlbnMoIlJVTEVfV1MiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsUmVwb3J0RFNMUGFyc2VyIGNyZWF0ZVBhcnNlcihYdGV4dFRva2VuU3RyZWFtIHN0cmVhbSkgeworCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbFJlcG9ydERTTFBhcnNlcihzdHJlYW0sIGdldEdyYW1tYXJBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZSAKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRSdWxlTmFtZSgpIHsKKwkJcmV0dXJuICJSZXBvcnRNb2RlbCI7CisJfQorCQorCXB1YmxpYyBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLmdyYW1tYXJBY2Nlc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJBY2Nlc3MoUmVwb3J0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisJCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhY2U3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmcKQEAgLTAsMCArMSwxMDAxNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitncmFtbWFyIEludGVybmFsUmVwb3J0RFNMOworCitvcHRpb25zIHsKKwlzdXBlckNsYXNzPUFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKKwkKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5wYXJzZXIuYW50bHIuaW50ZXJuYWw7CisKKy8vIEhhY2s6IFVzZSBvdXIgb3duIExleGVyIHN1cGVyY2xhc3MgYnkgbWVhbnMgb2YgaW1wb3J0LiAKKy8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gc3BlY2lmeSB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlIGxleGVyLgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlcjsKK30KKworQHBhcnNlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbS5IaWRkZW5Ub2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyRGF0YXR5cGVSdWxlVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2VydmljZXMuUmVwb3J0RFNMR3JhbW1hckFjY2VzczsKKworfQorCitAcGFyc2VyOjptZW1iZXJzIHsKKworIAlwcml2YXRlIFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAJCisgICAgcHVibGljIEludGVybmFsUmVwb3J0RFNMUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAgICAgdGhpcyhpbnB1dCk7CisgICAgICAgIHRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgICAgIHJlZ2lzdGVyUnVsZXMoZ3JhbW1hckFjY2Vzcy5nZXRHcmFtbWFyKCkpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0UnVsZU5hbWUoKSB7CisgICAgCXJldHVybiAiUmVwb3J0TW9kZWwiOwkKKyAgIAl9CisgICAJCisgICAJQE92ZXJyaWRlCisgICAJcHJvdGVjdGVkIFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKyAgIAkJcmV0dXJuIGdyYW1tYXJBY2Nlc3M7CisgICAJfQorfQorCitAcnVsZWNhdGNoIHsgCisgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICB9IAorfQorCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJlcG9ydE1vZGVsCitlbnRyeVJ1bGVSZXBvcnRNb2RlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydE1vZGVsUnVsZSgpKTsgfQorCSBpdl9ydWxlUmVwb3J0TW9kZWw9cnVsZVJlcG9ydE1vZGVsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUmVwb3J0TW9kZWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlcG9ydE1vZGVsCitydWxlUmVwb3J0TW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRNb2RlbEFjY2VzcygpLmdldFBja2dSZXBvcnRQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisJICAgIH0KKwkJbHZfcGNrZ18wXzA9cnVsZVJlcG9ydFBhY2thZ2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0TW9kZWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGNrZyIsCisgICAgICAgIAkJbHZfcGNrZ18wXzAsIAorICAgICAgICAJCSJSZXBvcnRQYWNrYWdlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJlcG9ydFBhY2thZ2UKK2VudHJ5UnVsZVJlcG9ydFBhY2thZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlUmVwb3J0UGFja2FnZT1ydWxlUmVwb3J0UGFja2FnZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJlcG9ydFBhY2thZ2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlcG9ydFBhY2thZ2UKK3J1bGVSZXBvcnRQYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFJlcG9ydFBhY2thZ2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdwYWNrYWdlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9uYW1lXzJfMD1ydWxlUXVhbGlmaWVkTmFtZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgCQkiUXVhbGlmaWVkTmFtZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8zPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNSZXBvcnRJbXBvcnRQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X2ltcG9ydHNfNF8wPXJ1bGVSZXBvcnRJbXBvcnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbXBvcnRzIiwKKyAgICAgICAgCQlsdl9pbXBvcnRzXzRfMCwgCisgICAgICAgIAkJIlJlcG9ydEltcG9ydCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqKAlvdGhlcmx2XzU9J2xheW91dC1kYXRhJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGF5b3V0RGF0YUtleXdvcmRfNV8wKCkpOworICAgIH0KKwlvdGhlcmx2XzY9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzEoKSk7CisgICAgfQorKAlvdGhlcmx2Xzc9J2V4dGVybmFsQ3NzVVJJJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklLZXl3b3JkXzVfMl8wKCkpOworICAgIH0KKygKKygKKwkJbHZfZXh0ZXJuYWxDc3NVUklfOF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2V4dGVybmFsQ3NzVVJJXzhfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMl8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXh0ZXJuYWxDc3NVUkkiLAorICAgICAgICAJCWx2X2V4dGVybmFsQ3NzVVJJXzhfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykoCW90aGVybHZfOT0nZnJvbSBidW5kbGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGcm9tQnVuZGxlS2V5d29yZF81XzJfMl8wKCkpOworICAgIH0KKygKKygKKwkJbHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRFeHRlcm5hbENzc1VSSUJ1bmRsZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8yXzJfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4dGVybmFsQ3NzVVJJQnVuZGxlIiwKKyAgICAgICAgCQlsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSk/KT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZXNQYWdlVGVtcGxhdGVzUGFyc2VyUnVsZUNhbGxfNV8zXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD1ydWxlUGFnZVRlbXBsYXRlcwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBhZ2V0ZW1wbGF0ZXMiLAorICAgICAgICAJCWx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMCwgCisgICAgICAgIAkJIlBhZ2VUZW1wbGF0ZXMiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzU29tZUZvcm1hdHNQYXJzZXJSdWxlQ2FsbF81XzRfMCgpKTsgCisJICAgIH0KKwkJbHZfZm9ybWF0dGVyc18xMl8wPXJ1bGVTb21lRm9ybWF0cwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZvcm1hdHRlcnMiLAorICAgICAgICAJCWx2X2Zvcm1hdHRlcnNfMTJfMCwgCisgICAgICAgIAkJIlNvbWVGb3JtYXRzIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Q29sb3JzQ29sb3JzUGFyc2VyUnVsZUNhbGxfNV81XzAoKSk7IAorCSAgICB9CisJCWx2X2NvbG9yc18xM18wPXJ1bGVDb2xvcnMJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb2xvcnMiLAorICAgICAgICAJCWx2X2NvbG9yc18xM18wLCAKKyAgICAgICAgCQkiQ29sb3JzIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Rm9udHNGb250c1BhcnNlclJ1bGVDYWxsXzVfNl8wKCkpOyAKKwkgICAgfQorCQlsdl9mb250c18xNF8wPXJ1bGVGb250cwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZvbnRzIiwKKyAgICAgICAgCQlsdl9mb250c18xNF8wLCAKKyAgICAgICAgCQkiRm9udHMiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRNZWRpYXNNZWRpYXNQYXJzZXJSdWxlQ2FsbF81XzdfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVkaWFzXzE1XzA9cnVsZU1lZGlhcwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1lZGlhcyIsCisgICAgICAgIAkJbHZfbWVkaWFzXzE1XzAsIAorICAgICAgICAJCSJNZWRpYXMiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRTdHlsZXNTdHlsZXNQYXJzZXJSdWxlQ2FsbF81XzhfMCgpKTsgCisJICAgIH0KKwkJbHZfc3R5bGVzXzE2XzA9cnVsZVN0eWxlcwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInN0eWxlcyIsCisgICAgICAgIAkJbHZfc3R5bGVzXzE2XzAsIAorICAgICAgICAJCSJTdHlsZXMiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMTc9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNywgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzVfOSgpKTsKKyAgICB9CispPygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmVwb3J0c1JlcG9ydFBhcnNlclJ1bGVDYWxsXzZfMCgpKTsgCisJICAgIH0KKwkJbHZfcmVwb3J0c18xOF8wPXJ1bGVSZXBvcnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRzIiwKKyAgICAgICAgCQlsdl9yZXBvcnRzXzE4XzAsIAorICAgICAgICAJCSJSZXBvcnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzE5PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTksIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBhZ2VUZW1wbGF0ZXMKK2VudHJ5UnVsZVBhZ2VUZW1wbGF0ZXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzUnVsZSgpKTsgfQorCSBpdl9ydWxlUGFnZVRlbXBsYXRlcz1ydWxlUGFnZVRlbXBsYXRlcyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBhZ2VUZW1wbGF0ZXMuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBhZ2VUZW1wbGF0ZXMKK3J1bGVQYWdlVGVtcGxhdGVzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc0FjY2VzcygpLmdldFBhZ2VUZW1wbGF0ZXNBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc0FjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZXNQYWdlVGVtcGxhdGVQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPXJ1bGVQYWdlVGVtcGxhdGUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWdldGVtcGxhdGVzIiwKKyAgICAgICAgCQlsdl9wYWdldGVtcGxhdGVzXzFfMCwgCisgICAgICAgIAkJIlBhZ2VUZW1wbGF0ZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU29tZUZvcm1hdHMKK2VudHJ5UnVsZVNvbWVGb3JtYXRzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNSdWxlKCkpOyB9CisJIGl2X3J1bGVTb21lRm9ybWF0cz1ydWxlU29tZUZvcm1hdHMgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVTb21lRm9ybWF0cy5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU29tZUZvcm1hdHMKK3J1bGVTb21lRm9ybWF0cyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0U29tZUZvcm1hdHNBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdmb3JtYXR0ZXJzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldEZvcm1hdHRlcnNLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldEZvcm1hdHRlcnNTb21lRm9ybWF0UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9mb3JtYXR0ZXJzXzNfMD1ydWxlU29tZUZvcm1hdAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmb3JtYXR0ZXJzIiwKKyAgICAgICAgCQlsdl9mb3JtYXR0ZXJzXzNfMCwgCisgICAgICAgIAkJIlNvbWVGb3JtYXQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzQ9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ29sb3JzCitlbnRyeVJ1bGVDb2xvcnMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNSdWxlKCkpOyB9CisJIGl2X3J1bGVDb2xvcnM9cnVsZUNvbG9ycyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNvbG9ycy5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ29sb3JzCitydWxlQ29sb3JzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0Q29sb3JzQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nY29sb3JzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0Q29sb3JzQ29sb3JQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2NvbG9yc18zXzA9cnVsZUNvbG9yCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENvbG9yc1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb2xvcnMiLAorICAgICAgICAJCWx2X2NvbG9yc18zXzAsIAorICAgICAgICAJCSJDb2xvciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfND0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRm9udHMKK2VudHJ5UnVsZUZvbnRzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNSdWxlKCkpOyB9CisJIGl2X3J1bGVGb250cz1ydWxlRm9udHMgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVGb250cy5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRm9udHMKK3J1bGVGb250cyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdmb250cycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0tleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0Rm9udHNGb250UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9mb250c18zXzA9cnVsZUZvbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZm9udHMiLAorICAgICAgICAJCWx2X2ZvbnRzXzNfMCwgCisgICAgICAgIAkJIkZvbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzQ9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldEZvbnRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlTWVkaWFzCitlbnRyeVJ1bGVNZWRpYXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNSdWxlKCkpOyB9CisJIGl2X3J1bGVNZWRpYXM9cnVsZU1lZGlhcyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU1lZGlhcy5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgTWVkaWFzCitydWxlTWVkaWFzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0TWVkaWFzQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nbWVkaWFzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0TWVkaWFzTWVkaWFQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X21lZGlhc18zXzA9cnVsZU1lZGlhCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhc1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtZWRpYXMiLAorICAgICAgICAJCWx2X21lZGlhc18zXzAsIAorICAgICAgICAJCSJNZWRpYSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfND0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlTWVkaWEKK2VudHJ5UnVsZU1lZGlhIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFSdWxlKCkpOyB9CisJIGl2X3J1bGVNZWRpYT1ydWxlTWVkaWEgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVNZWRpYS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgTWVkaWEKK3J1bGVNZWRpYSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J21lZGlhJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYUFjY2VzcygpLmdldE1lZGlhS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8xXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYUFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgIAkJIklEIik7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVN0eWxlcworZW50cnlSdWxlU3R5bGVzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzUnVsZSgpKTsgfQorCSBpdl9ydWxlU3R5bGVzPXJ1bGVTdHlsZXMgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVTdHlsZXMuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFN0eWxlcworcnVsZVN0eWxlcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFN0eWxlc0FjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3N0eWxlcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzS2V5d29yZF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFN0eWxlc1N0eWxlUGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9zdHlsZXNfM18wPXJ1bGVTdHlsZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic3R5bGVzIiwKKyAgICAgICAgCQlsdl9zdHlsZXNfM18wLCAKKyAgICAgICAgCQkiU3R5bGUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzQ9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBhZ2VUZW1wbGF0ZQorZW50cnlSdWxlUGFnZVRlbXBsYXRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsgfQorCSBpdl9ydWxlUGFnZVRlbXBsYXRlPXJ1bGVQYWdlVGVtcGxhdGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQYWdlVGVtcGxhdGUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBhZ2VUZW1wbGF0ZQorcnVsZVBhZ2VUZW1wbGF0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3BhZ2V0ZW1wbGF0ZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UGFnZXRlbXBsYXRlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8xXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisJb3RoZXJsdl8zPSd0eXBlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUeXBlS2V5d29yZF8zKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRTaXplUGFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfc2l6ZV80XzA9cnVsZVBhZ2VTaXplRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic2l6ZSIsCisgICAgICAgIAkJbHZfc2l6ZV80XzAsIAorICAgICAgICAJCSJQYWdlU2l6ZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0nb3JpZW50YXRpb24nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE9yaWVudGF0aW9uS2V5d29yZF81KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRPcmllbnRhdGlvbk9yaWVudGF0aW9uRW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X29yaWVudGF0aW9uXzZfMD1ydWxlT3JpZW50YXRpb25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJvcmllbnRhdGlvbiIsCisgICAgICAgIAkJbHZfb3JpZW50YXRpb25fNl8wLCAKKyAgICAgICAgCQkiT3JpZW50YXRpb25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzc9J3RvcG1hcmdpbicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0VG9wbWFyZ2luS2V5d29yZF83KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUb3BNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfOF8wKCkpOyAKKwkgICAgfQorCQlsdl90b3BNYXJnaW5WYWx1ZV84XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0b3BNYXJnaW5WYWx1ZSIsCisgICAgICAgIAkJbHZfdG9wTWFyZ2luVmFsdWVfOF8wLCAKKyAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF85XzAoKSk7IAorCSAgICB9CisJCWx2X3RvcE1hcmdpblVuaXRfOV8wPXJ1bGVVbml0RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidG9wTWFyZ2luVW5pdCIsCisgICAgICAgIAkJbHZfdG9wTWFyZ2luVW5pdF85XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8xMD0nbGVmdG1hcmdpbicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRtYXJnaW5LZXl3b3JkXzEwKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRMZWZ0TWFyZ2luVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzExXzAoKSk7IAorCSAgICB9CisJCWx2X2xlZnRNYXJnaW5WYWx1ZV8xMV8wPXJ1bGVVbnNpZ25lZE51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibGVmdE1hcmdpblZhbHVlIiwKKyAgICAgICAgCQlsdl9sZWZ0TWFyZ2luVmFsdWVfMTFfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRMZWZ0TWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzEyXzAoKSk7IAorCSAgICB9CisJCWx2X2xlZnRNYXJnaW5Vbml0XzEyXzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJsZWZ0TWFyZ2luVW5pdCIsCisgICAgICAgIAkJbHZfbGVmdE1hcmdpblVuaXRfMTJfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzEzPSdib3R0b21tYXJnaW4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21tYXJnaW5LZXl3b3JkXzEzKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21NYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTRfMCgpKTsgCisJICAgIH0KKwkJbHZfYm90dG9tTWFyZ2luVmFsdWVfMTRfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImJvdHRvbU1hcmdpblZhbHVlIiwKKyAgICAgICAgCQlsdl9ib3R0b21NYXJnaW5WYWx1ZV8xNF8wLCAKKyAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEJvdHRvbU1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8xNV8wKCkpOyAKKwkgICAgfQorCQlsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJib3R0b21NYXJnaW5Vbml0IiwKKyAgICAgICAgCQlsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8xNj0ncmlnaHRtYXJnaW4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodG1hcmdpbktleXdvcmRfMTYoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzE3XzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0TWFyZ2luVmFsdWUiLAorICAgICAgICAJCWx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8xOF8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE1hcmdpblVuaXRfMThfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0TWFyZ2luVW5pdCIsCisgICAgICAgIAkJbHZfcmlnaHRNYXJnaW5Vbml0XzE4XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0SGVhZGVyUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzE5XzAoKSk7IAorCSAgICB9CisJCWx2X2hlYWRlcl8xOV8wPXJ1bGVQYWdlSGVhZGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJoZWFkZXIiLAorICAgICAgICAJCWx2X2hlYWRlcl8xOV8wLCAKKyAgICAgICAgCQkiUGFnZUhlYWRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEZvb3RlclBhZ2VGb290ZXJQYXJzZXJSdWxlQ2FsbF8yMF8wKCkpOyAKKwkgICAgfQorCQlsdl9mb290ZXJfMjBfMD1ydWxlUGFnZUZvb3RlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZm9vdGVyIiwKKyAgICAgICAgCQlsdl9mb290ZXJfMjBfMCwgCisgICAgICAgIAkJIlBhZ2VGb290ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPwlvdGhlcmx2XzIxPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzIxKCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVVuc2lnbmVkTnVtYmVyCitlbnRyeVJ1bGVVbnNpZ25lZE51bWJlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5zaWduZWROdW1iZXJSdWxlKCkpOyB9IAorCSBpdl9ydWxlVW5zaWduZWROdW1iZXI9cnVsZVVuc2lnbmVkTnVtYmVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVW5zaWduZWROdW1iZXIuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVW5zaWduZWROdW1iZXIKK3J1bGVVbnNpZ25lZE51bWJlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFVuc2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0TnVtYmVyUGFyc2VyUnVsZUNhbGwoKSk7IAorICAgIH0KKyAgICB0aGlzX051bWJlcl8wPXJ1bGVOdW1iZXIgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX051bWJlcl8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ29sb3IKK2VudHJ5UnVsZUNvbG9yIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOyB9CisJIGl2X3J1bGVDb2xvcj1ydWxlQ29sb3IgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDb2xvci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ29sb3IKK3J1bGVDb2xvciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2NvbG9yJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldENvbG9yS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8xXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgIAkJIklEIik7CisJICAgIH0KKworKQorKSgoCisoCisJCWx2X2NvbG9yXzJfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9jb2xvcl8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvclNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbG9yIiwKKyAgICAgICAgCQlsdl9jb2xvcl8yXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCisgICAgfCgJb3RoZXJsdl8zPSdkYXJrZW5zJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldERhcmtlbnNLZXl3b3JkXzJfMV8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzQ9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QmFzZWNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzFfMV8wKCkpOyAKKwl9CisKKykKKykJb3RoZXJsdl81PSdieS1wZXJjZW50JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJ5UGVyY2VudEtleXdvcmRfMl8xXzIoKSk7CisgICAgfQorKAorKAorCQlsdl9kYXJrZW5zYnlfNl8wPVJVTEVfSU5UCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2RhcmtlbnNieV82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXREYXJrZW5zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfMV8zXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRhcmtlbnNieSIsCisgICAgICAgIAkJbHZfZGFya2Vuc2J5XzZfMCwgCisgICAgICAgIAkJIklOVCIpOworCSAgICB9CisKKykKKykpCisgICAgfCgJb3RoZXJsdl83PSdsaWdodGVucycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRMaWdodGVuc0tleXdvcmRfMl8yXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfOD1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfMl8xXzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2Xzk9J2J5LXBlcmNlbnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzJfMigpKTsKKyAgICB9CisoCisoCisJCWx2X2xpZ2h0ZW5zYnlfMTBfMD1SVUxFX0lOVAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9saWdodGVuc2J5XzEwXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRMaWdodGVuc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzJfM18wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJsaWdodGVuc2J5IiwKKyAgICAgICAgCQlsdl9saWdodGVuc2J5XzEwXzAsIAorICAgICAgICAJCSJJTlQiKTsKKwkgICAgfQorCispCispKQorICAgIHwoCW90aGVybHZfMTE9J3RyYW5zZm9ybXMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldFRyYW5zZm9ybXNLZXl3b3JkXzJfM18wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzEyPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfM18xXzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2XzEzPSdieS1wZXJjZW50JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRCeVBlcmNlbnRLZXl3b3JkXzJfM18yKCkpOworICAgIH0KKygKKygKKwkJbHZfdHJhbnNmb3Jtc2J5XzE0XzA9UlVMRV9JTlQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfdHJhbnNmb3Jtc2J5XzE0XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRUcmFuc2Zvcm1zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfM18zXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInRyYW5zZm9ybXNieSIsCisgICAgICAgIAkJbHZfdHJhbnNmb3Jtc2J5XzE0XzAsIAorICAgICAgICAJCSJJTlQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMTU9J3Rvd2FyZHMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNSwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldFRvd2FyZHNLZXl3b3JkXzJfM180KCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzE2PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRUYXJnZXRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8zXzVfMCgpKTsgCisJfQorCispCispKSkpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGb250CitlbnRyeVJ1bGVGb250IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUZvbnQ9cnVsZUZvbnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVGb250LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGb250CitydWxlRm9udCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCisoCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAwKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzE9J2ZvbnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRGb250S2V5d29yZF8wXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9uYW1lXzJfMD1SVUxFX0lECisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMl8wLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzBfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMz0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzBfMigpKTsKKyAgICB9CisoCW90aGVybHZfND0nZXh0ZW5kcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEV4dGVuZHNLZXl3b3JkXzBfM18wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfNT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEV4dGVuZHNGb250Q3Jvc3NSZWZlcmVuY2VfMF8zXzFfMCgpKTsgCisJfQorCispCispKT8oCW90aGVybHZfNj0nZmFtaWx5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0RmFtaWx5S2V5d29yZF8wXzRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEZhbWlseUZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8wXzRfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9mYW1pbHlfN18wPXJ1bGVGb250RmFtaWx5CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmFtaWx5IiwKKyAgICAgICAgCQlsdl9mYW1pbHlfN18wLCAKKyAgICAgICAgCQkiRm9udEZhbWlseSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRTdHlsZUZvbnRTdHlsZUVudW1FbnVtUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9zdHlsZV84XzA9cnVsZUZvbnRTdHlsZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJzdHlsZSIsCisgICAgICAgIAkJbHZfc3R5bGVfOF8wLCAKKyAgICAgICAgCQkiRm9udFN0eWxlRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDIpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9ib2xkXzlfMD0JJ2JvbGQnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfYm9sZF85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEJvbGRCb2xkS2V5d29yZF8yXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImJvbGQiLCB0cnVlLCAiYm9sZCIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAzKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDMpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KCgJb3RoZXJsdl8xMD0nc2l6ZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRTaXplS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFNpemV2YWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfc2l6ZXZhbHVlXzExXzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic2l6ZXZhbHVlIiwKKyAgICAgICAgCQlsdl9zaXpldmFsdWVfMTFfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0U2l6ZXVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzBfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9zaXpldW5pdF8xMl8wPXJ1bGVVbml0RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInNpemV1bml0IiwKKyAgICAgICAgCQlsdl9zaXpldW5pdF8xMl8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8Jb3RoZXJsdl8xMz0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xKCkpOworICAgIH0KKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSsKKwkgIAl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKX0/CQorCSkKKykKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKTsKKwl9CisKKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZvbnRGYW1pbHkKK2VudHJ5UnVsZUZvbnRGYW1pbHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5UnVsZSgpKTsgfQorCSBpdl9ydWxlRm9udEZhbWlseT1ydWxlRm9udEZhbWlseSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUZvbnRGYW1pbHkuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEZvbnRGYW1pbHkKK3J1bGVGb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRCdWlsZEluRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzA9cnVsZUJ1aWxkSW5Gb250RmFtaWx5CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19CdWlsZEluRm9udEZhbWlseV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX0N1c3RvbUZvbnRGYW1pbHlfMT1ydWxlQ3VzdG9tRm9udEZhbWlseQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfQ3VzdG9tRm9udEZhbWlseV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQnVpbGRJbkZvbnRGYW1pbHkKK2VudHJ5UnVsZUJ1aWxkSW5Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlSdWxlKCkpOyB9CisJIGl2X3J1bGVCdWlsZEluRm9udEZhbWlseT1ydWxlQnVpbGRJbkZvbnRGYW1pbHkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVCdWlsZEluRm9udEZhbWlseS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQnVpbGRJbkZvbnRGYW1pbHkKK3J1bGVCdWlsZEluRm9udEZhbWlseSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tQnVpbGRJbkZvbnRGYW1pbHlFbnVtRW51bVJ1bGVDYWxsXzAoKSk7IAorCSAgICB9CisJCWx2X2N1c3RvbV8wXzA9cnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRCdWlsZEluRm9udEZhbWlseVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjdXN0b20iLAorICAgICAgICAJCWx2X2N1c3RvbV8wXzAsIAorICAgICAgICAJCSJCdWlsZEluRm9udEZhbWlseUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDdXN0b21Gb250RmFtaWx5CitlbnRyeVJ1bGVDdXN0b21Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUN1c3RvbUZvbnRGYW1pbHk9cnVsZUN1c3RvbUZvbnRGYW1pbHkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDdXN0b21Gb250RmFtaWx5LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDdXN0b21Gb250RmFtaWx5CitydWxlQ3VzdG9tRm9udEZhbWlseSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorKAorCQlsdl9jdXN0b21fMF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2N1c3RvbV8wXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXN0b21Gb250RmFtaWx5UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjdXN0b20iLAorICAgICAgICAJCWx2X2N1c3RvbV8wXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVCb3JkZXJTdHlsZQorZW50cnlSdWxlQm9yZGVyU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUJvcmRlclN0eWxlPXJ1bGVCb3JkZXJTdHlsZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUJvcmRlclN0eWxlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBCb3JkZXJTdHlsZQorcnVsZUJvcmRlclN0eWxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0VHlwZUJvcmRlclR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZV8wXzA9cnVsZUJvcmRlclR5cGVFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGUiLAorICAgICAgICAJCWx2X3R5cGVfMF8wLCAKKyAgICAgICAgCQkiQm9yZGVyVHlwZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0V2lkdGh2YWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl93aWR0aHZhbHVlXzFfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkid2lkdGh2YWx1ZSIsCisgICAgICAgIAkJbHZfd2lkdGh2YWx1ZV8xXzAsIAorICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRXaWR0aHVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X3dpZHRodW5pdF8yXzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIndpZHRodW5pdCIsCisgICAgICAgIAkJbHZfd2lkdGh1bml0XzJfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzM9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0Q29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzNfMCgpKTsgCisJfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU3R5bGUKK2VudHJ5UnVsZVN0eWxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOyB9CisJIGl2X3J1bGVTdHlsZT1ydWxlU3R5bGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVTdHlsZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU3R5bGUKK3J1bGVTdHlsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFN0eWxlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8xXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgIAkJIklEIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzI9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCW90aGVybHZfMz0nZXh0ZW5kcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8zXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfND1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRFeHRlbmRzU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCgpKTsgCisJfQorCispCispKT8oCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKwl9CisJKAorCQkoCisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDApfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNj0nZm9ybWF0dGVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEZvcm1hdHRlcktleXdvcmRfNF8wXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfNz1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRGb3JtYXRTb21lRm9ybWF0Q3Jvc3NSZWZlcmVuY2VfNF8wXzFfMCgpKTsgCisJfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfOD0nZm9udCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRGb250S2V5d29yZF80XzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl85PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfNF8xXzFfMCgpKTsgCisJfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDIpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMik7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTA9J2JhY2tncm91bmRjb2xvcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yS2V5d29yZF80XzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV80XzJfMV8wKCkpOyAKKwl9CisKKykKKykoCW90aGVybHZfMTI9J2FsdGVybmF0ZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRlS2V5d29yZF80XzJfMl8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzEzPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV80XzJfMl8xXzAoKSk7IAorCX0KKworKQorKSk/KSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDMpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMyk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTQ9J3RleHRjb2xvcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE0LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yS2V5d29yZF80XzNfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xNT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV80XzNfMV8wKCkpOyAKKwl9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA0KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8xNj0ndGV4dGFsaWduJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzRfNF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfNF80XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dGFsaWduXzE3XzA9cnVsZVRleHRBbGlnbkVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dGFsaWduIiwKKyAgICAgICAgCQlsdl90ZXh0YWxpZ25fMTdfMCwgCisgICAgICAgIAkJIlRleHRBbGlnbkVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDUpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTg9J2JvcmRlci10b3AnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xOCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlclRvcEtleXdvcmRfNF81XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzVfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9ib3JkZXJUb3BfMTlfMD1ydWxlQm9yZGVyU3R5bGUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYm9yZGVyVG9wIiwKKyAgICAgICAgCQlsdl9ib3JkZXJUb3BfMTlfMCwgCisgICAgICAgIAkJIkJvcmRlclN0eWxlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA2KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzIwPSdib3JkZXItYm90dG9tJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjAsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJCb3R0b21LZXl3b3JkXzRfNl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlckJvdHRvbUJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF82XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYm9yZGVyQm90dG9tXzIxXzA9cnVsZUJvcmRlclN0eWxlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImJvcmRlckJvdHRvbSIsCisgICAgICAgIAkJbHZfYm9yZGVyQm90dG9tXzIxXzAsIAorICAgICAgICAJCSJCb3JkZXJTdHlsZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNyl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA3KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8yMj0nYm9yZGVyLWxlZnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlckxlZnRLZXl3b3JkXzRfN18wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlckxlZnRCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzRfN18xXzAoKSk7IAorCSAgICB9CisJCWx2X2JvcmRlckxlZnRfMjNfMD1ydWxlQm9yZGVyU3R5bGUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYm9yZGVyTGVmdCIsCisgICAgICAgIAkJbHZfYm9yZGVyTGVmdF8yM18wLCAKKyAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDgpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgOCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMjQ9J2JvcmRlci1yaWdodCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI0LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyUmlnaHRLZXl3b3JkXzRfOF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlclJpZ2h0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzhfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9ib3JkZXJSaWdodF8yNV8wPXJ1bGVCb3JkZXJTdHlsZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJib3JkZXJSaWdodCIsCisgICAgICAgIAkJbHZfYm9yZGVyUmlnaHRfMjVfMCwgCisgICAgICAgIAkJIkJvcmRlclN0eWxlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA5KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDkpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzI2PSdwYWRkaW5nLXRvcCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcEtleXdvcmRfNF85XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzlfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ1RvcFZhbHVlIiwKKyAgICAgICAgCQlsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF85XzJfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ1RvcFVuaXRfMjhfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ1RvcFVuaXQiLAorICAgICAgICAJCWx2X3BhZGRpbmdUb3BVbml0XzI4XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTApfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzI5PSdwYWRkaW5nLWJvdHRvbScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI5LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbUtleXdvcmRfNF8xMF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPXJ1bGVVbnNpZ25lZE51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nQm90dG9tVmFsdWUiLAorICAgICAgICAJCWx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wLCAKKyAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEwXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ0JvdHRvbVVuaXQiLAorICAgICAgICAJCWx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzMyPSdwYWRkaW5nLWxlZnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zMiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0S2V5d29yZF80XzExXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ0xlZnRWYWx1ZSIsCisgICAgICAgIAkJbHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wLCAKKyAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMV8yXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPXJ1bGVVbml0RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nTGVmdFVuaXQiLAorICAgICAgICAJCWx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8zNT0ncGFkZGluZy1yaWdodCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzM1LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0S2V5d29yZF80XzEyXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPXJ1bGVVbnNpZ25lZE51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nUmlnaHRWYWx1ZSIsCisgICAgICAgIAkJbHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdSaWdodFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEyXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPXJ1bGVVbml0RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nUmlnaHRVbml0IiwKKyAgICAgICAgCQlsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTMpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTMpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzM4PSdtYXJnaW4tdG9wJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMzgsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BLZXl3b3JkXzRfMTNfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xM18xXzAoKSk7IAorCSAgICB9CisJCWx2X21hcmdpblRvcFZhbHVlXzM5XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1hcmdpblRvcFZhbHVlIiwKKyAgICAgICAgCQlsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wLCAKKyAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTNfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5Ub3BVbml0XzQwXzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1hcmdpblRvcFVuaXQiLAorICAgICAgICAJCWx2X21hcmdpblRvcFVuaXRfNDBfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNDE9J21hcmdpbi1ib3R0b20nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80MSwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbUtleXdvcmRfNF8xNF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE0XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luQm90dG9tVmFsdWUiLAorICAgICAgICAJCWx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzAsIAorICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNF8yXzAoKSk7IAorCSAgICB9CisJCWx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luQm90dG9tVW5pdCIsCisgICAgICAgIAkJbHZfbWFyZ2luQm90dG9tVW5pdF80M18wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE1KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE1KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl80ND0nbWFyZ2luLWxlZnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80NCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkxlZnRLZXl3b3JkXzRfMTVfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5MZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTVfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luTGVmdFZhbHVlIiwKKyAgICAgICAgCQlsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkxlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNV8yXzAoKSk7IAorCSAgICB9CisJCWx2X21hcmdpbkxlZnRVbml0XzQ2XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1hcmdpbkxlZnRVbml0IiwKKyAgICAgICAgCQlsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE2KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE2KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl80Nz0nbWFyZ2luLXJpZ2h0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNDcsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5SaWdodEtleXdvcmRfNF8xNl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTZfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1hcmdpblJpZ2h0VmFsdWUiLAorICAgICAgICAJCWx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTZfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luUmlnaHRVbml0IiwKKyAgICAgICAgCQlsdl9tYXJnaW5SaWdodFVuaXRfNDlfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSoJCisJKQorKQorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCX0KKworKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1lZGlhc3R5bGVzTWVkaWFTdHlsZVBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVkaWFzdHlsZXNfNTBfMD1ydWxlTWVkaWFTdHlsZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtZWRpYXN0eWxlcyIsCisgICAgICAgIAkJbHZfbWVkaWFzdHlsZXNfNTBfMCwgCisgICAgICAgIAkJIk1lZGlhU3R5bGUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzUxPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNTEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVNZWRpYVN0eWxlCitlbnRyeVJ1bGVNZWRpYVN0eWxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZU1lZGlhU3R5bGU9cnVsZU1lZGlhU3R5bGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVNZWRpYVN0eWxlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBNZWRpYVN0eWxlCitydWxlTWVkaWFTdHlsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J21lZGlhJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWVkaWFLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWVkaWFNZWRpYUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgCisJfQorCispCispCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorKAorCisoCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisJKAorCQkoCisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzQ9J2Zvcm1hdHRlcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEZvcm1hdHRlcktleXdvcmRfM18wXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl81PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Rm9ybWF0U29tZUZvcm1hdENyb3NzUmVmZXJlbmNlXzNfMF8xXzAoKSk7IAorCX0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzY9J2ZvbnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRGb250S2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2Xzc9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRGb250Rm9udENyb3NzUmVmZXJlbmNlXzNfMV8xXzAoKSk7IAorCX0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMil9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2Xzg9J2JhY2tncm91bmRjb2xvcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJhY2tncm91bmRjb2xvcktleXdvcmRfM18yXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl85PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMV8wKCkpOyAKKwl9CisKKykKKykoCW90aGVybHZfMTA9J2FsdGVybmF0ZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRBbHRlcm5hdGVLZXl3b3JkXzNfMl8yXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMl8xXzAoKSk7IAorCX0KKworKQorKSk/KSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMyk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTI9J3RleHRjb2xvcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRUZXh0Y29sb3JLZXl3b3JkXzNfM18wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMTM9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzNfMV8wKCkpOyAKKwl9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDQpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8xND0ndGV4dGFsaWduJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfM180XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzNfNF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3RleHRhbGlnbl8xNV8wPXJ1bGVUZXh0QWxpZ25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dGFsaWduIiwKKyAgICAgICAgCQlsdl90ZXh0YWxpZ25fMTVfMCwgCisgICAgICAgIAkJIlRleHRBbGlnbkVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMTY9J2JvcmRlci10b3AnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wS2V5d29yZF8zXzVfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJvcmRlclRvcEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM181XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYm9yZGVyVG9wXzE3XzA9cnVsZUJvcmRlclN0eWxlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYm9yZGVyVG9wIiwKKyAgICAgICAgCQlsdl9ib3JkZXJUb3BfMTdfMCwgCisgICAgICAgIAkJIkJvcmRlclN0eWxlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNil9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDYpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzE4PSdib3JkZXItYm90dG9tJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTgsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJvcmRlckJvdHRvbUtleXdvcmRfM182XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfNl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2JvcmRlckJvdHRvbV8xOV8wPXJ1bGVCb3JkZXJTdHlsZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImJvcmRlckJvdHRvbSIsCisgICAgICAgIAkJbHZfYm9yZGVyQm90dG9tXzE5XzAsIAorICAgICAgICAJCSJCb3JkZXJTdHlsZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDcpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA3KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8yMD0nYm9yZGVyLWxlZnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyTGVmdEtleXdvcmRfM183XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJMZWZ0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzdfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9ib3JkZXJMZWZ0XzIxXzA9cnVsZUJvcmRlclN0eWxlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYm9yZGVyTGVmdCIsCisgICAgICAgIAkJbHZfYm9yZGVyTGVmdF8yMV8wLCAKKyAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA4KX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgOCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMjI9J2JvcmRlci1yaWdodCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIyLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJSaWdodEtleXdvcmRfM184XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJSaWdodEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM184XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYm9yZGVyUmlnaHRfMjNfMD1ydWxlQm9yZGVyU3R5bGUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJib3JkZXJSaWdodCIsCisgICAgICAgIAkJbHZfYm9yZGVyUmlnaHRfMjNfMCwgCisgICAgICAgIAkJIkJvcmRlclN0eWxlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgOSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDkpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzI0PSdwYWRkaW5nLXRvcCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI0LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nVG9wS2V5d29yZF8zXzlfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM185XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ1RvcFZhbHVlIiwKKyAgICAgICAgCQlsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzlfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPXJ1bGVVbml0RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBhZGRpbmdUb3BVbml0IiwKKyAgICAgICAgCQlsdl9wYWRkaW5nVG9wVW5pdF8yNl8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEwKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8yNz0ncGFkZGluZy1ib3R0b20nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yNywgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbUtleXdvcmRfM18xMF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzEwXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ0JvdHRvbVZhbHVlIiwKKyAgICAgICAgCQlsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzEwXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nQm90dG9tVW5pdCIsCisgICAgICAgIAkJbHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMzA9J3BhZGRpbmctbGVmdCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMwLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nTGVmdEtleXdvcmRfM18xMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nTGVmdFZhbHVlIiwKKyAgICAgICAgCQlsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzAsIAorICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTFfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nTGVmdFVuaXQiLAorICAgICAgICAJCWx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMil9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8zMz0ncGFkZGluZy1yaWdodCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMzLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRLZXl3b3JkXzNfMTJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdSaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzEyXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWRkaW5nUmlnaHRWYWx1ZSIsCisgICAgICAgIAkJbHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTJfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFkZGluZ1JpZ2h0VW5pdCIsCisgICAgICAgIAkJbHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMyl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEzKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8zNj0nbWFyZ2luLXRvcCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzM2LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BLZXl3b3JkXzNfMTNfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblRvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzEzXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWFyZ2luVG9wVmFsdWVfMzdfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtYXJnaW5Ub3BWYWx1ZSIsCisgICAgICAgIAkJbHZfbWFyZ2luVG9wVmFsdWVfMzdfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTNfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5Ub3BVbml0XzM4XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luVG9wVW5pdCIsCisgICAgICAgIAkJbHZfbWFyZ2luVG9wVW5pdF8zOF8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE0KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl8zOT0nbWFyZ2luLWJvdHRvbScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzM5LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21LZXl3b3JkXzNfMTRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE0XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtYXJnaW5Cb3R0b21WYWx1ZSIsCisgICAgICAgIAkJbHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luQm90dG9tVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTRfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luQm90dG9tVW5pdCIsCisgICAgICAgIAkJbHZfbWFyZ2luQm90dG9tVW5pdF80MV8wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE1KTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigJb3RoZXJsdl80Mj0nbWFyZ2luLWxlZnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80MiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdEtleXdvcmRfM18xNV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE1XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWFyZ2luTGVmdFZhbHVlIiwKKyAgICAgICAgCQlsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzE1XzJfMCgpKTsgCisJICAgIH0KKwkJbHZfbWFyZ2luTGVmdFVuaXRfNDRfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtYXJnaW5MZWZ0VW5pdCIsCisgICAgICAgIAkJbHZfbWFyZ2luTGVmdFVuaXRfNDRfMCwgCisgICAgICAgIAkJIlVuaXRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTYpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNik7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNDU9J21hcmdpbi1yaWdodCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQ1LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5SaWdodEtleXdvcmRfM18xNl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xNl8xXzAoKSk7IAorCSAgICB9CisJCWx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtYXJnaW5SaWdodFZhbHVlIiwKKyAgICAgICAgCQlsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzAsIAorICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTZfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD1ydWxlVW5pdEVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtYXJnaW5SaWdodFVuaXQiLAorICAgICAgICAJCWx2X21hcmdpblJpZ2h0VW5pdF80N18wLCAKKyAgICAgICAgCQkiVW5pdEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIAorCisJCSkqCQorCSkKKykKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCX0KKworKQlvdGhlcmx2XzQ4PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNDgsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVNvbWVGb3JtYXQKK2VudHJ5UnVsZVNvbWVGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0UnVsZSgpKTsgfQorCSBpdl9ydWxlU29tZUZvcm1hdD1ydWxlU29tZUZvcm1hdCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVNvbWVGb3JtYXQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFNvbWVGb3JtYXQKK3J1bGVTb21lRm9ybWF0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXRVb21vRm9ybWF0UGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVW9tb0Zvcm1hdF8wPXJ1bGVVb21vRm9ybWF0CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Vb21vRm9ybWF0XzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXROdW1iZXJGb3JtYXRQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19OdW1iZXJGb3JtYXRfMT1ydWxlTnVtYmVyRm9ybWF0CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19OdW1iZXJGb3JtYXRfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldEN1cnJlbmN5Rm9ybWF0UGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfQ3VycmVuY3lGb3JtYXRfMj1ydWxlQ3VycmVuY3lGb3JtYXQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0N1cnJlbmN5Rm9ybWF0XzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlRm9ybWF0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgfQorICAgIHRoaXNfRGF0ZUZvcm1hdF8zPXJ1bGVEYXRlRm9ybWF0CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19EYXRlRm9ybWF0XzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlVGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzQoKSk7IAorICAgIH0KKyAgICB0aGlzX0RhdGVUaW1lRm9ybWF0XzQ9cnVsZURhdGVUaW1lRm9ybWF0CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19EYXRlVGltZUZvcm1hdF80LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0VGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzUoKSk7IAorICAgIH0KKyAgICB0aGlzX1RpbWVGb3JtYXRfNT1ydWxlVGltZUZvcm1hdAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGltZUZvcm1hdF81LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVW9tb0Zvcm1hdAorZW50cnlSdWxlVW9tb0Zvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOyB9CisJIGl2X3J1bGVVb21vRm9ybWF0PXJ1bGVVb21vRm9ybWF0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVW9tb0Zvcm1hdC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVW9tb0Zvcm1hdAorcnVsZVVvbW9Gb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSd1b21vJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0VW9tb0tleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorCW90aGVybHZfMz0ndWknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCWx2X3VpX3BhdHRlcm5fNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3VpX3BhdHRlcm5fNF8wLCBncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0S2V5d29yZF81KCkpOworICAgIH0KKygKKygKKwkJbHZfcmVwb3J0X3BhdHRlcm5fNl8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzZfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgIAkJbHZfcmVwb3J0X3BhdHRlcm5fNl8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzc9J3RleHRhbGlnbicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfNygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOF8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0YWxpZ25fOF8wPXJ1bGVUZXh0QWxpZ25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dGFsaWduIiwKKyAgICAgICAgCQlsdl90ZXh0YWxpZ25fOF8wLCAKKyAgICAgICAgCQkiVGV4dEFsaWduRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl85PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzkoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlTnVtYmVyRm9ybWF0CitlbnRyeVJ1bGVOdW1iZXJGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkpOyB9CisJIGl2X3J1bGVOdW1iZXJGb3JtYXQ9cnVsZU51bWJlckZvcm1hdCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU51bWJlckZvcm1hdC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgTnVtYmVyRm9ybWF0CitydWxlTnVtYmVyRm9ybWF0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nbnVtYmVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXROdW1iZXJLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9uYW1lXzFfMD1SVUxFX0lECisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJJRCIpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKwlvdGhlcmx2XzM9J3VpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCWx2X3VpX3BhdHRlcm5fNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3VpX3BhdHRlcm5fNF8wLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInVpX3BhdHRlcm4iLAorICAgICAgICAJCWx2X3VpX3BhdHRlcm5fNF8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzU9J3JlcG9ydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0S2V5d29yZF81KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wKCkpOyAKKwkgICAgfQorCQlsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPXJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9jYXRlZ29yeSIsCisgICAgICAgIAkJbHZfcmVwb3J0X2NhdGVnb3J5XzZfMCwgCisgICAgICAgIAkJIk51bWJlckZvcm1hdENhdGVnb3J5RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCWx2X3JlcG9ydF9wYXR0ZXJuXzdfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9yZXBvcnRfcGF0dGVybl83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9wYXR0ZXJuIiwKKyAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl83XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0ndGV4dGFsaWduJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0YWxpZ25fOV8wPXJ1bGVUZXh0QWxpZ25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0ZXh0YWxpZ24iLAorICAgICAgICAJCWx2X3RleHRhbGlnbl85XzAsIAorICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzEwPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwKCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUN1cnJlbmN5Rm9ybWF0CitlbnRyeVJ1bGVDdXJyZW5jeUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpKTsgfQorCSBpdl9ydWxlQ3VycmVuY3lGb3JtYXQ9cnVsZUN1cnJlbmN5Rm9ybWF0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ3VycmVuY3lGb3JtYXQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEN1cnJlbmN5Rm9ybWF0CitydWxlQ3VycmVuY3lGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdjdXJyZW5jeScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRDdXJyZW5jeUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJJRCIpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorCW90aGVybHZfMz0ndWknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0VWlLZXl3b3JkXzMoKSk7CisgICAgfQorKAorKAorCQlsdl91aV9wYXR0ZXJuXzRfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl91aV9wYXR0ZXJuXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfNSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9jYXRlZ29yeSIsCisgICAgICAgIAkJbHZfcmVwb3J0X2NhdGVnb3J5XzZfMCwgCisgICAgICAgIAkJIkN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJbHZfcmVwb3J0X3BhdHRlcm5fN18wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9wYXR0ZXJuIiwKKyAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl83XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0ndGV4dGFsaWduJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfOCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dGFsaWduXzlfMD1ydWxlVGV4dEFsaWduRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0ZXh0YWxpZ24iLAorICAgICAgICAJCWx2X3RleHRhbGlnbl85XzAsIAorICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzEwPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTAoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0ZUZvcm1hdAorZW50cnlSdWxlRGF0ZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRlRm9ybWF0PXJ1bGVEYXRlRm9ybWF0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlRGF0ZUZvcm1hdC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0ZUZvcm1hdAorcnVsZURhdGVGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdkYXRlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0RGF0ZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorCW90aGVybHZfMz0ndWknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCWx2X3VpX3BhdHRlcm5fNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3VpX3BhdHRlcm5fNF8wLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0S2V5d29yZF81KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X2NhdGVnb3J5RGF0ZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRfY2F0ZWdvcnkiLAorICAgICAgICAJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzAsIAorICAgICAgICAJCSJEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJbHZfcmVwb3J0X3BhdHRlcm5fN18wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgIAkJbHZfcmVwb3J0X3BhdHRlcm5fN18wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzg9J3RleHRhbGlnbicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfOCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0YWxpZ25fOV8wPXJ1bGVUZXh0QWxpZ25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dGFsaWduIiwKKyAgICAgICAgCQlsdl90ZXh0YWxpZ25fOV8wLCAKKyAgICAgICAgCQkiVGV4dEFsaWduRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8xMD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTAoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0ZVRpbWVGb3JtYXQKK2VudHJ5UnVsZURhdGVUaW1lRm9ybWF0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRlVGltZUZvcm1hdD1ydWxlRGF0ZVRpbWVGb3JtYXQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVEYXRlVGltZUZvcm1hdC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0ZVRpbWVGb3JtYXQKK3J1bGVEYXRlVGltZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2RhdGUrdGltZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlVGltZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJJRCIpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorCW90aGVybHZfMz0ndWknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0VWlLZXl3b3JkXzMoKSk7CisgICAgfQorKAorKAorCQlsdl91aV9wYXR0ZXJuXzRfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl91aV9wYXR0ZXJuXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfNSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGVUaW1lRm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9jYXRlZ29yeSIsCisgICAgICAgIAkJbHZfcmVwb3J0X2NhdGVnb3J5XzZfMCwgCisgICAgICAgIAkJIkRhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJbHZfcmVwb3J0X3BhdHRlcm5fN18wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlcG9ydF9wYXR0ZXJuIiwKKyAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl83XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0ndGV4dGFsaWduJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfOCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dGFsaWduXzlfMD1ydWxlVGV4dEFsaWduRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0ZXh0YWxpZ24iLAorICAgICAgICAJCWx2X3RleHRhbGlnbl85XzAsIAorICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzEwPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTAoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGltZUZvcm1hdAorZW50cnlSdWxlVGltZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRSdWxlKCkpOyB9CisJIGl2X3J1bGVUaW1lRm9ybWF0PXJ1bGVUaW1lRm9ybWF0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGltZUZvcm1hdC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGltZUZvcm1hdAorcnVsZVRpbWVGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSd0aW1lJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0VGltZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorCW90aGVybHZfMz0ndWknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCWx2X3VpX3BhdHRlcm5fNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3VpX3BhdHRlcm5fNF8wLCBncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispCW90aGVybHZfNT0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0S2V5d29yZF81KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X2NhdGVnb3J5VGltZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRfY2F0ZWdvcnkiLAorICAgICAgICAJCWx2X3JlcG9ydF9jYXRlZ29yeV82XzAsIAorICAgICAgICAJCSJUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJbHZfcmVwb3J0X3BhdHRlcm5fN18wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgIAkJbHZfcmVwb3J0X3BhdHRlcm5fN18wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzg9J3RleHRhbGlnbicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfOCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGltZUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0YWxpZ25fOV8wPXJ1bGVUZXh0QWxpZ25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dGFsaWduIiwKKyAgICAgICAgCQlsdl90ZXh0YWxpZ25fOV8wLCAKKyAgICAgICAgCQkiVGV4dEFsaWduRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8xMD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTAoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0CitlbnRyeVJ1bGVSZXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVSZXBvcnQ9cnVsZVJlcG9ydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJlcG9ydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0CitydWxlUmVwb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0ncmVwb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRSZXBvcnRLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9uYW1lXzFfMD1SVUxFX0lECisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJJRCIpOworCSAgICB9CisKKykKKykoKAorKAorCQlsdl9kZXNjcmlwdGlvbl8yXzA9CSdkZXNjcmliZWQgYnknIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZGVzY3JpcHRpb25fMl8wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzJfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImRlc2NyaXB0aW9uIiwgdHJ1ZSwgImRlc2NyaWJlZCBieSIpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9kZXNjcmlwdGlvblZhbHVlXzNfMD1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZXNjcmlwdGlvblZhbHVlIiwKKyAgICAgICAgCQlsdl9kZXNjcmlwdGlvblZhbHVlXzNfMCwgCisgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPygJb3RoZXJsdl80PSd0b29sYmFyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRUb29sYmFyS2V5d29yZF8zXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzU9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldFRvb2xiYXJBY3Rpb25Ub29sYmFyQ3Jvc3NSZWZlcmVuY2VfM18xXzAoKSk7IAorCX0KKworKQorKSk/CW90aGVybHZfNj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CisJb3RoZXJsdl83PSdkYXRhbWFydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RGF0YW1hcnRLZXl3b3JkXzUoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2Xzg9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldERhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uQ3Jvc3NSZWZlcmVuY2VfNl8wKCkpOyAKKwl9CisKKykKKykJb3RoZXJsdl85PSdyZW5kZXJpbmcnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldFJlbmRlcmluZ0tleXdvcmRfNygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0UmVuZGVyaW5nUmVuZGVyaW5nRW51bUVudW1SdWxlQ2FsbF84XzAoKSk7IAorCSAgICB9CisJCWx2X3JlbmRlcmluZ18xMF8wPXJ1bGVSZW5kZXJpbmdFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZW5kZXJpbmciLAorICAgICAgICAJCWx2X3JlbmRlcmluZ18xMF8wLCAKKyAgICAgICAgCQkiUmVuZGVyaW5nRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTE9J2V4dGVybmFsQ3NzVVJJJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklLZXl3b3JkXzlfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X2V4dGVybmFsQ3NzVVJJXzEyXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfZXh0ZXJuYWxDc3NVUklfMTJfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRBY2Nlc3MoKS5nZXRFeHRlcm5hbENzc1VSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfOV8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHRlcm5hbENzc1VSSSIsCisgICAgICAgIAkJbHZfZXh0ZXJuYWxDc3NVUklfMTJfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTM9J2Zyb20gYnVuZGxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RnJvbUJ1bmRsZUtleXdvcmRfOV8yXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzE0XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzlfMl8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHRlcm5hbENzc1VSSUJ1bmRsZSIsCisgICAgICAgIAkJbHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTRfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpPyk/CW90aGVybHZfMTU9J3BhZ2V0ZW1wbGF0ZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZUtleXdvcmRfMTAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzE2PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0UGFnZVRlbXBsYXRlUGFnZVRlbXBsYXRlQ3Jvc3NSZWZlcmVuY2VfMTFfMCgpKTsgCisJfQorCispCispCW90aGVybHZfMTc9J21lZGlhJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTcsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0TWVkaWFLZXl3b3JkXzEyKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xOD1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzE4LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldE1lZGlhTWVkaWFDcm9zc1JlZmVyZW5jZV8xM18wKCkpOyAKKwl9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0QWNjZXNzKCkuZ2V0RGVzaWduUmVwb3J0RGVzaWduUGFyc2VyUnVsZUNhbGxfMTRfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVzaWduXzE5XzA9cnVsZVJlcG9ydERlc2lnbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVzaWduIiwKKyAgICAgICAgCQlsdl9kZXNpZ25fMTlfMCwgCisgICAgICAgIAkJIlJlcG9ydERlc2lnbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8yMD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIwLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xNSgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnREZXNpZ24KK2VudHJ5UnVsZVJlcG9ydERlc2lnbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJlcG9ydERlc2lnbj1ydWxlUmVwb3J0RGVzaWduIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUmVwb3J0RGVzaWduLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSZXBvcnREZXNpZ24KK3J1bGVSZXBvcnREZXNpZ24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduQWNjZXNzKCkuZ2V0UmVwb3J0RGVzaWduRmlsZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1JlcG9ydERlc2lnbkZpbGVfMD1ydWxlUmVwb3J0RGVzaWduRmlsZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUmVwb3J0RGVzaWduRmlsZV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25BY2Nlc3MoKS5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1JlcG9ydERlc2lnblRlbXBsYXRlXzE9cnVsZVJlcG9ydERlc2lnblRlbXBsYXRlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19SZXBvcnREZXNpZ25UZW1wbGF0ZV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0RGVzaWduRmlsZQorZW50cnlSdWxlUmVwb3J0RGVzaWduRmlsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkZpbGVSdWxlKCkpOyB9CisJIGl2X3J1bGVSZXBvcnREZXNpZ25GaWxlPXJ1bGVSZXBvcnREZXNpZ25GaWxlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUmVwb3J0RGVzaWduRmlsZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0RGVzaWduRmlsZQorcnVsZVJlcG9ydERlc2lnbkZpbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdmaWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25GaWxlQWNjZXNzKCkuZ2V0RmlsZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfMV8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnbkZpbGVBY2Nlc3MoKS5nZXROYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduRmlsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUmVwb3J0RGVzaWduVGVtcGxhdGUKK2VudHJ5UnVsZVJlcG9ydERlc2lnblRlbXBsYXRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVSdWxlKCkpOyB9CisJIGl2X3J1bGVSZXBvcnREZXNpZ25UZW1wbGF0ZT1ydWxlUmVwb3J0RGVzaWduVGVtcGxhdGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSZXBvcnREZXNpZ25UZW1wbGF0ZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0RGVzaWduVGVtcGxhdGUKK3J1bGVSZXBvcnREZXNpZ25UZW1wbGF0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3RlbXBsYXRlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpLmdldFRlbXBsYXRlS2V5d29yZF8wKCkpOworICAgIH0KKwlvdGhlcmx2XzE9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMSgpKTsKKyAgICB9CisoCW90aGVybHZfMj0nZGVzY3JpYmVkIGJ5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpLmdldERlc2NyaWJlZEJ5S2V5d29yZF8yXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9kZXNjcmlwdGlvbl8zXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfZGVzY3JpcHRpb25fM18wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZXNjcmlwdGlvbiIsCisgICAgICAgIAkJbHZfZGVzY3JpcHRpb25fM18wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0SGVhZGVyUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfaGVhZGVyXzRfMD1ydWxlUGFnZUhlYWRlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJoZWFkZXIiLAorICAgICAgICAJCWx2X2hlYWRlcl80XzAsIAorICAgICAgICAJCSJQYWdlSGVhZGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXREZXRhaWxQYWdlRGV0YWlsUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKKwkgICAgfQorCQlsdl9kZXRhaWxfNV8wPXJ1bGVQYWdlRGV0YWlsCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRldGFpbCIsCisgICAgICAgIAkJbHZfZGV0YWlsXzVfMCwgCisgICAgICAgIAkJIlBhZ2VEZXRhaWwiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlQWNjZXNzKCkuZ2V0Rm9vdGVyUGFnZUZvb3RlclBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfZm9vdGVyXzZfMD1ydWxlUGFnZUZvb3RlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmb290ZXIiLAorICAgICAgICAJCWx2X2Zvb3Rlcl82XzAsIAorICAgICAgICAJCSJQYWdlRm9vdGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8Jb3RoZXJsdl83PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkpOworICAgIH0KKykKKzsKKworCisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVQYWdlSGVhZGVyCitlbnRyeVJ1bGVQYWdlSGVhZGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUhlYWRlclJ1bGUoKSk7IH0KKwkgaXZfcnVsZVBhZ2VIZWFkZXI9cnVsZVBhZ2VIZWFkZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVQYWdlSGVhZGVyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBQYWdlSGVhZGVyCitydWxlUGFnZUhlYWRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRQYWdlSGVhZGVyQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0naGVhZGVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlSGVhZGVyQWNjZXNzKCkuZ2V0SGVhZGVyS2V5d29yZF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJbHZfc2hvd09uRmlyc3RfM18wPQknc2hvd09uRmlyc3QnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfc2hvd09uRmlyc3RfM18wLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRTaG93T25GaXJzdFNob3dPbkZpcnN0S2V5d29yZF8zXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInNob3dPbkZpcnN0IiwgdHJ1ZSwgInNob3dPbkZpcnN0Iik7CisJICAgIH0KKworKQorKT8Jb3RoZXJsdl80PSdoZWlnaHQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRIZWlnaHRLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJBY2Nlc3MoKS5nZXRIZWlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9oZWlnaHRWYWx1ZV81XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaGVpZ2h0VmFsdWUiLAorICAgICAgICAJCWx2X2hlaWdodFZhbHVlXzVfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlSGVhZGVyQWNjZXNzKCkuZ2V0SGVpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzZfMCgpKTsgCisJICAgIH0KKwkJbHZfaGVpZ2h0VW5pdF82XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaGVpZ2h0VW5pdCIsCisgICAgICAgIAkJbHZfaGVpZ2h0VW5pdF82XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUhlYWRlckFjY2VzcygpLmdldEVsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfN18wPXJ1bGVFbGVtZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzdfMCwgCisgICAgICAgIAkJIkVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUhlYWRlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVBhZ2VEZXRhaWwKK2VudHJ5UnVsZVBhZ2VEZXRhaWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRGV0YWlsUnVsZSgpKTsgfQorCSBpdl9ydWxlUGFnZURldGFpbD1ydWxlUGFnZURldGFpbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVBhZ2VEZXRhaWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFBhZ2VEZXRhaWwKK3J1bGVQYWdlRGV0YWlsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZURldGFpbEFjY2VzcygpLmdldFBhZ2VEZXRhaWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkZXRhaWwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VEZXRhaWxBY2Nlc3MoKS5nZXREZXRhaWxLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZURldGFpbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VEZXRhaWxBY2Nlc3MoKS5nZXRFbGVtZW50c0VsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzNfMD1ydWxlRWxlbWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRGV0YWlsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAJCSJFbGVtZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl80PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRGV0YWlsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUGFnZUZvb3RlcgorZW50cnlSdWxlUGFnZUZvb3RlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVQYWdlRm9vdGVyPXJ1bGVQYWdlRm9vdGVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUGFnZUZvb3Rlci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUGFnZUZvb3RlcgorcnVsZVBhZ2VGb290ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0UGFnZUZvb3RlckFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2Zvb3RlcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldEZvb3RlcktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCWx2X3Nob3dPbkxhc3RfM18wPQknc2hvd09uTGFzdCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9zaG93T25MYXN0XzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0U2hvd09uTGFzdFNob3dPbkxhc3RLZXl3b3JkXzNfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAic2hvd09uTGFzdCIsIHRydWUsICJzaG93T25MYXN0Iik7CisJICAgIH0KKworKQorKT8Jb3RoZXJsdl80PSdoZWlnaHQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJBY2Nlc3MoKS5nZXRIZWlnaHRLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJBY2Nlc3MoKS5nZXRIZWlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9oZWlnaHRWYWx1ZV81XzA9cnVsZVVuc2lnbmVkTnVtYmVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaGVpZ2h0VmFsdWUiLAorICAgICAgICAJCWx2X2hlaWdodFZhbHVlXzVfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlRm9vdGVyQWNjZXNzKCkuZ2V0SGVpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzZfMCgpKTsgCisJICAgIH0KKwkJbHZfaGVpZ2h0VW5pdF82XzA9cnVsZVVuaXRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaGVpZ2h0VW5pdCIsCisgICAgICAgIAkJbHZfaGVpZ2h0VW5pdF82XzAsIAorICAgICAgICAJCSJVbml0RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldEVsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfN18wPXJ1bGVFbGVtZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzdfMCwgCisgICAgICAgIAkJIkVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZUZvb3RlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUVsZW1lbnQKK2VudHJ5UnVsZUVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpKTsgfQorCSBpdl9ydWxlRWxlbWVudD1ydWxlRWxlbWVudCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUVsZW1lbnQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEVsZW1lbnQKK3J1bGVFbGVtZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRUaXRsZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1RpdGxlXzA9cnVsZVRpdGxlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UaXRsZV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0U3ViVGl0bGVQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19TdWJUaXRsZV8xPXJ1bGVTdWJUaXRsZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfU3ViVGl0bGVfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldFN1YlN1YlRpdGxlUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfU3ViU3ViVGl0bGVfMj1ydWxlU3ViU3ViVGl0bGUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1N1YlN1YlRpdGxlXzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXRMYWJlbFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgIH0KKyAgICB0aGlzX0xhYmVsXzM9cnVsZUxhYmVsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19MYWJlbF8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0VGV4dFBhcnNlclJ1bGVDYWxsXzQoKSk7IAorICAgIH0KKyAgICB0aGlzX1RleHRfND1ydWxlVGV4dAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGV4dF80LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50QWNjZXNzKCkuZ2V0QXV0b1RleHRQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICB9CisgICAgdGhpc19BdXRvVGV4dF81PXJ1bGVBdXRvVGV4dAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfQXV0b1RleHRfNS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEltYWdlUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgfQorICAgIHRoaXNfSW1hZ2VfNj1ydWxlSW1hZ2UKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0ltYWdlXzYuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXREYXRhbWFydFRhYmxlUGFyc2VyUnVsZUNhbGxfNygpKTsgCisgICAgfQorICAgIHRoaXNfRGF0YW1hcnRUYWJsZV83PXJ1bGVEYXRhbWFydFRhYmxlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19EYXRhbWFydFRhYmxlXzcuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRBY2Nlc3MoKS5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF84KCkpOyAKKyAgICB9CisgICAgdGhpc19EYXRhbWFydFRhYmxlUHJvcGVydHlfOD1ydWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19EYXRhbWFydFRhYmxlUHJvcGVydHlfOC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudEFjY2VzcygpLmdldEdyaWRQYXJzZXJSdWxlQ2FsbF85KCkpOyAKKyAgICB9CisgICAgdGhpc19HcmlkXzk9cnVsZUdyaWQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0dyaWRfOS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUdyaWQKK2VudHJ5UnVsZUdyaWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUnVsZSgpKTsgfQorCSBpdl9ydWxlR3JpZD1ydWxlR3JpZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUdyaWQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEdyaWQKK3J1bGVHcmlkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZEFjY2VzcygpLmdldEdyaWRBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdncmlkJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQWNjZXNzKCkuZ2V0R3JpZEtleXdvcmRfMSgpKTsKKyAgICB9CisoCW90aGVybHZfMj0nYXMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldEdyaWRBY2Nlc3MoKS5nZXRBc0tleXdvcmRfMl8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8zXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzNfMCwgCisgICAgICAgIAkJIklEIik7CisJICAgIH0KKworKQorKSk/CW90aGVybHZfND0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEdyaWRBY2Nlc3MoKS5nZXRSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfcm93c181XzA9cnVsZUdyaWRSb3cJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyb3dzIiwKKyAgICAgICAgCQlsdl9yb3dzXzVfMCwgCisgICAgICAgIAkJIkdyaWRSb3ciKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldEdyaWRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNSgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVHcmlkUm93CitlbnRyeVJ1bGVHcmlkUm93IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd1J1bGUoKSk7IH0KKwkgaXZfcnVsZUdyaWRSb3c9cnVsZUdyaWRSb3cgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVHcmlkUm93LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBHcmlkUm93CitydWxlR3JpZFJvdyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXRHcmlkUm93QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncm93JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93QWNjZXNzKCkuZ2V0Um93S2V5d29yZF8xKCkpOworICAgIH0KKygJb3RoZXJsdl8yPSdhcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldEFzS2V5d29yZF8yXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9uYW1lXzNfMD1SVUxFX0lECisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X25hbWVfM18wLCBncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfM18wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispKT8oCW90aGVybHZfND0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfM18wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfNT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCgpKTsgCisJfQorCispCispKT8Jb3RoZXJsdl82PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRHcmlkUm93QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd0FjY2VzcygpLmdldENlbGxzR3JpZENlbGxQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X2NlbGxzXzdfMD1ydWxlR3JpZENlbGwJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZFJvd1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjZWxscyIsCisgICAgICAgIAkJbHZfY2VsbHNfN18wLCAKKyAgICAgICAgCQkiR3JpZENlbGwiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2Xzg9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVHcmlkQ2VsbAorZW50cnlSdWxlR3JpZENlbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUdyaWRDZWxsPXJ1bGVHcmlkQ2VsbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUdyaWRDZWxsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBHcmlkQ2VsbAorcnVsZUdyaWRDZWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxBY2Nlc3MoKS5nZXRHcmlkQ2VsbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2NlbGwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0Q2VsbEtleXdvcmRfMSgpKTsKKyAgICB9CisoCW90aGVybHZfMj0nYXMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0QXNLZXl3b3JkXzJfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X25hbWVfM18wPVJVTEVfSUQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgCQlsdl9uYW1lXzNfMCwgCisgICAgICAgIAkJIklEIik7CisJICAgIH0KKworKQorKSk/KAlvdGhlcmx2XzQ9J2NvbHVtbnNwYW4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0Q29sdW1uc3BhbktleXdvcmRfM18wKCkpOworICAgIH0KKygKKygKKwkJbHZfY29sdW1uc3Bhbl81XzA9UlVMRV9JTlQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfY29sdW1uc3Bhbl81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxBY2Nlc3MoKS5nZXRDb2x1bW5zcGFuSU5UVGVybWluYWxSdWxlQ2FsbF8zXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29sdW1uc3BhbiIsCisgICAgICAgIAkJbHZfY29sdW1uc3Bhbl81XzAsIAorICAgICAgICAJCSJJTlQiKTsKKwkgICAgfQorCispCispKT8Jb3RoZXJsdl82PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0RWxlbWVudHNFbGVtZW50UGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c183XzA9cnVsZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0R3JpZENlbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzdfMCwgCisgICAgICAgIAkJIkVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2Xzg9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldEdyaWRDZWxsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZQorZW50cnlSdWxlRGF0YW1hcnRUYWJsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRhbWFydFRhYmxlPXJ1bGVEYXRhbWFydFRhYmxlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlRGF0YW1hcnRUYWJsZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZQorcnVsZURhdGFtYXJ0VGFibGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSd0YWJsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldFRhYmxlS2V5d29yZF8wKCkpOworICAgIH0KKygJb3RoZXJsdl8xPSdzdHlsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldFN0eWxlS2V5d29yZF8xXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzFfMV8wKCkpOyAKKwl9CisKKykKKykpPwlvdGhlcmx2XzM9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKygoCisoCisJCWx2X2RldGFpbGhlYWRlcl80XzA9CSdkZXRhaWxoZWFkZXInIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZGV0YWlsaGVhZGVyXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0RGV0YWlsaGVhZGVyRGV0YWlsaGVhZGVyS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGV0YWlsaGVhZGVyIiwgdHJ1ZSwgImRldGFpbGhlYWRlciIpOworCSAgICB9CisKKykKKykoCW90aGVybHZfNT0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfM18xXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl82PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0SGVhZGVyc3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8xXzAoKSk7IAorCX0KKworKQorKSk/KT8oKAorKAorCQlsdl9kZXRhaWxmb290ZXJfN18wPQknZGV0YWlsZm9vdGVyJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2RldGFpbGZvb3Rlcl83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldERldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfNF8wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImRldGFpbGZvb3RlciIsIHRydWUsICJkZXRhaWxmb290ZXIiKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2Xzg9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzRfMV8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfOT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldEZvb3RlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV80XzFfMV8wKCkpOyAKKwl9CisKKykKKykpPyk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVBY2Nlc3MoKS5nZXRHcm91cHNEYXRhbWFydFRhYmxlR3JvdXBQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X2dyb3Vwc18xMF8wPXJ1bGVEYXRhbWFydFRhYmxlR3JvdXAJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJncm91cHMiLAorICAgICAgICAJCWx2X2dyb3Vwc18xMF8wLCAKKyAgICAgICAgCQkiRGF0YW1hcnRUYWJsZUdyb3VwIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSooCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldERldGFpbERhdGFtYXJ0VGFibGVEZXRhaWxQYXJzZXJSdWxlQ2FsbF82XzAoKSk7IAorCSAgICB9CisJCWx2X2RldGFpbF8xMV8wPXJ1bGVEYXRhbWFydFRhYmxlRGV0YWlsCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGV0YWlsIiwKKyAgICAgICAgCQlsdl9kZXRhaWxfMTFfMCwgCisgICAgICAgIAkJIkRhdGFtYXJ0VGFibGVEZXRhaWwiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMTI9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZUdyb3VwCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRhbWFydFRhYmxlR3JvdXA9cnVsZURhdGFtYXJ0VGFibGVHcm91cCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZURhdGFtYXJ0VGFibGVHcm91cC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZUdyb3VwCitydWxlRGF0YW1hcnRUYWJsZUdyb3VwIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nZ3JvdXAnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEdyb3VwS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJbHZfbmFtZV8xXzA9UlVMRV9JRAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiSUQiKTsKKwkgICAgfQorCispCispCW90aGVybHZfMj0nYnknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEJ5S2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8zPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRHcm91cGluZ1JlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2XzQ9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEhlYWRlckRhdGFtYXJ0VGFibGVHcm91cEhlYWRlclBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfaGVhZGVyXzVfMD1ydWxlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJoZWFkZXIiLAorICAgICAgICAJCWx2X2hlYWRlcl81XzAsIAorICAgICAgICAJCSJEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPygoCisoCisJCWx2X2RldGFpbGhlYWRlcl82XzA9CSdkZXRhaWxoZWFkZXInIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZGV0YWlsaGVhZGVyXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXREZXRhaWxoZWFkZXJEZXRhaWxoZWFkZXJLZXl3b3JkXzZfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImRldGFpbGhlYWRlciIsIHRydWUsICJkZXRhaWxoZWFkZXIiKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2Xzc9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfNl8xXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2Xzg9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEhlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV82XzFfMV8wKCkpOyAKKwl9CisKKykKKykpPyk/KCgKKygKKwkJbHZfZGV0YWlsZm9vdGVyXzlfMD0JJ2RldGFpbGZvb3RlcicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9kZXRhaWxmb290ZXJfOV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldERldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfN18wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGV0YWlsZm9vdGVyIiwgdHJ1ZSwgImRldGFpbGZvb3RlciIpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTA9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzdfMV8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEZvb3RlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV83XzFfMV8wKCkpOyAKKwl9CisKKykKKykpPyk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEFjY2VzcygpLmdldEZvb3RlckRhdGFtYXJ0VGFibGVHcm91cEZvb3RlclBhcnNlclJ1bGVDYWxsXzhfMCgpKTsgCisJICAgIH0KKwkJbHZfZm9vdGVyXzEyXzA9cnVsZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZm9vdGVyIiwKKyAgICAgICAgCQlsdl9mb290ZXJfMTJfMCwgCisgICAgICAgIAkJIkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/CW90aGVybHZfMTM9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOSgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIKK2VudHJ5UnVsZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlclJ1bGUoKSk7IH0KKwkgaXZfcnVsZURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcj1ydWxlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIKK3J1bGVEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY2Nlc3MoKS5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdoZWFkZXInIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjY2VzcygpLmdldEhlYWRlcktleXdvcmRfMSgpKTsKKyAgICB9CisoCW90aGVybHZfMj0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjY2VzcygpLmdldFN0eWxlS2V5d29yZF8yXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzM9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMCgpKTsgCisJfQorCispCispKT8Jb3RoZXJsdl80PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY2Nlc3MoKS5nZXRSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfcm93c181XzA9cnVsZUdyaWRSb3cJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJvd3MiLAorICAgICAgICAJCWx2X3Jvd3NfNV8wLCAKKyAgICAgICAgCQkiR3JpZFJvdyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfNj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzUoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRhbWFydFRhYmxlR3JvdXBGb290ZXI9cnVsZURhdGFtYXJ0VGFibGVHcm91cEZvb3RlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCitydWxlRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nZm9vdGVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJBY2Nlc3MoKS5nZXRGb290ZXJLZXl3b3JkXzEoKSk7CisgICAgfQorKAlvdGhlcmx2XzI9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfMl8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8zPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJBY2Nlc3MoKS5nZXRTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAoKSk7IAorCX0KKworKQorKSk/CW90aGVybHZfND0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0Um93c0dyaWRSb3dQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X3Jvd3NfNV8wPXJ1bGVHcmlkUm93CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyb3dzIiwKKyAgICAgICAgCQlsdl9yb3dzXzVfMCwgCisgICAgICAgIAkJIkdyaWRSb3ciKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZURhdGFtYXJ0VGFibGVEZXRhaWwKK2VudHJ5UnVsZURhdGFtYXJ0VGFibGVEZXRhaWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsUnVsZSgpKTsgfQorCSBpdl9ydWxlRGF0YW1hcnRUYWJsZURldGFpbD1ydWxlRGF0YW1hcnRUYWJsZURldGFpbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZURhdGFtYXJ0VGFibGVEZXRhaWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIERhdGFtYXJ0VGFibGVEZXRhaWwKK3J1bGVEYXRhbWFydFRhYmxlRGV0YWlsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkZXRhaWxzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0RGV0YWlsc0tleXdvcmRfMSgpKTsKKyAgICB9CisoCW90aGVybHZfMj0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfMl8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMz1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMCgpKTsgCisJfQorCispCispKT8oCW90aGVybHZfND0nYWxsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0QWxsS2V5d29yZF8zXzAoKSk7CisgICAgfQorCisgICAgfCgJb3RoZXJsdl81PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRDb2x1bW5Gb3JtYXR0ZXJzRGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfY29sdW1uRm9ybWF0dGVyc182XzA9cnVsZURhdGFtYXJ0VGFibGVQcm9wZXJ0eQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbHVtbkZvcm1hdHRlcnMiLAorICAgICAgICAJCWx2X2NvbHVtbkZvcm1hdHRlcnNfNl8wLCAKKyAgICAgICAgCQkiRGF0YW1hcnRUYWJsZVByb3BlcnR5Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl83PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8yKCkpOworICAgIH0KKykpKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5CitlbnRyeVJ1bGVEYXRhbWFydFRhYmxlUHJvcGVydHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOyB9CisJIGl2X3J1bGVEYXRhbWFydFRhYmxlUHJvcGVydHk9cnVsZURhdGFtYXJ0VGFibGVQcm9wZXJ0eSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZURhdGFtYXJ0VGFibGVQcm9wZXJ0eS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRGF0YW1hcnRUYWJsZVByb3BlcnR5CitydWxlRGF0YW1hcnRUYWJsZVByb3BlcnR5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldENvbHVtblRhYmxlVmFsdWVFbGVtZW50UGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9jb2x1bW5fMF8wPXJ1bGVUYWJsZVZhbHVlRWxlbWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29sdW1uIiwKKyAgICAgICAgCQlsdl9jb2x1bW5fMF8wLCAKKyAgICAgICAgCQkiVGFibGVWYWx1ZUVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorCisoCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCkpOworCX0KKwkoCisJCSgKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDApfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzI9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfMV8wXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzM9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8xXzBfMV8wKCkpOyAKKwl9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMSgpLCAxKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMSgpLCAxKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigoCisoCisJCWx2X2hhc0ltYWdlXzRfMD0JJ2ltYWdlJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2hhc0ltYWdlXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRIYXNJbWFnZUltYWdlS2V5d29yZF8xXzFfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImhhc0ltYWdlIiwgdHJ1ZSwgImltYWdlIik7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbWFnZVRhYmxlSW1hZ2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9pbWFnZV81XzA9cnVsZVRhYmxlSW1hZ2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltYWdlIiwKKyAgICAgICAgCQlsdl9pbWFnZV81XzAsIAorICAgICAgICAJCSJUYWJsZUltYWdlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDIpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDIpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzY9J2ludGVydmFscycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X2hpZGVMYWJlbEludGVydmFsXzdfMD0JJ2hpZGVsYWJlbCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9oaWRlTGFiZWxJbnRlcnZhbF83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SGlkZUxhYmVsSW50ZXJ2YWxIaWRlbGFiZWxLZXl3b3JkXzFfMl8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiaGlkZUxhYmVsSW50ZXJ2YWwiLCB0cnVlLCAiaGlkZWxhYmVsIik7CisJICAgIH0KKworKQorKT8Jb3RoZXJsdl84PSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzVGFibGVJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzFfMl8zXzAoKSk7IAorCSAgICB9CisJCWx2X2ludGVydmFsc185XzA9cnVsZVRhYmxlSW50ZXJ2YWwJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImludGVydmFscyIsCisgICAgICAgIAkJbHZfaW50ZXJ2YWxzXzlfMCwgCisgICAgICAgIAkJIlRhYmxlSW50ZXJ2YWwiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzEwPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpOworICAgIH0KKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDMpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8xKCksIDMpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAlvdGhlcmx2XzExPSdsb29rdXBzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9oaWRlTGFiZWxMb29rdXBfMTJfMD0JJ2hpZGVsYWJlbCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9oaWRlTGFiZWxMb29rdXBfMTJfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRIaWRlTGFiZWxMb29rdXBIaWRlbGFiZWxLZXl3b3JkXzFfM18xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiaGlkZUxhYmVsTG9va3VwIiwgdHJ1ZSwgImhpZGVsYWJlbCIpOworCSAgICB9CisKKykKKyk/CW90aGVybHZfMTM9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc1RhYmxlTG9va3VwUGFyc2VyUnVsZUNhbGxfMV8zXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfbG9va3Vwc18xNF8wPXJ1bGVUYWJsZUxvb2t1cAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibG9va3VwcyIsCisgICAgICAgIAkJbHZfbG9va3Vwc18xNF8wLCAKKyAgICAgICAgCQkiVGFibGVMb29rdXAiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzE1PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpOworICAgIH0KKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIAorCisJCSkqCQorCSkKKykKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzEoKSk7CisJfQorCispKQorOworCisKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlSW1hZ2UKK2VudHJ5UnVsZVRhYmxlSW1hZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVJbWFnZT1ydWxlVGFibGVJbWFnZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlSW1hZ2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlSW1hZ2UKK3J1bGVUYWJsZUltYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldFRhYmxlSW1hZ2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdwYXRoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0UGF0aEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCWx2X2ltYWdlUGF0aFBhdHRlcm5fMl8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2ltYWdlUGF0aFBhdHRlcm5fMl8wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRJbWFnZVBhdGhQYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaW1hZ2VQYXRoUGF0dGVybiIsCisgICAgICAgIAkJbHZfaW1hZ2VQYXRoUGF0dGVybl8yXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKAorCisoCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisJKAorCQkoCisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9oYXNQYXJhbWV0ZXJfNF8wPQknZHluYW1pYycgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9oYXNQYXJhbWV0ZXJfNF8wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRIYXNQYXJhbWV0ZXJEeW5hbWljS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiaGFzUGFyYW1ldGVyIiwgdHJ1ZSwgImR5bmFtaWMiKTsKKwkgICAgfQorCispCispKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigKKygKKwkJbHZfaGlkZUltYWdlTGFiZWxfNV8wPQknaGlkZWxhYmVsJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2hpZGVJbWFnZUxhYmVsXzVfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0SGlkZUltYWdlTGFiZWxIaWRlbGFiZWxLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJoaWRlSW1hZ2VMYWJlbCIsIHRydWUsICJoaWRlbGFiZWwiKTsKKwkgICAgfQorCispCispKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigoCisoCisJCWx2X3Jlc2l6ZV82XzA9CSdyZXNpemUnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfcmVzaXplXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0UmVzaXplUmVzaXplS2V5d29yZF8zXzJfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJyZXNpemUiLCB0cnVlLCAicmVzaXplIik7CisJICAgIH0KKworKQorKSgKKygKKwkJbHZfcmVzaXplU3RyaW5nXzdfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9yZXNpemVTdHJpbmdfN18wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRSZXNpemVTdHJpbmdTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbWFnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmVzaXplU3RyaW5nIiwKKyAgICAgICAgCQlsdl9yZXNpemVTdHJpbmdfN18wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFRhYmxlSW1hZ2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICAKKworCQkpKgkKKwkpCispCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKwl9CisKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVZhbHVlRWxlbWVudAorZW50cnlSdWxlVGFibGVWYWx1ZUVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlVmFsdWVFbGVtZW50PXJ1bGVUYWJsZVZhbHVlRWxlbWVudCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlVmFsdWVFbGVtZW50LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVZhbHVlRWxlbWVudAorcnVsZVRhYmxlVmFsdWVFbGVtZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlVmFsdWVFbGVtZW50QWNjZXNzKCkuZ2V0VGFibGVQcm9wZXJ0eVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1RhYmxlUHJvcGVydHlfMD1ydWxlVGFibGVQcm9wZXJ0eQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGFibGVQcm9wZXJ0eV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZUFnZ3JlZ2F0aW9uXzE9cnVsZVRhYmxlQWdncmVnYXRpb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1RhYmxlQWdncmVnYXRpb25fMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlUHJvcGVydHkKK2VudHJ5UnVsZVRhYmxlUHJvcGVydHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVByb3BlcnR5UnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVQcm9wZXJ0eT1ydWxlVGFibGVQcm9wZXJ0eSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlUHJvcGVydHkuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlUHJvcGVydHkKK3J1bGVUYWJsZVByb3BlcnR5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0ncHJvcGVydHknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRQcm9wZXJ0eUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzE9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRWYWx1ZVJlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlQWdncmVnYXRpb24KK2VudHJ5UnVsZVRhYmxlQWdncmVnYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVBZ2dyZWdhdGlvbj1ydWxlVGFibGVBZ2dyZWdhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlQWdncmVnYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlQWdncmVnYXRpb24KK3J1bGVUYWJsZUFnZ3JlZ2F0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nYWdncmVnYXRlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWdncmVnYXRlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWdncmVnYXRpb25UYWJsZUJhc2VBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYWdncmVnYXRpb25fMV8wPXJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFnZ3JlZ2F0aW9uIiwKKyAgICAgICAgCQlsdl9hZ2dyZWdhdGlvbl8xXzAsIAorICAgICAgICAJCSJUYWJsZUJhc2VBZ2dyZWdhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCX0KKwkoCisJCSgKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfMz0nb24tZ3JvdXAnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRPbkdyb3VwS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzQ9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRPbkdyb3VwRGF0YW1hcnRUYWJsZUdyb3VwQ3Jvc3NSZWZlcmVuY2VfMl8wXzFfMCgpKTsgCisJfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCW90aGVybHZfNT0ndGl0bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUaXRsZUtleXdvcmRfMl8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dF82XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInRleHQiLAorICAgICAgICAJCWx2X3RleHRfNl8wLCAKKyAgICAgICAgCQkiVFJBTlNMQVRBQkxFU1RSSU5HIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICAKKworCQkpKgkKKwkpCispCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwl9CisKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbgorZW50cnlSdWxlVGFibGVCYXNlQWdncmVnYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJhc2VBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uPXJ1bGVUYWJsZUJhc2VBZ2dyZWdhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZUJhc2VBZ2dyZWdhdGlvbgorcnVsZVRhYmxlQmFzZUFnZ3JlZ2F0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZVB1cmVBZ2dyZWdhdGlvbl8wPXJ1bGVUYWJsZVB1cmVBZ2dyZWdhdGlvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGFibGVQdXJlQWdncmVnYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZVVuYXJ5QWdncmVnYXRpb25fMT1ydWxlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZVVuYXJ5QWdncmVnYXRpb25fMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fMj1ydWxlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZU11bHRpcGxlQWdncmVnYXRpb25fMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgfQorICAgIHRoaXNfVGFibGVCaW5hcnlBZ2dyZWdhdGlvbl8zPXJ1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uXzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVB1cmVBZ2dyZWdhdGlvbgorZW50cnlSdWxlVGFibGVQdXJlQWdncmVnYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVB1cmVBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uPXJ1bGVUYWJsZVB1cmVBZ2dyZWdhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVB1cmVBZ2dyZWdhdGlvbgorcnVsZVRhYmxlUHVyZUFnZ3JlZ2F0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRBZ2dyZWdhdGlvblB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzAoKSk7IAorCSAgICB9CisJCWx2X2FnZ3JlZ2F0aW9uXzBfMD1ydWxlUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQdXJlQWdncmVnYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYWdncmVnYXRpb24iLAorICAgICAgICAJCWx2X2FnZ3JlZ2F0aW9uXzBfMCwgCisgICAgICAgIAkJIlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uCitlbnRyeVJ1bGVUYWJsZVVuYXJ5QWdncmVnYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVUYWJsZVVuYXJ5QWdncmVnYXRpb249cnVsZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlVW5hcnlBZ2dyZWdhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uCitydWxlVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldEFnZ3JlZ2F0aW9uVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfYWdncmVnYXRpb25fMF8wPXJ1bGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFnZ3JlZ2F0aW9uIiwKKyAgICAgICAgCQlsdl9hZ2dyZWdhdGlvbl8wXzAsIAorICAgICAgICAJCSJVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMT0nb2YnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldE9mS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVVuYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwl9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24KK2VudHJ5UnVsZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbj1ydWxlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZU11bHRpcGxlQWdncmVnYXRpb24KK3J1bGVUYWJsZU11bHRpcGxlQWdncmVnYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWdncmVnYXRpb25NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9hZ2dyZWdhdGlvbl8wXzA9cnVsZU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYWdncmVnYXRpb24iLAorICAgICAgICAJCWx2X2FnZ3JlZ2F0aW9uXzBfMCwgCisgICAgICAgIAkJIk11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8xPSdvZicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0T2ZLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8zPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfM18wKCkpOyAKKwl9CisKKykKKykqCW90aGVybHZfND0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCitlbnRyeVJ1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlQmluYXJ5QWdncmVnYXRpb249cnVsZVRhYmxlQmluYXJ5QWdncmVnYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uCitydWxlVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0QWdncmVnYXRpb25CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfYWdncmVnYXRpb25fMF8wPXJ1bGVCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYWdncmVnYXRpb24iLAorICAgICAgICAJCWx2X2FnZ3JlZ2F0aW9uXzBfMCwgCisgICAgICAgIAkJIkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMT0nb2YnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRPZktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMz1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAoKSk7IAorCX0KKworKQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfND1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV80XzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2XzU9JyknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF81KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlSW50ZXJ2YWwKK2VudHJ5UnVsZVRhYmxlSW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUludGVydmFsUnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVJbnRlcnZhbD1ydWxlVGFibGVJbnRlcnZhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlSW50ZXJ2YWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlSW50ZXJ2YWwKK3J1bGVUYWJsZUludGVydmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxBY2Nlc3MoKS5nZXRUYWJsZU51bWJlckludGVydmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVGFibGVOdW1iZXJJbnRlcnZhbF8wPXJ1bGVUYWJsZU51bWJlckludGVydmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZU51bWJlckludGVydmFsXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxBY2Nlc3MoKS5nZXRUYWJsZURhdGVEYXlJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1RhYmxlRGF0ZURheUludGVydmFsXzE9cnVsZVRhYmxlRGF0ZURheUludGVydmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZURhdGVEYXlJbnRlcnZhbF8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVOdW1iZXJJbnRlcnZhbAorZW50cnlSdWxlVGFibGVOdW1iZXJJbnRlcnZhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxSdWxlKCkpOyB9CisJIGl2X3J1bGVUYWJsZU51bWJlckludGVydmFsPXJ1bGVUYWJsZU51bWJlckludGVydmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGFibGVOdW1iZXJJbnRlcnZhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVOdW1iZXJJbnRlcnZhbAorcnVsZVRhYmxlTnVtYmVySW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3VwIHRvJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0VXBUb0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlckludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X251bWJlckludGVydmFsVmFsdWVfMl8wPXJ1bGVTaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJudW1iZXJJbnRlcnZhbFZhbHVlIiwKKyAgICAgICAgCQlsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlclJhbmdlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X251bWJlclJhbmdlXzNfMD1ydWxlVGFibGVSYW5nZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJudW1iZXJSYW5nZSIsCisgICAgICAgIAkJbHZfbnVtYmVyUmFuZ2VfM18wLCAKKyAgICAgICAgCQkiVGFibGVSYW5nZUVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVEYXRlRGF5SW50ZXJ2YWwKK2VudHJ5UnVsZVRhYmxlRGF0ZURheUludGVydmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxSdWxlKCkpOyB9CisJIGl2X3J1bGVUYWJsZURhdGVEYXlJbnRlcnZhbD1ydWxlVGFibGVEYXRlRGF5SW50ZXJ2YWwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZURhdGVEYXlJbnRlcnZhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVEYXRlRGF5SW50ZXJ2YWwKK3J1bGVUYWJsZURhdGVEYXlJbnRlcnZhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsQWNjZXNzKCkuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkYXlzIGluIHBhc3QnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsQWNjZXNzKCkuZ2V0RGF5c0luUGFzdEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXREYXRlSW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZGF0ZUludGVydmFsVmFsdWVfMl8wPXJ1bGVTaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGF0ZUludGVydmFsVmFsdWUiLAorICAgICAgICAJCWx2X2RhdGVJbnRlcnZhbFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXREYXRlUmFuZ2VUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfZGF0ZVJhbmdlXzNfMD1ydWxlVGFibGVSYW5nZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGF0ZVJhbmdlIiwKKyAgICAgICAgCQlsdl9kYXRlUmFuZ2VfM18wLCAKKyAgICAgICAgCQkiVGFibGVSYW5nZUVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVMb29rdXAKK2VudHJ5UnVsZVRhYmxlTG9va3VwIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBSdWxlKCkpOyB9CisJIGl2X3J1bGVUYWJsZUxvb2t1cD1ydWxlVGFibGVMb29rdXAgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZUxvb2t1cC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVMb29rdXAKK3J1bGVUYWJsZUxvb2t1cCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUxvb2t1cEFjY2VzcygpLmdldFRhYmxlTnVtYmVyTG9va3VwUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVGFibGVOdW1iZXJMb29rdXBfMD1ydWxlVGFibGVOdW1iZXJMb29rdXAKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1RhYmxlTnVtYmVyTG9va3VwXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwQWNjZXNzKCkuZ2V0VGFibGVTdHJpbmdMb29rdXBQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZVN0cmluZ0xvb2t1cF8xPXJ1bGVUYWJsZVN0cmluZ0xvb2t1cAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGFibGVTdHJpbmdMb29rdXBfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZURhdGVEYXlMb29rdXBQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICB9CisgICAgdGhpc19UYWJsZURhdGVEYXlMb29rdXBfMj1ydWxlVGFibGVEYXRlRGF5TG9va3VwCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZURhdGVEYXlMb29rdXBfMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlTnVtYmVyTG9va3VwCitlbnRyeVJ1bGVUYWJsZU51bWJlckxvb2t1cCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwUnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVOdW1iZXJMb29rdXA9cnVsZVRhYmxlTnVtYmVyTG9va3VwIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGFibGVOdW1iZXJMb29rdXAuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlTnVtYmVyTG9va3VwCitydWxlVGFibGVOdW1iZXJMb29rdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldFRhYmxlTnVtYmVyTG9va3VwQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nbnVtYmVyJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldE51bWJlcktleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJMb29rdXBBY2Nlc3MoKS5nZXRMb29rdXBWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfbG9va3VwVmFsdWVfMl8wPXJ1bGVTaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJMb29rdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibG9va3VwVmFsdWUiLAorICAgICAgICAJCWx2X2xvb2t1cFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJMb29rdXBBY2Nlc3MoKS5nZXREaXNjcmV0ZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9kaXNjcmV0ZV8zXzA9cnVsZVRhYmxlUmFuZ2VFbGVtZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRpc2NyZXRlIiwKKyAgICAgICAgCQlsdl9kaXNjcmV0ZV8zXzAsIAorICAgICAgICAJCSJUYWJsZVJhbmdlRWxlbWVudCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVN0cmluZ0xvb2t1cAorZW50cnlSdWxlVGFibGVTdHJpbmdMb29rdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVN0cmluZ0xvb2t1cFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlU3RyaW5nTG9va3VwPXJ1bGVUYWJsZVN0cmluZ0xvb2t1cCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlU3RyaW5nTG9va3VwLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVN0cmluZ0xvb2t1cAorcnVsZVRhYmxlU3RyaW5nTG9va3VwIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZVN0cmluZ0xvb2t1cEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3N0cmluZycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXRTdHJpbmdLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQlsdl9sb29rdXBWYWx1ZV8yXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbG9va3VwVmFsdWVfMl8wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlU3RyaW5nTG9va3VwQWNjZXNzKCkuZ2V0TG9va3VwVmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVN0cmluZ0xvb2t1cFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibG9va3VwVmFsdWUiLAorICAgICAgICAJCWx2X2xvb2t1cFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXREaXNjcmV0ZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9kaXNjcmV0ZV8zXzA9cnVsZVRhYmxlUmFuZ2VFbGVtZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRhYmxlU3RyaW5nTG9va3VwUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRpc2NyZXRlIiwKKyAgICAgICAgCQlsdl9kaXNjcmV0ZV8zXzAsIAorICAgICAgICAJCSJUYWJsZVJhbmdlRWxlbWVudCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZURhdGVEYXlMb29rdXAKK2VudHJ5UnVsZVRhYmxlRGF0ZURheUxvb2t1cCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUxvb2t1cFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlRGF0ZURheUxvb2t1cD1ydWxlVGFibGVEYXRlRGF5TG9va3VwIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGFibGVEYXRlRGF5TG9va3VwLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZURhdGVEYXlMb29rdXAKK3J1bGVUYWJsZURhdGVEYXlMb29rdXAgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXRUYWJsZURhdGVEYXlMb29rdXBBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkYXlzIGluIHBhc3QnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUxvb2t1cEFjY2VzcygpLmdldERheXNJblBhc3RLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUxvb2t1cEFjY2VzcygpLmdldExvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9sb29rdXBWYWx1ZV8yXzA9cnVsZVNpZ25lZE51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibG9va3VwVmFsdWUiLAorICAgICAgICAJCWx2X2xvb2t1cFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5TG9va3VwQWNjZXNzKCkuZ2V0RGlzY3JldGVUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfZGlzY3JldGVfM18wPXJ1bGVUYWJsZVJhbmdlRWxlbWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGlzY3JldGUiLAorICAgICAgICAJCWx2X2Rpc2NyZXRlXzNfMCwgCisgICAgICAgIAkJIlRhYmxlUmFuZ2VFbGVtZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlUmFuZ2VFbGVtZW50CitlbnRyeVJ1bGVUYWJsZVJhbmdlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50UnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVSYW5nZUVsZW1lbnQ9cnVsZVRhYmxlUmFuZ2VFbGVtZW50IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGFibGVSYW5nZUVsZW1lbnQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlUmFuZ2VFbGVtZW50CitydWxlVGFibGVSYW5nZUVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVSYW5nZUVsZW1lbnRBY2Nlc3MoKS5nZXRUYWJsZVRleHRDb2xvclBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1RhYmxlVGV4dENvbG9yXzA9cnVsZVRhYmxlVGV4dENvbG9yCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19UYWJsZVRleHRDb2xvcl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpLmdldFRhYmxlQ2VsbENvbG9yUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfVGFibGVDZWxsQ29sb3JfMT1ydWxlVGFibGVDZWxsQ29sb3IKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1RhYmxlQ2VsbENvbG9yXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0VGFibGVJY29uUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfVGFibGVJY29uXzI9cnVsZVRhYmxlSWNvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGFibGVJY29uXzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0VGFibGVUcmVuZFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgIH0KKyAgICB0aGlzX1RhYmxlVHJlbmRfMz1ydWxlVGFibGVUcmVuZAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfVGFibGVUcmVuZF8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU2lnbmVkTnVtYmVyCitlbnRyeVJ1bGVTaWduZWROdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVTaWduZWROdW1iZXI9cnVsZVNpZ25lZE51bWJlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVNpZ25lZE51bWJlci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBTaWduZWROdW1iZXIKK3J1bGVTaWduZWROdW1iZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisJa3c9Jy0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMCgpKTsgCisgICAgfQorKT8KKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0TnVtYmVyUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfTnVtYmVyXzE9cnVsZU51bWJlciAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfTnVtYmVyXzEpOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVGFibGVUZXh0Q29sb3IKK2VudHJ5UnVsZVRhYmxlVGV4dENvbG9yIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JSdWxlKCkpOyB9CisJIGl2X3J1bGVUYWJsZVRleHRDb2xvcj1ydWxlVGFibGVUZXh0Q29sb3IgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZVRleHRDb2xvci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVGFibGVUZXh0Q29sb3IKK3J1bGVUYWJsZVRleHRDb2xvciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3RleHRjb2xvcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JBY2Nlc3MoKS5nZXRUZXh0Y29sb3JLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFRhYmxlVGV4dENvbG9yUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZUNlbGxDb2xvcgorZW50cnlSdWxlVGFibGVDZWxsQ29sb3IgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUNlbGxDb2xvclJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlQ2VsbENvbG9yPXJ1bGVUYWJsZUNlbGxDb2xvciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRhYmxlQ2VsbENvbG9yLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZUNlbGxDb2xvcgorcnVsZVRhYmxlQ2VsbENvbG9yIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nY2VsbGNvbG9yJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUNlbGxDb2xvckFjY2VzcygpLmdldENlbGxjb2xvcktleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVDZWxsQ29sb3JSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUNlbGxDb2xvckFjY2VzcygpLmdldENvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorCX0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRhYmxlSWNvbgorZW50cnlSdWxlVGFibGVJY29uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJY29uUnVsZSgpKTsgfQorCSBpdl9ydWxlVGFibGVJY29uPXJ1bGVUYWJsZUljb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZUljb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRhYmxlSWNvbgorcnVsZVRhYmxlSWNvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2ljb24nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFRhYmxlSWNvbkFjY2VzcygpLmdldEljb25LZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQlsdl9pY29uXzFfMD1SVUxFX1NUUklORworCQl7CisJCQluZXdMZWFmTm9kZShsdl9pY29uXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25BY2Nlc3MoKS5nZXRJY29uU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorCQl9CisJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJY29uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpY29uIiwKKyAgICAgICAgCQlsdl9pY29uXzFfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUYWJsZVRyZW5kCitlbnRyeVJ1bGVUYWJsZVRyZW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUcmVuZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRhYmxlVHJlbmQ9cnVsZVRhYmxlVHJlbmQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUYWJsZVRyZW5kLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUYWJsZVRyZW5kCitydWxlVGFibGVUcmVuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3RyZW5kJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0VHJlbmRLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRhYmxlVHJlbmRBY2Nlc3MoKS5nZXRJY29uVHJlbmRJY29uRW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ljb25fMV8wPXJ1bGVUcmVuZEljb25FbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRhYmxlVHJlbmRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaWNvbiIsCisgICAgICAgIAkJbHZfaWNvbl8xXzAsIAorICAgICAgICAJCSJUcmVuZEljb25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRpdGxlCitlbnRyeVJ1bGVUaXRsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRpdGxlUnVsZSgpKTsgfQorCSBpdl9ydWxlVGl0bGU9cnVsZVRpdGxlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVGl0bGUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRpdGxlCitydWxlVGl0bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZUFjY2VzcygpLmdldFRpdGxlQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndGl0bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0VGl0bGVLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0VGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dF8yXzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0ZXh0IiwKKyAgICAgICAgCQlsdl90ZXh0XzJfMCwgCisgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMz0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFRpdGxlQWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzNfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGl0bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl80PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRUaXRsZUFjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCgpKTsgCisJfQorCispCispKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVTdWJUaXRsZQorZW50cnlSdWxlU3ViVGl0bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVN1YlRpdGxlPXJ1bGVTdWJUaXRsZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVN1YlRpdGxlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBTdWJUaXRsZQorcnVsZVN1YlRpdGxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVBY2Nlc3MoKS5nZXRTdWJUaXRsZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3N1YnRpdGxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldFN1YnRpdGxlS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X3RleHRfMl8wPXJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dCIsCisgICAgICAgIAkJbHZfdGV4dF8yXzAsIAorICAgICAgICAJCSJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRTdWJUaXRsZUFjY2VzcygpLmdldFN0eWxlS2V5d29yZF8zXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN1YlRpdGxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfND1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0U3ViVGl0bGVBY2Nlc3MoKS5nZXRTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfM18xXzAoKSk7IAorCX0KKworKQorKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU3ViU3ViVGl0bGUKK2VudHJ5UnVsZVN1YlN1YlRpdGxlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVSdWxlKCkpOyB9CisJIGl2X3J1bGVTdWJTdWJUaXRsZT1ydWxlU3ViU3ViVGl0bGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVTdWJTdWJUaXRsZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgU3ViU3ViVGl0bGUKK3J1bGVTdWJTdWJUaXRsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0U3ViU3ViVGl0bGVBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdzdWJzdWJ0aXRsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVBY2Nlc3MoKS5nZXRTdWJzdWJ0aXRsZUtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVBY2Nlc3MoKS5nZXRUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0XzJfMD1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInRleHQiLAorICAgICAgICAJCWx2X3RleHRfMl8wLCAKKyAgICAgICAgCQkiVFJBTlNMQVRBQkxFU1RSSU5HIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPSdzdHlsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0U3ViU3ViVGl0bGVBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfM18wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdWJTdWJUaXRsZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzQ9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkpOyAKKwl9CisKKykKKykpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUxhYmVsCitlbnRyeVJ1bGVMYWJlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldExhYmVsUnVsZSgpKTsgfQorCSBpdl9ydWxlTGFiZWw9cnVsZUxhYmVsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlTGFiZWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIExhYmVsCitydWxlTGFiZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbEFjY2VzcygpLmdldExhYmVsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nbGFiZWwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0TGFiZWxLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0VGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfdGV4dF8yXzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0ZXh0IiwKKyAgICAgICAgCQlsdl90ZXh0XzJfMCwgCisgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMz0nc3R5bGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldExhYmVsQWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzNfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TGFiZWxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl80PVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRMYWJlbEFjY2VzcygpLmdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCgpKTsgCisJfQorCispCispKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUZXh0CitlbnRyeVJ1bGVUZXh0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVRleHQ9cnVsZVRleHQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUZXh0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUZXh0CitydWxlVGV4dCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFRleHRBY2Nlc3MoKS5nZXRUZXh0QWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndGV4dCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dEFjY2VzcygpLmdldFRleHRLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRleHRBY2Nlc3MoKS5nZXRUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl90ZXh0XzJfMD1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFRleHRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGV4dCIsCisgICAgICAgIAkJbHZfdGV4dF8yXzAsIAorICAgICAgICAJCSJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9J3N0eWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRUZXh0QWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzNfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VGV4dFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzQ9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFRleHRBY2Nlc3MoKS5nZXRTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfM18xXzAoKSk7IAorCX0KKworKQorKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQXV0b1RleHQKK2VudHJ5UnVsZUF1dG9UZXh0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRSdWxlKCkpOyB9CisJIGl2X3J1bGVBdXRvVGV4dD1ydWxlQXV0b1RleHQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVBdXRvVGV4dC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQXV0b1RleHQKK3J1bGVBdXRvVGV4dCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2F1dG90ZXh0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEFjY2VzcygpLmdldEF1dG90ZXh0S2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dEFjY2VzcygpLmdldFR5cGVBdXRvVGV4dEVudW1FbnVtUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlXzFfMD1ydWxlQXV0b1RleHRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGUiLAorICAgICAgICAJCWx2X3R5cGVfMV8wLCAKKyAgICAgICAgCQkiQXV0b1RleHRFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8yPSdzdHlsZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0b1RleHRBY2Nlc3MoKS5nZXRTdHlsZUtleXdvcmRfMl8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzM9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldEF1dG9UZXh0QWNjZXNzKCkuZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wKCkpOyAKKwl9CisKKykKKykpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUltYWdlCitlbnRyeVJ1bGVJbWFnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEltYWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlSW1hZ2U9cnVsZUltYWdlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSW1hZ2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEltYWdlCitydWxlSW1hZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdpbWFnZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRJbWFnZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRTaXplSW1hZ2VTaXplRW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3NpemVfMV8wPXJ1bGVJbWFnZVNpemVFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEltYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInNpemUiLAorICAgICAgICAJCWx2X3NpemVfMV8wLCAKKyAgICAgICAgCQkiSW1hZ2VTaXplRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMj0nc2NhbGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0U2NhbGVLZXl3b3JkXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VBY2Nlc3MoKS5nZXRTY2FsZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X3NjYWxlXzNfMD1ydWxlVW5zaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic2NhbGUiLAorICAgICAgICAJCWx2X3NjYWxlXzNfMCwgCisgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0U291cmNlVHlwZUltYWdlU291cmNlRW51bUVudW1SdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X3NvdXJjZVR5cGVfNF8wPXJ1bGVJbWFnZVNvdXJjZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SW1hZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic291cmNlVHlwZSIsCisgICAgICAgIAkJbHZfc291cmNlVHlwZV80XzAsIAorICAgICAgICAJCSJJbWFnZVNvdXJjZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9maWxlbmFtZV81XzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfZmlsZW5hbWVfNV8wLCBncmFtbWFyQWNjZXNzLmdldEltYWdlQWNjZXNzKCkuZ2V0RmlsZW5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmlsZW5hbWUiLAorICAgICAgICAJCWx2X2ZpbGVuYW1lXzVfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSZXBvcnRJbXBvcnQKK2VudHJ5UnVsZVJlcG9ydEltcG9ydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJlcG9ydEltcG9ydD1ydWxlUmVwb3J0SW1wb3J0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUmVwb3J0SW1wb3J0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSZXBvcnRJbXBvcnQKK3J1bGVSZXBvcnRJbXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdpbXBvcnQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydEFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0SW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9cnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0SW1wb3J0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltcG9ydGVkTmFtZXNwYWNlIiwKKyAgICAgICAgCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAsIAorICAgICAgICAJCSJSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK2VudHJ5UnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyB9IAorCSBpdl9ydWxlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD1ydWxlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorcnVsZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19RdWFsaWZpZWROYW1lXzA9cnVsZVF1YWxpZmllZE5hbWUgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1F1YWxpZmllZE5hbWVfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygKKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICB9CisKKwlrdz0nKicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyAKKyAgICB9CispPykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFRSQU5TTEFUQUJMRVNUUklORworcnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorICAgIHRoaXNfU1RSSU5HXzA9UlVMRV9TVFJJTkcgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1NUUklOR18wKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfU1RSSU5HXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb24KK2VudHJ5UnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5ub3RhdGlvbj1ydWxlWEFubm90YXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb24KK3J1bGVYQW5ub3RhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdAJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUp2bUFubm90YXRpb25UeXBlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCScoJyAKKyk9PglvdGhlcmx2XzM9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7CisgICAgfQorKSgoKCgoKAorKAorCQlydWxlVmFsaWRJRAorKQorKQknPScgCispKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfNT0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOworICAgIH0KKygoKCgKKygKKwkJcnVsZVZhbGlkSUQKKykKKykJJz0nIAorKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKyAgICB8KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfN18wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV83XzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/CW90aGVybHZfOD0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKCgoCisoCisJCXJ1bGVWYWxpZElECispCispCSc9JyAKKykpPT4oKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50SnZtT3BlcmF0aW9uQ3Jvc3NSZWZlcmVuY2VfMF8wXzBfMCgpKTsgCisJICAgIH0KKwkJcnVsZVZhbGlkSUQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzE9Jz0nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzJfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgCQlsdl92YWx1ZV8yXzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgoCispCScjJyAKKwknWycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPScjJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSdbJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgfQorKSkoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfND0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c181XzAsIAorICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfNj0nXScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgIH0KKykKKyAgICB8KAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRBZGQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCW90aGVybHZfOT0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfMTBfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfMTBfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkrKT8pKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25FbGVtZW50VmFsdWUKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgoCispCScjJyAKKwknWycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nIycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J1snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgfQorKSkoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzNfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl80PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzVfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8Jb3RoZXJsdl82PSddJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgIH0KKykKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbm5vdGF0aW9uXzA9cnVsZVhBbm5vdGF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5ub3RhdGlvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWEV4cHJlc3Npb25fMT1ydWxlWEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hFeHByZXNzaW9uXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbgorZW50cnlSdWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhFeHByZXNzaW9uPXJ1bGVYRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXhwcmVzc2lvbgorcnVsZVhFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICB9CisgICAgdGhpc19YQXNzaWdubWVudF8wPXJ1bGVYQXNzaWdubWVudAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFzc2lnbm1lbnRfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFzc2lnbm1lbnQKK2VudHJ5UnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyB9CisJIGl2X3J1bGVYQXNzaWdubWVudD1ydWxlWEFzc2lnbm1lbnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQXNzaWdubWVudC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFzc2lnbm1lbnQKK3J1bGVYQXNzaWdubWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhBc3NpZ25tZW50QWN0aW9uXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlRmVhdHVyZUNhbGxJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IAorICAgIH0KK3J1bGVPcFNpbmdsZUFzc2lnbgorICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMF8zXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzNfMD1ydWxlWEFzc2lnbm1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzNfMCwgCisgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhPckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hPckV4cHJlc3Npb25fND1ydWxlWE9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE9yRXhwcmVzc2lvbl80LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcE11bHRpQXNzaWduCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wTXVsdGlBc3NpZ24JCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfN18wPXJ1bGVYQXNzaWdubWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF83XzAsIAorICAgICAgICAJCSJYQXNzaWdubWVudCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbgorZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wU2luZ2xlQXNzaWduPXJ1bGVPcFNpbmdsZUFzc2lnbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wU2luZ2xlQXNzaWduLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wU2luZ2xlQXNzaWduCitydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworCWt3PSc9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aUFzc2lnbgorZW50cnlSdWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE11bHRpQXNzaWduPXJ1bGVPcE11bHRpQXNzaWduIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BNdWx0aUFzc2lnbi5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpQXNzaWduCitydWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScrPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNFcXVhbHNTaWduS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jyo9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorCisgICAgfAorCWt3PScvPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgfQorCisgICAgfAorCWt3PSclPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgIH0KKworCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyAKKyAgICB9CisKKwlrdz0nPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IAorICAgIH0KKykKKyAgICB8KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICB9CisoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzEoKSk7IAorICAgIH0KKyk/CisJa3c9Jz49JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgCisgICAgfQorKSkKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhPckV4cHJlc3Npb249cnVsZVhPckV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYT3JFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYT3JFeHByZXNzaW9uCitydWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YQW5kRXhwcmVzc2lvbl8wPXJ1bGVYQW5kRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEFuZEV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BPcgorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wT3IJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQW5kRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQW5kRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhBbmRFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BPcgorZW50cnlSdWxlT3BPciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE9yPXJ1bGVPcE9yIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BPci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE9yCitydWxlT3BPciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorCisJa3c9J3x8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IAorICAgIH0KKworICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFuZEV4cHJlc3Npb249cnVsZVhBbmRFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEFuZEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbmRFeHByZXNzaW9uCitydWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wQW5kCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BBbmQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhFcXVhbGl0eUV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcEFuZAorZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wQW5kPXJ1bGVPcEFuZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wQW5kLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQW5kCitydWxlT3BBbmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworCWt3PScmJicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQW5kQWNjZXNzKCkuZ2V0QW1wZXJzYW5kQW1wZXJzYW5kS2V5d29yZCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEVxdWFsaXR5RXhwcmVzc2lvbgorcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcEVxdWFsaXR5CispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BFcXVhbGl0eQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAJCSJYUmVsYXRpb25hbEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcEVxdWFsaXR5CitlbnRyeVJ1bGVPcEVxdWFsaXR5IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wRXF1YWxpdHk9cnVsZU9wRXF1YWxpdHkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcEVxdWFsaXR5LmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wRXF1YWxpdHkKK3J1bGVPcEVxdWFsaXR5IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jz09JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyE9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPT09JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorCisgICAgfAorCWt3PSchPT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUmVsYXRpb25hbEV4cHJlc3Npb24KK3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKCgKKykJJ2luc3RhbmNlb2YnIAorKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8yPSdpbnN0YW5jZW9mJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbnN0YW5jZW9mS2V5d29yZF8xXzBfMF8wXzEoKSk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZSIsCisgICAgICAgIAkJbHZfdHlwZV8zXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KCgoKCgKKykoCisoCisJCXJ1bGVPcENvbXBhcmUKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BDb21wYXJlCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfNl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzZfMCwgCisgICAgICAgIAkJIlhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcENvbXBhcmUKK2VudHJ5UnVsZU9wQ29tcGFyZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wQ29tcGFyZT1ydWxlT3BDb21wYXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BDb21wYXJlLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQ29tcGFyZQorcnVsZU9wQ29tcGFyZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PSc+PScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCisgICAgfQorCisJa3c9Jz0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8xXzEoKSk7IAorICAgIH0KKykKKyAgICB8CisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wT3RoZXIKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcE90aGVyCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhBZGRpdGl2ZUV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE90aGVyCitlbnRyeVJ1bGVPcE90aGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcE90aGVyLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3RoZXIKK3J1bGVPcE90aGVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jy0+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy4uPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKKyAgICB9CisKKwlrdz0nLi4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMl8xKCkpOyAKKyAgICB9CispCisgICAgfAorCWt3PScuLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jz0+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzQoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgIH0KKygoKCgKKwknPicgCisKKwknPicgCispKT0+KAorCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzBfMF8wKCkpOyAKKyAgICB9CisKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8wXzBfMSgpKTsgCisgICAgfQorKSkKKyAgICB8CisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMSgpKTsgCisgICAgfQorKSkKKyAgICB8KAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICB9CisoKCgoCisJJzwnIAorCisJJzwnIAorKSk9PigKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMCgpKTsgCisgICAgfQorCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzEoKSk7IAorICAgIH0KKykpCisgICAgfAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPT4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IAorICAgIH0KKykpCisgICAgfAorCWt3PSc8PicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPzonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCitlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQWRkaXRpdmVFeHByZXNzaW9uCitydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcEFkZAorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wQWRkCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQWRkCitlbnRyeVJ1bGVPcEFkZCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BBZGQ9cnVsZU9wQWRkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BBZGQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BBZGQKK3J1bGVPcEFkZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScrJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSctJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK2VudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YVW5hcnlPcGVyYXRpb25fMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YVW5hcnlPcGVyYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BNdWx0aQorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wTXVsdGkJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWFVuYXJ5T3BlcmF0aW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aQorZW50cnlSdWxlT3BNdWx0aSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcE11bHRpPXJ1bGVPcE11bHRpIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BNdWx0aS5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpCitydWxlT3BNdWx0aSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyoqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrQXN0ZXJpc2tLZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRTb2xpZHVzS2V5d29yZF8yKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyUnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25LZXl3b3JkXzMoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24KK2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj1ydWxlWFVuYXJ5T3BlcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVW5hcnlPcGVyYXRpb24KK3J1bGVYVW5hcnlPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFVuYXJ5T3BlcmF0aW9uQWN0aW9uXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcFVuYXJ5CQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzBfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9vcGVyYW5kXzJfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJvcGVyYW5kIiwKKyAgICAgICAgCQlsdl9vcGVyYW5kXzJfMCwgCisgICAgICAgIAkJIlhVbmFyeU9wZXJhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9cnVsZVhDYXN0ZWRFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQ2FzdGVkRXhwcmVzc2lvbl8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BVbmFyeQorZW50cnlSdWxlT3BVbmFyeSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcFVuYXJ5PXJ1bGVPcFVuYXJ5IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BVbmFyeS5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFVuYXJ5CitydWxlT3BVbmFyeSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PSchJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSctJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JysnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzIoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgorZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uPXJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2FzdGVkRXhwcmVzc2lvbgorcnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YUG9zdGZpeE9wZXJhdGlvbl8wPXJ1bGVYUG9zdGZpeE9wZXJhdGlvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispCSdhcycgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8yPSdhcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfMV8wXzBfMSgpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGUiLAorICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uCitlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249cnVsZVhQb3N0Zml4T3BlcmF0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhQb3N0Zml4T3BlcmF0aW9uCitydWxlWFBvc3RmaXhPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD1ydWxlWE1lbWJlckZlYXR1cmVDYWxsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgKKykoCisoCisJCXJ1bGVPcFBvc3RmaXgKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wUG9zdGZpeAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BQb3N0Zml4CitlbnRyeVJ1bGVPcFBvc3RmaXggcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcFBvc3RmaXg9cnVsZU9wUG9zdGZpeCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wUG9zdGZpeC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFBvc3RmaXgKK3J1bGVPcFBvc3RmaXggcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKwlrdz0nKysnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRQbHVzU2lnblBsdXNTaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy0tJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBpdl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsPXJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYTWVtYmVyRmVhdHVyZUNhbGwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNZW1iZXJGZWF0dXJlQ2FsbAorcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYUHJpbWFyeUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMD1ydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YUHJpbWFyeUV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoKAorKSgJJy4nIAorCisgICAgfCgKKygKKwknOjonIAorIAorCispCispKSgKKygKKwkJcnVsZUZlYXR1cmVDYWxsSUQKKykKKykJcnVsZU9wU2luZ2xlQXNzaWduKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgJb3RoZXJsdl8yPScuJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wXzBfMF8xXzAoKSk7CisgICAgfQorCisgICAgfCgKKygKKwkJbHZfZXhwbGljaXRTdGF0aWNfM18wPQknOjonIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXhwbGljaXRTdGF0aWNfM18wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8wXzBfMF8xXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJleHBsaWNpdFN0YXRpYyIsIHRydWUsICI6OiIpOworCSAgICB9CisKKykKKykpKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzBfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlRmVhdHVyZUNhbGxJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8zKCkpOyAKKyAgICB9CitydWxlT3BTaW5nbGVBc3NpZ24KKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VmFsdWVYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3ZhbHVlXzZfMD1ydWxlWEFzc2lnbm1lbnQJCXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM5MmFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wudG9rZW5zCkBAIC0wLDAgKzEsNDkzIEBACisnISc9MTU0CisnIT0nPTE0MAorJyE9PSc9MTQyCisnIyc9MTI2CisnJSc9MTUzCisnJT0nPTEzMworJyYmJz0xMzgKKycmJz0xODcKKycoJz0xMDUKKycpJz0xMDYKKycqJz0xMjIKKycqKic9MTUxCisnKj0nPTEzMQorJysnPTE1MAorJysrJz0xNTUKKycrPSc9MTI5CisnLCc9MTI0CisnLSc9MTEwCisnLS0nPTE1NgorJy09Jz0xMzAKKyctPic9MTQ0CisnLic9MTIxCisnLi4nPTE0NgorJy4uPCc9MTQ1CisnLyc9MTUyCisnLz0nPTEzMgorJzonPTE2NAorJzo6Jz0xNTcKKyc7Jz0xNjAKKyc8Jz0xMzQKKyc8Pic9MTQ4CisnPSc9MTI1CisnPT0nPTEzOQorJz09PSc9MTQxCisnPT4nPTE0NworJz4nPTEzNQorJz49Jz0xMzYKKyc/Jz0xODYKKyc/Lic9MTU4CisnPzonPTE0OQorJ0AnPTEyMworJ1snPTEyNworJ10nPTEyOAorJ2EzJz0xOTcKKydhNCc9MTk2CisnYTUnPTE5OAorJ2FnZ3JlZ2F0ZSc9MTAxCisnYWxsJz05MgorJ2FsdGVybmF0ZSc9NDYKKydhcyc9ODIKKydhdXRvdGV4dCc9MTE4CisnYXZlcmFnZSc9MjI1CisnYmFja2dyb3VuZGNvbG9yJz00NQorJ2JhZC1yaXNpbmcnPTIzMgorJ2JvbGQnPTQxCisnYm9yZGVyLWJvdHRvbSc9NTAKKydib3JkZXItbGVmdCc9NTEKKydib3JkZXItcmlnaHQnPTUyCisnYm9yZGVyLXRvcCc9NDkKKydib3R0b21tYXJnaW4nPTMwCisnYnknPTkwCisnYnktcGVyY2VudCc9MzQKKydjYXNlJz0xNjYKKydjYXRjaCc9MTg1CisnY2VsbCc9ODQKKydjZWxsY29sb3InPTExMQorJ2NlbnRlcic9MjEyCisnY2xpcCc9MjUyCisnY20nPTE4OQorJ2NvbG9yJz0zMgorJ2NvbG9ycyc9MjAKKydjb2x1bW5zcGFuJz04NQorJ2NvbmNhdCc9MjMwCisnY291bnQnPTIyMgorJ2N1cnJlbmN5Jz02NQorJ2N1c3RvbSc9MjE5CisnZGFya2Vucyc9MzMKKydkYXNoZWQnPTIzOQorJ2RhdGFtYXJ0Jz03MQorJ2RhdGUnPTY2CisnZGF0ZSt0aW1lJz02NworJ2RheXMgaW4gcGFzdCc9MTA4CisnZGVmYXVsdCc9MTY1CisnZGVzY3JpYmVkIGJ5Jz02OQorJ2RldGFpbCc9NzgKKydkZXRhaWxmb290ZXInPTg4CisnZGV0YWlsaGVhZGVyJz04NworJ2RldGFpbHMnPTkxCisnZGl2aWRlJz0yMjkKKydkbyc9MTY5CisnZG90dGVkJz0yMzgKKydkb3VibGUnPTI0MAorJ2R5bmFtaWMnPTk4CisnZWxzZSc9MTYyCisnZW0nPTE5MworJ2VtYmVkJz0yNTQKKydleCc9MTk0CisnZXh0ZW5kcyc9MzkKKydleHRlbnNpb24nPTE3MworJ2V4dGVybmFsQ3NzVVJJJz0xNgorJ2ZhbHNlJz0xNzYKKydmYW1pbHknPTQwCisnZmlsZSc9NzMKKydmaW5hbGx5Jz0xODMKKydmaXhlZCc9MjE2CisnZm9udCc9MzgKKydmb250cyc9MjEKKydmb290ZXInPTc5CisnZm9yJz0xNjcKKydmb3JtYXR0ZXInPTQ0CisnZm9ybWF0dGVycyc9MTkKKydmcm9tIGJ1bmRsZSc9MTcKKydnZW5lcmFsLW51bWJlcic9MjE1CisnZ29vZC1zbG9waW5nJz0yMzQKKydncmlkJz04MQorJ2dyb292ZSc9MjQxCisnZ3JvdXAnPTg5CisnaGVhZGVyJz03NQorJ2hlaWdodCc9NzcKKydoaWRlbGFiZWwnPTk1CisnaHRtbCc9MjIwCisnaWNvbic9MTEyCisnaWYnPTE2MQorJ2ltYWdlJz05MworJ2ltcG9ydCc9MTIwCisnaW5jaCc9MTkxCisnaW5zZXQnPTI0MworJ2luc3RhbmNlb2YnPTE0MworJ2ludGVydmFscyc9OTQKKydpdGFsaWMnPTIwNgorJ2xhYmVsJz0xMTYKKydsYW5kc2NhcGUnPTIwNAorJ2xheW91dC1kYXRhJz0xNQorJ2xlZnQnPTIxMQorJ2xlZnRtYXJnaW4nPTI5CisnbGlnaHRlbnMnPTM1CisnbG9va3Vwcyc9OTYKKydtYXJnaW4tYm90dG9tJz01OAorJ21hcmdpbi1sZWZ0Jz01OQorJ21hcmdpbi1yaWdodCc9NjAKKydtYXJnaW4tdG9wJz01NworJ21heGltdW0nPTIyNworJ21lZGlhJz0yMworJ21lZGlhcyc9MjIKKydtaW5pbXVtJz0yMjYKKydtbSc9MTg4CisnbW9ub3NwYWNlJz0yMDgKKyduZXcnPTE3NQorJ25vbmUnPTIzNgorJ25vcm1hbCc9MjA1CisnbnVsbCc9MTc4CisnbnVtYmVyJz02NAorJ29ibGlxdWUnPTIwNworJ29mJz0xMDQKKydvbi1ncm91cCc9MTAyCisnb3JpZW50YXRpb24nPTI3Cisnb3V0c2V0Jz0yNDQKKydwYWNrYWdlJz0xMworJ3BhZGRpbmctYm90dG9tJz01NAorJ3BhZGRpbmctbGVmdCc9NTUKKydwYWRkaW5nLXJpZ2h0Jz01NgorJ3BhZGRpbmctdG9wJz01MworJ3BhZ2UtbnVtYmVyJz0yNDUKKydwYWdlLW51bWJlci11bmZpbHRlcmVkJz0yNDcKKydwYWdlLXZhcmlhYmxlJz0yNDkKKydwYWdldGVtcGxhdGUnPTI1CisncGF0aCc9OTcKKydwYyc9MTkyCisncGRmJz0yMjEKKydwZXJjZW50Jz0yMTcKKydwb3J0cmFpdCc9MjAzCisncHJvcGVydHknPTEwMAorJ3B0Jz0xOTAKKydweCc9MTk1CisncmVuZGVyaW5nJz03MgorJ3JlcG9ydCc9NjMKKydyZXNpemUnPTk5CisncmV0dXJuJz0xODEKKydyaWRnZSc9MjQyCisncmlnaHQnPTIxMworJ3JpZ2h0bWFyZ2luJz0zMQorJ3Jpc2luZyc9MjMxCisncm93Jz04MworJ3J1bm5pbmctY291bnQnPTIyMworJ3J1bm5pbmctc3VtJz0yMjgKKydzYW5zLXNlcmlmJz0yMDkKKydzY2FsZSc9MTE5Cisnc2NhbGUtdG8taXRlbSc9MjUxCisnc2NpZW50aWZpYyc9MjE4Cisnc2VyaWYnPTIxMAorJ3Nob3dPbkZpcnN0Jz03NgorJ3Nob3dPbkxhc3QnPTgwCisnc2l6ZSc9NDIKKydzaXplLXRvLWltYWdlJz0yNTAKKydzbG9waW5nJz0yMzMKKydzb2xpZCc9MjM3Cisnc3RhZ25hdGluZyc9MjM1Cisnc3RhdGljJz0xNzIKKydzdHJpbmcnPTEwOQorJ3N0eWxlJz00MworJ3N0eWxlcyc9MjQKKydzdWJzdWJ0aXRsZSc9MTE1Cisnc3VidGl0bGUnPTExNAorJ3N1bSc9MjI0Cisnc3VwZXInPTE3NAorJ3N3aXRjaCc9MTYzCisnc3luY2hyb25pemVkJz0xODQKKyd0YWJsZSc9ODYKKyd0ZW1wbGF0ZSc9NzQKKyd0ZXh0Jz0xMTcKKyd0ZXh0YWxpZ24nPTQ4CisndGV4dGNvbG9yJz00NworJ3Rocm93Jz0xODAKKyd0aW1lJz02OAorJ3RpdGxlJz0xMDMKKyd0b29sYmFyJz03MAorJ3RvcG1hcmdpbic9MjgKKyd0b3RhbC1wYWdlJz0yNDYKKyd0b3RhbC1wYWdlLXVuZmlsdGVyZWQnPTI0OAorJ3Rvd2FyZHMnPTM3CisndHJhbnNmb3Jtcyc9MzYKKyd0cmVuZCc9MTEzCisndHJ1ZSc9MTc3CisndHJ5Jz0xODIKKyd0eXBlJz0yNgorJ3R5cGVvZic9MTc5CisndWknPTYyCisndW5mb3JtYXR0ZWQnPTIxNAorJ3VvbW8nPTYxCisndXAgdG8nPTEwNworJ3VybCc9MjUzCisndXMtbGVkZ2VyJz0yMDEKKyd1cy1sZWdhbCc9MjAwCisndXMtbGV0dGVyJz0xOTkKKyd1cy1zdXBlci1iJz0yMDIKKyd2YWwnPTE3MQorJ3Zhcic9MTcwCisnd2hpbGUnPTE2OAorJ3snPTE0CisnfCc9MTU5CisnfHwnPTEzNworJ30nPTE4CitSVUxFX0FOWV9PVEhFUj0xMgorUlVMRV9ERUNJTUFMPTgKK1JVTEVfSEVYPTcKK1JVTEVfSUQ9NQorUlVMRV9JTlQ9NgorUlVMRV9NTF9DT01NRU5UPTkKK1JVTEVfU0xfQ09NTUVOVD0xMAorUlVMRV9TVFJJTkc9NAorUlVMRV9XUz0xMQorVF9fMTAwPTEwMAorVF9fMTAxPTEwMQorVF9fMTAyPTEwMgorVF9fMTAzPTEwMworVF9fMTA0PTEwNAorVF9fMTA1PTEwNQorVF9fMTA2PTEwNgorVF9fMTA3PTEwNworVF9fMTA4PTEwOAorVF9fMTA5PTEwOQorVF9fMTEwPTExMAorVF9fMTExPTExMQorVF9fMTEyPTExMgorVF9fMTEzPTExMworVF9fMTE0PTExNAorVF9fMTE1PTExNQorVF9fMTE2PTExNgorVF9fMTE3PTExNworVF9fMTE4PTExOAorVF9fMTE5PTExOQorVF9fMTIwPTEyMAorVF9fMTIxPTEyMQorVF9fMTIyPTEyMgorVF9fMTIzPTEyMworVF9fMTI0PTEyNAorVF9fMTI1PTEyNQorVF9fMTI2PTEyNgorVF9fMTI3PTEyNworVF9fMTI4PTEyOAorVF9fMTI5PTEyOQorVF9fMTMwPTEzMAorVF9fMTMxPTEzMQorVF9fMTMyPTEzMgorVF9fMTMzPTEzMworVF9fMTM0PTEzNAorVF9fMTM1PTEzNQorVF9fMTM2PTEzNgorVF9fMTM3PTEzNworVF9fMTM4PTEzOAorVF9fMTM5PTEzOQorVF9fMTM9MTMKK1RfXzE0MD0xNDAKK1RfXzE0MT0xNDEKK1RfXzE0Mj0xNDIKK1RfXzE0Mz0xNDMKK1RfXzE0ND0xNDQKK1RfXzE0NT0xNDUKK1RfXzE0Nj0xNDYKK1RfXzE0Nz0xNDcKK1RfXzE0OD0xNDgKK1RfXzE0OT0xNDkKK1RfXzE0PTE0CitUX18xNTA9MTUwCitUX18xNTE9MTUxCitUX18xNTI9MTUyCitUX18xNTM9MTUzCitUX18xNTQ9MTU0CitUX18xNTU9MTU1CitUX18xNTY9MTU2CitUX18xNTc9MTU3CitUX18xNTg9MTU4CitUX18xNTk9MTU5CitUX18xNT0xNQorVF9fMTYwPTE2MAorVF9fMTYxPTE2MQorVF9fMTYyPTE2MgorVF9fMTYzPTE2MworVF9fMTY0PTE2NAorVF9fMTY1PTE2NQorVF9fMTY2PTE2NgorVF9fMTY3PTE2NworVF9fMTY4PTE2OAorVF9fMTY5PTE2OQorVF9fMTY9MTYKK1RfXzE3MD0xNzAKK1RfXzE3MT0xNzEKK1RfXzE3Mj0xNzIKK1RfXzE3Mz0xNzMKK1RfXzE3ND0xNzQKK1RfXzE3NT0xNzUKK1RfXzE3Nj0xNzYKK1RfXzE3Nz0xNzcKK1RfXzE3OD0xNzgKK1RfXzE3OT0xNzkKK1RfXzE3PTE3CitUX18xODA9MTgwCitUX18xODE9MTgxCitUX18xODI9MTgyCitUX18xODM9MTgzCitUX18xODQ9MTg0CitUX18xODU9MTg1CitUX18xODY9MTg2CitUX18xODc9MTg3CitUX18xODg9MTg4CitUX18xODk9MTg5CitUX18xOD0xOAorVF9fMTkwPTE5MAorVF9fMTkxPTE5MQorVF9fMTkyPTE5MgorVF9fMTkzPTE5MworVF9fMTk0PTE5NAorVF9fMTk1PTE5NQorVF9fMTk2PTE5NgorVF9fMTk3PTE5NworVF9fMTk4PTE5OAorVF9fMTk5PTE5OQorVF9fMTk9MTkKK1RfXzIwMD0yMDAKK1RfXzIwMT0yMDEKK1RfXzIwMj0yMDIKK1RfXzIwMz0yMDMKK1RfXzIwND0yMDQKK1RfXzIwNT0yMDUKK1RfXzIwNj0yMDYKK1RfXzIwNz0yMDcKK1RfXzIwOD0yMDgKK1RfXzIwOT0yMDkKK1RfXzIwPTIwCitUX18yMTA9MjEwCitUX18yMTE9MjExCitUX18yMTI9MjEyCitUX18yMTM9MjEzCitUX18yMTQ9MjE0CitUX18yMTU9MjE1CitUX18yMTY9MjE2CitUX18yMTc9MjE3CitUX18yMTg9MjE4CitUX18yMTk9MjE5CitUX18yMT0yMQorVF9fMjIwPTIyMAorVF9fMjIxPTIyMQorVF9fMjIyPTIyMgorVF9fMjIzPTIyMworVF9fMjI0PTIyNAorVF9fMjI1PTIyNQorVF9fMjI2PTIyNgorVF9fMjI3PTIyNworVF9fMjI4PTIyOAorVF9fMjI5PTIyOQorVF9fMjI9MjIKK1RfXzIzMD0yMzAKK1RfXzIzMT0yMzEKK1RfXzIzMj0yMzIKK1RfXzIzMz0yMzMKK1RfXzIzND0yMzQKK1RfXzIzNT0yMzUKK1RfXzIzNj0yMzYKK1RfXzIzNz0yMzcKK1RfXzIzOD0yMzgKK1RfXzIzOT0yMzkKK1RfXzIzPTIzCitUX18yNDA9MjQwCitUX18yNDE9MjQxCitUX18yNDI9MjQyCitUX18yNDM9MjQzCitUX18yNDQ9MjQ0CitUX18yNDU9MjQ1CitUX18yNDY9MjQ2CitUX18yNDc9MjQ3CitUX18yNDg9MjQ4CitUX18yNDk9MjQ5CitUX18yND0yNAorVF9fMjUwPTI1MAorVF9fMjUxPTI1MQorVF9fMjUyPTI1MgorVF9fMjUzPTI1MworVF9fMjU0PTI1NAorVF9fMjU9MjUKK1RfXzI2PTI2CitUX18yNz0yNworVF9fMjg9MjgKK1RfXzI5PTI5CitUX18zMD0zMAorVF9fMzE9MzEKK1RfXzMyPTMyCitUX18zMz0zMworVF9fMzQ9MzQKK1RfXzM1PTM1CitUX18zNj0zNgorVF9fMzc9MzcKK1RfXzM4PTM4CitUX18zOT0zOQorVF9fNDA9NDAKK1RfXzQxPTQxCitUX180Mj00MgorVF9fNDM9NDMKK1RfXzQ0PTQ0CitUX180NT00NQorVF9fNDY9NDYKK1RfXzQ3PTQ3CitUX180OD00OAorVF9fNDk9NDkKK1RfXzUwPTUwCitUX181MT01MQorVF9fNTI9NTIKK1RfXzUzPTUzCitUX181ND01NAorVF9fNTU9NTUKK1RfXzU2PTU2CitUX181Nz01NworVF9fNTg9NTgKK1RfXzU5PTU5CitUX182MD02MAorVF9fNjE9NjEKK1RfXzYyPTYyCitUX182Mz02MworVF9fNjQ9NjQKK1RfXzY1PTY1CitUX182Nj02NgorVF9fNjc9NjcKK1RfXzY4PTY4CitUX182OT02OQorVF9fNzA9NzAKK1RfXzcxPTcxCitUX183Mj03MgorVF9fNzM9NzMKK1RfXzc0PTc0CitUX183NT03NQorVF9fNzY9NzYKK1RfXzc3PTc3CitUX183OD03OAorVF9fNzk9NzkKK1RfXzgwPTgwCitUX184MT04MQorVF9fODI9ODIKK1RfXzgzPTgzCitUX184ND04NAorVF9fODU9ODUKK1RfXzg2PTg2CitUX184Nz04NworVF9fODg9ODgKK1RfXzg5PTg5CitUX185MD05MAorVF9fOTE9OTEKK1RfXzkyPTkyCitUX185Mz05MworVF9fOTQ9OTQKK1RfXzk1PTk1CitUX185Nj05NgorVF9fOTc9OTcKK1RfXzk4PTk4CitUX185OT05OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xMZXhlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xMZXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODlmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTExleGVyLmphdmEKQEAgLTAsMCArMSw5Nzk3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXI7CisKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEludGVybmFsUmVwb3J0RFNMTGV4ZXIgZXh0ZW5kcyBMZXhlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ0PTE0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDM9MTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nj0xNDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ1PTE0NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDA9MTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Mj0xNDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQxPTE0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzc9MTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUyPTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNj0xMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM5PTEzOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzg9MTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMz0xMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU0PTI1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzI9MTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1Mz0yNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjA9NjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM1PTEzNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MT02MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzQ9MTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1MD0yNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMT0xMzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjUyPTI1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzA9MTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1MT0yNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nj02NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nz02NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjk9MTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY4PTY4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY5PTY5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYyPTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNj0xMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ3PTI0NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjU9MTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0Nj0yNDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDk9MjQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY1PTY1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNz0xMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ4PTI0ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjY9MTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2NT0xNjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY4PTE2ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjc9MTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Mj0xNjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYxPTE2MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjQ9MTY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2Mz0xNjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTYwPTE2MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTk9MTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMwPTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1OD0xNTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzE9MzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzI9MzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU1PTE1NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTQ9MTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nz0xNTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU2PTE1NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTE9MTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MD0xNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUzPTE1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTI9MTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ4PTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ5PTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ0PTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ1PTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ2PTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ3PTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQwPTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0OD0xNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ3PTE0NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDk9MTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMD0xMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjIxPTIyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjA9MjIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjIzPTIyMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDE9MTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyMj0yMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY9MTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc9MTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg9MTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE4PTIxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTc9MjE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0PTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxOT0yMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE0PTIxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTM9MjEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxNj0yMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE1PTIxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTA9MjEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMj0yMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjExPTIxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDc9MjA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwNj0yMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ9MjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA5PTIwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDg9MjA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwMz0yMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAyPTIwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDU9MjA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwND0yMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIyPTEyMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDM9MjQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMT0xMjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQyPTI0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjQ9MTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0NT0yNDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIzPTEyMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDQ9MjQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMD0xMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQxPTI0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDA9MjQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTk9MTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExOD0xMTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM5PTIzOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTU9MTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzNj0yMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExND0xMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM1PTIzNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTc9MTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzOD0yMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE2PTExNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzc9MjM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjMyPTIzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTA9MTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzMT0yMzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEzPTExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzQ9MjM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMj0xMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjMzPTIzMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzA9MjMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOD0xMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI5PTIyOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyOD0yMjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA5PTEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDQ9MTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyNT0yMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAzPTEwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjQ9MjI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI3PTIyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDU9MTA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyNj0yMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDE9MjAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwMD0yMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTE9OTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg4PTE4ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mj05MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODc9MTg3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk0PTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4OT0xODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg0PTE4NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODM9MTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Nj0xODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTA9OTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg1PTE4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODA9MTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4Mj0xODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTgxPTE4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzc9MTc3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3Nj0xNzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc5PTE3OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzg9MTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3Mz0xNzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTcyPTE3MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzU9MTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3ND0xNzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTcxPTE3MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzA9MTcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2OT0xNjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzI9NzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OT03OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mz03MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183ND03NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTk9MTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5OD0xOTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODM9ODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk1PTE5NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTQ9MTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk3PTE5NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTY9MTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5MT0xOTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkwPTE5MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTM9MTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Mj0xOTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODk9ODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODU9ODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODY9ODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICAvLyBkZWxlZ2F0b3JzCisKKyAgICBwdWJsaWMgSW50ZXJuYWxSZXBvcnREU0xMZXhlcigpIHs7fSAKKyAgICBwdWJsaWMgSW50ZXJuYWxSZXBvcnREU0xMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBJbnRlcm5hbFJlcG9ydERTTExleGVyKENoYXJTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzdXBlcihpbnB1dCxzdGF0ZSk7CisKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZyI7IH0KKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTo3OiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExOjk6ICdwYWNrYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhY2thZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI6NzogKCAneycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjo5OiAneycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd7Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzo3OiAoICdsYXlvdXQtZGF0YScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzo5OiAnbGF5b3V0LWRhdGEnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGF5b3V0LWRhdGEiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ6NzogKCAnZXh0ZXJuYWxDc3NVUkknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ6OTogJ2V4dGVybmFsQ3NzVVJJJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVybmFsQ3NzVVJJIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Ojc6ICggJ2Zyb20gYnVuZGxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Ojk6ICdmcm9tIGJ1bmRsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmcm9tIGJ1bmRsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjo3OiAoICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2Ojk6ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ30nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Ojc6ICggJ2Zvcm1hdHRlcnMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc6OTogJ2Zvcm1hdHRlcnMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZm9ybWF0dGVycyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODo3OiAoICdjb2xvcnMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg6OTogJ2NvbG9ycycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjb2xvcnMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk6NzogKCAnZm9udHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk6OTogJ2ZvbnRzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvbnRzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwOjc6ICggJ21lZGlhcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDo5OiAnbWVkaWFzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1lZGlhcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTo3OiAoICdtZWRpYScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTo5OiAnbWVkaWEnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWVkaWEiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI6NzogKCAnc3R5bGVzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyOjk6ICdzdHlsZXMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3R5bGVzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzOjc6ICggJ3BhZ2V0ZW1wbGF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzo5OiAncGFnZXRlbXBsYXRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZ2V0ZW1wbGF0ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDo3OiAoICd0eXBlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0Ojk6ICd0eXBlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInR5cGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU6NzogKCAnb3JpZW50YXRpb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU6OTogJ29yaWVudGF0aW9uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm9yaWVudGF0aW9uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2Ojc6ICggJ3RvcG1hcmdpbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjo5OiAndG9wbWFyZ2luJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRvcG1hcmdpbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzo3OiAoICdsZWZ0bWFyZ2luJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3Ojk6ICdsZWZ0bWFyZ2luJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxlZnRtYXJnaW4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg6NzogKCAnYm90dG9tbWFyZ2luJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Ojk6ICdib3R0b21tYXJnaW4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYm90dG9tbWFyZ2luIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5Ojc6ICggJ3JpZ2h0bWFyZ2luJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5Ojk6ICdyaWdodG1hcmdpbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyaWdodG1hcmdpbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDo3OiAoICdjb2xvcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDo5OiAnY29sb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY29sb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE6NzogKCAnZGFya2VucycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTo5OiAnZGFya2VucycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkYXJrZW5zIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyOjc6ICggJ2J5LXBlcmNlbnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzI6OTogJ2J5LXBlcmNlbnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYnktcGVyY2VudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzo3OiAoICdsaWdodGVucycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzo5OiAnbGlnaHRlbnMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGlnaHRlbnMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ6NzogKCAndHJhbnNmb3JtcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDo5OiAndHJhbnNmb3JtcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cmFuc2Zvcm1zIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1Ojc6ICggJ3Rvd2FyZHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzU6OTogJ3Rvd2FyZHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG93YXJkcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjo3OiAoICdmb250JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM2Ojk6ICdmb250JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvbnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc6NzogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzo5OiAnZXh0ZW5kcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbmRzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4Ojc6ICggJ2ZhbWlseScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODo5OiAnZmFtaWx5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZhbWlseSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozOTo3OiAoICdib2xkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM5Ojk6ICdib2xkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvbGQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDA6NzogKCAnc2l6ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MDo5OiAnc2l6ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaXplIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQxOjc6ICggJ3N0eWxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQxOjk6ICdzdHlsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdHlsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Mjo3OiAoICdmb3JtYXR0ZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDI6OTogJ2Zvcm1hdHRlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3JtYXR0ZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDM6NzogKCAnYmFja2dyb3VuZGNvbG9yJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQzOjk6ICdiYWNrZ3JvdW5kY29sb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYmFja2dyb3VuZGNvbG9yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ0Ojc6ICggJ2FsdGVybmF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NDo5OiAnYWx0ZXJuYXRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFsdGVybmF0ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0NTo3OiAoICd0ZXh0Y29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDU6OTogJ3RleHRjb2xvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0ZXh0Y29sb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDY6NzogKCAndGV4dGFsaWduJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ2Ojk6ICd0ZXh0YWxpZ24nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGV4dGFsaWduIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3Ojc6ICggJ2JvcmRlci10b3AnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc6OTogJ2JvcmRlci10b3AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYm9yZGVyLXRvcCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0ODo3OiAoICdib3JkZXItYm90dG9tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ4Ojk6ICdib3JkZXItYm90dG9tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1ib3R0b20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDk6NzogKCAnYm9yZGVyLWxlZnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDk6OTogJ2JvcmRlci1sZWZ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1sZWZ0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzUxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUwOjc6ICggJ2JvcmRlci1yaWdodCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MDo5OiAnYm9yZGVyLXJpZ2h0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJvcmRlci1yaWdodCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MTo3OiAoICdwYWRkaW5nLXRvcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MTo5OiAncGFkZGluZy10b3AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFkZGluZy10b3AiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTI6NzogKCAncGFkZGluZy1ib3R0b20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTI6OTogJ3BhZGRpbmctYm90dG9tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctYm90dG9tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUzOjc6ICggJ3BhZGRpbmctbGVmdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Mzo5OiAncGFkZGluZy1sZWZ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctbGVmdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NDo3OiAoICdwYWRkaW5nLXJpZ2h0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU0Ojk6ICdwYWRkaW5nLXJpZ2h0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZGRpbmctcmlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTU6NzogKCAnbWFyZ2luLXRvcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NTo5OiAnbWFyZ2luLXRvcCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtYXJnaW4tdG9wIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU2Ojc6ICggJ21hcmdpbi1ib3R0b20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTY6OTogJ21hcmdpbi1ib3R0b20nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLWJvdHRvbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Nzo3OiAoICdtYXJnaW4tbGVmdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1Nzo5OiAnbWFyZ2luLWxlZnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLWxlZnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTg6NzogKCAnbWFyZ2luLXJpZ2h0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU4Ojk6ICdtYXJnaW4tcmlnaHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWFyZ2luLXJpZ2h0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU5Ojc6ICggJ3VvbW8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTk6OTogJ3VvbW8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidW9tbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2MDo3OiAoICd1aScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2MDo5OiAndWknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidWkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjE6NzogKCAncmVwb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYxOjk6ICdyZXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVwb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYyOjc6ICggJ251bWJlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mjo5OiAnbnVtYmVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm51bWJlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mzo3OiAoICdjdXJyZW5jeScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mzo5OiAnY3VycmVuY3knCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY3VycmVuY3kiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjQ6NzogKCAnZGF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2NDo5OiAnZGF0ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkYXRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY1Ojc6ICggJ2RhdGUrdGltZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2NTo5OiAnZGF0ZSt0aW1lJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRhdGUrdGltZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Njo3OiAoICd0aW1lJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY2Ojk6ICd0aW1lJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRpbWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Njc6NzogKCAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY3Ojk6ICdkZXNjcmliZWQgYnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGVzY3JpYmVkIGJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY4Ojc6ICggJ3Rvb2xiYXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Njg6OTogJ3Rvb2xiYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9vbGJhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2OTo3OiAoICdkYXRhbWFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2OTo5OiAnZGF0YW1hcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF0YW1hcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzA6NzogKCAncmVuZGVyaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcwOjk6ICdyZW5kZXJpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVuZGVyaW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjcxOjc6ICggJ2ZpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzE6OTogJ2ZpbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmlsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3Mjo3OiAoICd0ZW1wbGF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3Mjo5OiAndGVtcGxhdGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGVtcGxhdGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzM6NzogKCAnaGVhZGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjczOjk6ICdoZWFkZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaGVhZGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc0Ojc6ICggJ3Nob3dPbkZpcnN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc0Ojk6ICdzaG93T25GaXJzdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaG93T25GaXJzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3NTo3OiAoICdoZWlnaHQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzU6OTogJ2hlaWdodCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJoZWlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzY6NzogKCAnZGV0YWlsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc2Ojk6ICdkZXRhaWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc3Ojc6ICggJ2Zvb3RlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3Nzo5OiAnZm9vdGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvb3RlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3ODo3OiAoICdzaG93T25MYXN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc4Ojk6ICdzaG93T25MYXN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNob3dPbkxhc3QiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Nzk6NzogKCAnZ3JpZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3OTo5OiAnZ3JpZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJncmlkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgwOjc6ICggJ2FzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgwOjk6ICdhcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MTo3OiAoICdyb3cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODE6OTogJ3JvdycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyb3ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODI6NzogKCAnY2VsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4Mjo5OiAnY2VsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjZWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgzOjc6ICggJ2NvbHVtbnNwYW4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODM6OTogJ2NvbHVtbnNwYW4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY29sdW1uc3BhbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDo3OiAoICd0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDo5OiAndGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODU6NzogKCAnZGV0YWlsaGVhZGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg1Ojk6ICdkZXRhaWxoZWFkZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlsaGVhZGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg2Ojc6ICggJ2RldGFpbGZvb3RlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4Njo5OiAnZGV0YWlsZm9vdGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRldGFpbGZvb3RlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4Nzo3OiAoICdncm91cCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4Nzo5OiAnZ3JvdXAnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZ3JvdXAiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODg6NzogKCAnYnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODg6OTogJ2J5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg5Ojc6ICggJ2RldGFpbHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODk6OTogJ2RldGFpbHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGV0YWlscyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5MDo3OiAoICdhbGwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTA6OTogJ2FsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTE6NzogKCAnaW1hZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTE6OTogJ2ltYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImltYWdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkyOjc6ICggJ2ludGVydmFscycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5Mjo5OiAnaW50ZXJ2YWxzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImludGVydmFscyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5Mzo3OiAoICdoaWRlbGFiZWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTM6OTogJ2hpZGVsYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJoaWRlbGFiZWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTQ6NzogKCAnbG9va3VwcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5NDo5OiAnbG9va3VwcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsb29rdXBzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk1Ojc6ICggJ3BhdGgnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTU6OTogJ3BhdGgnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGF0aCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5Njo3OiAoICdkeW5hbWljJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk2Ojk6ICdkeW5hbWljJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImR5bmFtaWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTc6NzogKCAncmVzaXplJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk3Ojk6ICdyZXNpemUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVzaXplIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk4Ojg6ICggJ3Byb3BlcnR5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk4OjEwOiAncHJvcGVydHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHJvcGVydHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk5Ojg6ICggJ2FnZ3JlZ2F0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5OToxMDogJ2FnZ3JlZ2F0ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhZ2dyZWdhdGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMDo4OiAoICdvbi1ncm91cCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDA6MTA6ICdvbi1ncm91cCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvbi1ncm91cCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAxOjg6ICggJ3RpdGxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMToxMDogJ3RpdGxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRpdGxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDI6ODogKCAnb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAyOjEwOiAnb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgib2YiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMzo4OiAoICcoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwMzoxMDogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNDo4OiAoICcpJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNDoxMDogJyknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNTo4OiAoICd1cCB0bycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDU6MTA6ICd1cCB0bycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1cCB0byIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA2Ojg6ICggJ2RheXMgaW4gcGFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDY6MTA6ICdkYXlzIGluIHBhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF5cyBpbiBwYXN0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDc6ODogKCAnc3RyaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNzoxMDogJ3N0cmluZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdHJpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwODo4OiAoICctJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwODoxMDogJy0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwOTo4OiAoICdjZWxsY29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA5OjEwOiAnY2VsbGNvbG9yJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNlbGxjb2xvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEwOjg6ICggJ2ljb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEwOjEwOiAnaWNvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpY29uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTE6ODogKCAndHJlbmQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTExOjEwOiAndHJlbmQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJlbmQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMjo4OiAoICdzdWJ0aXRsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTI6MTA6ICdzdWJ0aXRsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdWJ0aXRsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTEzOjg6ICggJ3N1YnN1YnRpdGxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMzoxMDogJ3N1YnN1YnRpdGxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN1YnN1YnRpdGxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTQ6ODogKCAnbGFiZWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE0OjEwOiAnbGFiZWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGFiZWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNTo4OiAoICd0ZXh0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNToxMDogJ3RleHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGV4dCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE2Ojg6ICggJ2F1dG90ZXh0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNjoxMDogJ2F1dG90ZXh0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImF1dG90ZXh0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTc6ODogKCAnc2NhbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE3OjEwOiAnc2NhbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2NhbGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExODo4OiAoICdpbXBvcnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE4OjEwOiAnaW1wb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImltcG9ydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5Ojg6ICggJy4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5OjEwOiAnLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIwOjg6ICggJyonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIwOjEwOiAnKicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcqJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIxOjg6ICggJ0AnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIxOjEwOiAnQCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIyOjg6ICggJywnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIyOjEwOiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzOjg6ICggJz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzOjEwOiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI0Ojg6ICggJyMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI0OjEwOiAnIycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI1Ojg6ICggJ1snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI1OjEwOiAnWycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdbJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI2Ojg6ICggJ10nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI2OjEwOiAnXScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI3Ojg6ICggJys9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNzoxMDogJys9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIis9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg6ODogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI4OjEwOiAnLT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyOTo4OiAoICcqPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjk6MTA6ICcqPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMwOjg6ICggJy89JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMDoxMDogJy89JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi89Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzE6ODogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMxOjEwOiAnJT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMjo4OiAoICc8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMjoxMDogJzwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMzo4OiAoICc+JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMzoxMDogJz4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNDo4OiAoICc+PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzQ6MTA6ICc+PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI+PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM1Ojg6ICggJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNToxMDogJ3x8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInx8Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzY6ODogKCAnJiYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM2OjEwOiAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiJiYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNzo4OiAoICc9PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzc6MTA6ICc9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM4Ojg6ICggJyE9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzODoxMDogJyE9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzk6ODogKCAnPT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOToxMDogJz09PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MDo4OiAoICchPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQwOjEwOiAnIT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOjg6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOjEwOiAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnN0YW5jZW9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDI6ODogKCAnLT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQyOjEwOiAnLT4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLT4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0Mzo4OiAoICcuLjwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQzOjEwOiAnLi48JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uPCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ0Ojg6ICggJy4uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NDoxMDogJy4uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDU6ODogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ1OjEwOiAnPT4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0Njo4OiAoICc8PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDY6MTA6ICc8PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI8PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ3Ojg6ICggJz86JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NzoxMDogJz86JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj86Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTUwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDg6ODogKCAnKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDg6MTA6ICcrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJysnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTUxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk6ODogKCAnKionICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ5OjEwOiAnKionCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKioiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDo4OiAoICcvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDoxMDogJy8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MTo4OiAoICclJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MToxMDogJyUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mjo4OiAoICchJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MjoxMDogJyEnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnIScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mzo4OiAoICcrKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTM6MTA6ICcrKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrKyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU0Ojg6ICggJy0tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1NDoxMDogJy0tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTU3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTU6ODogKCAnOjonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU1OjEwOiAnOjonCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiOjoiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTU3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Njo4OiAoICc/LicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTY6MTA6ICc/LicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3Ojg6ICggJ3wnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3OjEwOiAnfCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU4Ojg6ICggJzsnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU4OjEwOiAnOycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc7Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU5Ojg6ICggJ2lmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1OToxMDogJ2lmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlmIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjA6ODogKCAnZWxzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjA6MTA6ICdlbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MTo4OiAoICdzd2l0Y2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxOjEwOiAnc3dpdGNoJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN3aXRjaCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYyOjg6ICggJzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYyOjEwOiAnOicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc6Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYzOjg6ICggJ2RlZmF1bHQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYzOjEwOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTY2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTY2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjQ6ODogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjQ6MTA6ICdjYXNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNhc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2NTo4OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY1OjEwOiAnZm9yJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY2Ojg6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2NjoxMDogJ3doaWxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTY5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTY5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjc6ODogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY3OjEwOiAnZG8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZG8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTY5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2ODo4OiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY4OjEwOiAndmFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY5Ojg6ICggJ3ZhbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjk6MTA6ICd2YWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmFsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTcyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTcyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzA6ODogKCAnc3RhdGljJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MDoxMDogJ3N0YXRpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdGF0aWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTcyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MTo4OiAoICdleHRlbnNpb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcxOjEwOiAnZXh0ZW5zaW9uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVuc2lvbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcyOjg6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MjoxMDogJ3N1cGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN1cGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTc1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzM6ODogKCAnbmV3JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MzoxMDogJ25ldycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJuZXciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTc1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NDo4OiAoICdmYWxzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzQ6MTA6ICdmYWxzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmYWxzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc1Ojg6ICggJ3RydWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc1OjEwOiAndHJ1ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTc4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzY6ODogKCAnbnVsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzY6MTA6ICdudWxsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm51bGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTc4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Nzo4OiAoICd0eXBlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc3OjEwOiAndHlwZW9mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTgwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc4Ojg6ICggJ3Rocm93JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODoxMDogJ3Rocm93JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTgxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzk6ODogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3OToxMDogJ3JldHVybicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZXR1cm4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xODIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MDo4OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgwOjEwOiAndHJ5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyeSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTgzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgxOjg6ICggJ2ZpbmFsbHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgxOjEwOiAnZmluYWxseScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmaW5hbGx5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTg0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTg0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODI6ODogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjoxMDogJ3N5bmNocm9uaXplZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzeW5jaHJvbml6ZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTg0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xODUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xODU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4Mzo4OiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODM6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXRjaCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTg2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg0Ojg6ICggJz8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg0OjEwOiAnPycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc/Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTg3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg1Ojg6ICggJyYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg1OjEwOiAnJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcmJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xODciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE4OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTg4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg2Ojg6ICggJ21tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjoxMDogJ21tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE4OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTg5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xODkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTg5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODc6ODogKCAnY20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg3OjEwOiAnY20nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4ODo4OiAoICdwdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODg6MTA6ICdwdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTkxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5Ojg6ICggJ2luY2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5OjEwOiAnaW5jaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbmNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTkyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTkyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTA6ODogKCAncGMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkwOjEwOiAncGMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MTo4OiAoICdlbScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTE6MTA6ICdlbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJlbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTk0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkyOjg6ICggJ2V4JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MjoxMDogJ2V4JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTk1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTk1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTM6ODogKCAncHgnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkzOjEwOiAncHgnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHgiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTk1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NDo4OiAoICdhNCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTQ6MTA6ICdhNCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhNCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTk3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk1Ojg6ICggJ2EzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NToxMDogJ2EzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImEzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTk4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTk4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTY6ODogKCAnYTUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk2OjEwOiAnYTUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYTUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTk4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Nzo4OiAoICd1cy1sZXR0ZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk3OjEwOiAndXMtbGV0dGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzLWxldHRlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjAwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk4Ojg6ICggJ3VzLWxlZ2FsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5ODoxMDogJ3VzLWxlZ2FsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzLWxlZ2FsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjAxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjAxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTk6ODogKCAndXMtbGVkZ2VyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5OToxMDogJ3VzLWxlZGdlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1cy1sZWRnZXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjAxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMDo4OiAoICd1cy1zdXBlci1iJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMDoxMDogJ3VzLXN1cGVyLWInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXMtc3VwZXItYiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjAzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAxOjg6ICggJ3BvcnRyYWl0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMToxMDogJ3BvcnRyYWl0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBvcnRyYWl0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDI6ODogKCAnbGFuZHNjYXBlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMjoxMDogJ2xhbmRzY2FwZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsYW5kc2NhcGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzo4OiAoICdub3JtYWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAzOjEwOiAnbm9ybWFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5vcm1hbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjA2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA0Ojg6ICggJ2l0YWxpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDQ6MTA6ICdpdGFsaWMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaXRhbGljIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjA3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDU6ODogKCAnb2JsaXF1ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDU6MTA6ICdvYmxpcXVlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm9ibGlxdWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjA3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNjo4OiAoICdtb25vc3BhY2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA2OjEwOiAnbW9ub3NwYWNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1vbm9zcGFjZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjA5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA3Ojg6ICggJ3NhbnMtc2VyaWYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA3OjEwOiAnc2Fucy1zZXJpZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzYW5zLXNlcmlmIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjEwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDg6ODogKCAnc2VyaWYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA4OjEwOiAnc2VyaWYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2VyaWYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwOTo4OiAoICdsZWZ0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwOToxMDogJ2xlZnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGVmdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEwOjg6ICggJ2NlbnRlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTA6MTA6ICdjZW50ZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2VudGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTE6ODogKCAncmlnaHQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExOjEwOiAncmlnaHQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmlnaHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMjo4OiAoICd1bmZvcm1hdHRlZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTI6MTA6ICd1bmZvcm1hdHRlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1bmZvcm1hdHRlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEzOjg6ICggJ2dlbmVyYWwtbnVtYmVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMzoxMDogJ2dlbmVyYWwtbnVtYmVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdlbmVyYWwtbnVtYmVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTQ6ODogKCAnZml4ZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE0OjEwOiAnZml4ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZml4ZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNTo4OiAoICdwZXJjZW50JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNToxMDogJ3BlcmNlbnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGVyY2VudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIxOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2Ojg6ICggJ3NjaWVudGlmaWMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2OjEwOiAnc2NpZW50aWZpYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzY2llbnRpZmljIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTc6ODogKCAnY3VzdG9tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNzoxMDogJ2N1c3RvbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjdXN0b20iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxODo4OiAoICdodG1sJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxODoxMDogJ2h0bWwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaHRtbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE5Ojg6ICggJ3BkZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTk6MTA6ICdwZGYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGRmIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjA6ODogKCAnY291bnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIwOjEwOiAnY291bnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY291bnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMTo4OiAoICdydW5uaW5nLWNvdW50JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMToxMDogJ3J1bm5pbmctY291bnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicnVubmluZy1jb3VudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIyOjg6ICggJ3N1bScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI6MTA6ICdzdW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3VtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjM6ODogKCAnYXZlcmFnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjM6MTA6ICdhdmVyYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImF2ZXJhZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNDo4OiAoICdtaW5pbXVtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNDoxMDogJ21pbmltdW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWluaW11bSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI1Ojg6ICggJ21heGltdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI1OjEwOiAnbWF4aW11bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtYXhpbXVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjY6ODogKCAncnVubmluZy1zdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI2OjEwOiAncnVubmluZy1zdW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicnVubmluZy1zdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNzo4OiAoICdkaXZpZGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI3OjEwOiAnZGl2aWRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRpdmlkZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjMwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI4Ojg6ICggJ2NvbmNhdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjg6MTA6ICdjb25jYXQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY29uY2F0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjMxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjk6ODogKCAncmlzaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyOToxMDogJ3Jpc2luZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyaXNpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMDo4OiAoICdiYWQtcmlzaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMDoxMDogJ2JhZC1yaXNpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYmFkLXJpc2luZyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjMzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMxOjg6ICggJ3Nsb3BpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMxOjEwOiAnc2xvcGluZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzbG9waW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjM0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzI6ODogKCAnZ29vZC1zbG9waW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjoxMDogJ2dvb2Qtc2xvcGluZycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJnb29kLXNsb3BpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMzo4OiAoICdzdGFnbmF0aW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMzoxMDogJ3N0YWduYXRpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3RhZ25hdGluZyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjM2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0Ojg6ICggJ25vbmUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0OjEwOiAnbm9uZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub25lIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjM3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzU6ODogKCAnc29saWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM1OjEwOiAnc29saWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic29saWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjM3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNjo4OiAoICdkb3R0ZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM2OjEwOiAnZG90dGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRvdHRlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjM5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3Ojg6ICggJ2Rhc2hlZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzc6MTA6ICdkYXNoZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGFzaGVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzg6ODogKCAnZG91YmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzODoxMDogJ2RvdWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkb3VibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzOTo4OiAoICdncm9vdmUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM5OjEwOiAnZ3Jvb3ZlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdyb292ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQwOjg6ICggJ3JpZGdlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0MDoxMDogJ3JpZGdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJpZGdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDE6ODogKCAnaW5zZXQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQxOjEwOiAnaW5zZXQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zZXQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0Mjo4OiAoICdvdXRzZXQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQyOjEwOiAnb3V0c2V0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm91dHNldCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQ1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQzOjg6ICggJ3BhZ2UtbnVtYmVyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0MzoxMDogJ3BhZ2UtbnVtYmVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZ2UtbnVtYmVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQ2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDQ6ODogKCAndG90YWwtcGFnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDQ6MTA6ICd0b3RhbC1wYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRvdGFsLXBhZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQ2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0NTo4OiAoICdwYWdlLW51bWJlci11bmZpbHRlcmVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0NToxMDogJ3BhZ2UtbnVtYmVyLXVuZmlsdGVyZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFnZS1udW1iZXItdW5maWx0ZXJlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI0OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQ4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ2Ojg6ICggJ3RvdGFsLXBhZ2UtdW5maWx0ZXJlZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDY6MTA6ICd0b3RhbC1wYWdlLXVuZmlsdGVyZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG90YWwtcGFnZS11bmZpbHRlcmVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDc6ODogKCAncGFnZS12YXJpYWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDc6MTA6ICdwYWdlLXZhcmlhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBhZ2UtdmFyaWFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQ5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0ODo4OiAoICdzaXplLXRvLWltYWdlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0ODoxMDogJ3NpemUtdG8taW1hZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2l6ZS10by1pbWFnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjUxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ5Ojg6ICggJ3NjYWxlLXRvLWl0ZW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ5OjEwOiAnc2NhbGUtdG8taXRlbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzY2FsZS10by1pdGVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTA6ODogKCAnY2xpcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTA6MTA6ICdjbGlwJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNsaXAiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MTo4OiAoICd1cmwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUxOjEwOiAndXJsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVybCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjU0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUyOjg6ICggJ2VtYmVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MjoxMDogJ2VtYmVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVtYmVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9IRVgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSEVYKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSEVYOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwNToxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwNToxMjogKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA1OjEyOiAoICcweCcgfCAnMFgnICkKKyAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgyKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDU6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDU6MTg6ICcwWCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMFgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDU6MjQ6ICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrCisgICAgICAgICAgICBpbnQgY250Mj0wOworICAgICAgICAgICAgbG9vcDI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBjYXNlICdfJzoKKyAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nRicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J2YnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MiA+PSAxICkgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MisrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDU6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA1OjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnIycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwNTo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDU6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA1Ojg0OiAoICdsJyB8ICdMJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9IRVgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0lOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDc6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwNzoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoUmFuZ2UoJzAnLCc5Jyk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwNzoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICBsb29wNToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgICAgIGNhc2UgJ18nOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8aW5wdXQuTEEoMSk9PSdfJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0RFQ0lNQUwiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfREVDSU1BTCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA5OjE0OiAoIFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwOToxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwOToyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CisgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICAgICAgY2FzZSAnZSc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA5OjI2OiAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0UnfHxpbnB1dC5MQSgxKT09J2UnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA5OjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JysnfHxpbnB1dC5MQSgxKT09Jy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA5OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ4PTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDA5OjU5OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdJJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdpJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMDk6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfREVDSU1BTCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMTo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDExOjExOiAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTE6MTE6ICggJ14nICk/CisgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDExOjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSckJ3x8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMTo0NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICBjYXNlICdLJzoKKyAgICAgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBjYXNlICdRJzoKKyAgICAgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBjYXNlICdUJzoKKyAgICAgICAgICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgICAgICBjYXNlICdWJzoKKyAgICAgICAgICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBjYXNlICdZJzoKKyAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICBjYXNlICdfJzoKKyAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICBjYXNlICdqJzoKKyAgICAgICAgICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBjYXNlICdxJzoKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBpbnB1dC5MQSgxKT09JyQnfHwoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU1RSSU5HIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NUUklORzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTM6MTM6ICggKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICBpbnQgYWx0MTU9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMzoxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj0nXHUwMDAwJyAmJiBMQTExXzA8PSchJyl8fChMQTExXzA+PScjJyAmJiBMQTExXzA8PSdbJyl8fChMQTExXzA+PSddJyAmJiBMQTExXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTM6MjE6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMzoyODogfiAoICggJ1xcXFwnIHwgJ1wiJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nIScpfHwoaW5wdXQuTEEoMSk+PScjJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjQ0OiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMzo0NDogJ1wiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjQ5OiAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTM6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDEzOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExM18wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMz0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExM18wPj0nXHUwMDAwJyAmJiBMQTEzXzA8PScmJyl8fChMQTEzXzA+PScoJyAmJiBMQTEzXzA8PSdbJyl8fChMQTEzXzA+PSddJyAmJiBMQTEzXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTM6NTU6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMzo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyYnKXx8KGlucHV0LkxBKDEpPj0nKCcgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxMzo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ9MjsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDEzOjc5OiAnXFwnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfU1RSSU5HIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX01MX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfTUxfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE1OjE3OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxNToxOTogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi8qIik7IAorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE1OjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIGxvb3AxNjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE2XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNj0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMT49J1x1MDAwMCcgJiYgTEExNl8xPD0nLicpfHwoTEExNl8xPj0nMCcgJiYgTEExNl8xPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNl8wPj0nXHUwMDAwJyAmJiBMQTE2XzA8PScpJyl8fChMQTE2XzA+PScrJyAmJiBMQTE2XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxNTo1MjogLgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBtYXRjaCgiKi8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9NTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1NMX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU0xfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE3OjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE3OjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvLyIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxNzoyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICBsb29wMTc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTdfMD49J1x1MDAwMCcgJiYgTEExN18wPD0nXHQnKXx8KExBMTdfMD49J1x1MDAwQicgJiYgTEExN18wPD0nXGYnKXx8KExBMTdfMD49J1x1MDAwRScgJiYgTEExN18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTc6MjQ6IH4gKCAoICdcXG4nIHwgJ1xccicgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nXHQnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBCJyAmJiBpbnB1dC5MQSgxKTw9J1xmJyl8fChpbnB1dC5MQSgxKT49J1x1MDAwRScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxNzo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTk9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTk9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTc6NDE6ICggJ1xccicgKT8gJ1xcbicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE3OjQxOiAoICdcXHInICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTg9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTc6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xuJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NMX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfV1MiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfV1MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMTk6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MDE5OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAxOToxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIGludCBjbnQyMD0wOworICAgICAgICAgICAgbG9vcDIwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x0JyAmJiBpbnB1dC5MQSgxKTw9J1xuJyl8fGlucHV0LkxBKDEpPT0nXHInfHxpbnB1dC5MQSgxKT09JyAnICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyMCA+PSAxICkgYnJlYWsgbG9vcDIwOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQyMCsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9XUyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9BTllfT1RIRVIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfQU5ZX09USEVSKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAyMToxNjogKCAuICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUwMjE6MTg6IC4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0FOWV9PVEhFUiIKKworICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBUX18xNjcgfCBUX18xNjggfCBUX18xNjkgfCBUX18xNzAgfCBUX18xNzEgfCBUX18xNzIgfCBUX18xNzMgfCBUX18xNzQgfCBUX18xNzUgfCBUX18xNzYgfCBUX18xNzcgfCBUX18xNzggfCBUX18xNzkgfCBUX18xODAgfCBUX18xODEgfCBUX18xODIgfCBUX18xODMgfCBUX18xODQgfCBUX18xODUgfCBUX18xODYgfCBUX18xODcgfCBUX18xODggfCBUX18xODkgfCBUX18xOTAgfCBUX18xOTEgfCBUX18xOTIgfCBUX18xOTMgfCBUX18xOTQgfCBUX18xOTUgfCBUX18xOTYgfCBUX18xOTcgfCBUX18xOTggfCBUX18xOTkgfCBUX18yMDAgfCBUX18yMDEgfCBUX18yMDIgfCBUX18yMDMgfCBUX18yMDQgfCBUX18yMDUgfCBUX18yMDYgfCBUX18yMDcgfCBUX18yMDggfCBUX18yMDkgfCBUX18yMTAgfCBUX18yMTEgfCBUX18yMTIgfCBUX18yMTMgfCBUX18yMTQgfCBUX18yMTUgfCBUX18yMTYgfCBUX18yMTcgfCBUX18yMTggfCBUX18yMTkgfCBUX18yMjAgfCBUX18yMjEgfCBUX18yMjIgfCBUX18yMjMgfCBUX18yMjQgfCBUX18yMjUgfCBUX18yMjYgfCBUX18yMjcgfCBUX18yMjggfCBUX18yMjkgfCBUX18yMzAgfCBUX18yMzEgfCBUX18yMzIgfCBUX18yMzMgfCBUX18yMzQgfCBUX18yMzUgfCBUX18yMzYgfCBUX18yMzcgfCBUX18yMzggfCBUX18yMzkgfCBUX18yNDAgfCBUX18yNDEgfCBUX18yNDIgfCBUX18yNDMgfCBUX18yNDQgfCBUX18yNDUgfCBUX18yNDYgfCBUX18yNDcgfCBUX18yNDggfCBUX18yNDkgfCBUX18yNTAgfCBUX18yNTEgfCBUX18yNTIgfCBUX18yNTMgfCBUX18yNTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKKyAgICAgICAgaW50IGFsdDIxPTI1MTsKKyAgICAgICAgYWx0MjEgPSBkZmEyMS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA6IFRfXzEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2OiBUX18xNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToyMjogVF9fMTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6Mjg6IFRfXzE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM0OiBUX18xNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo0MDogVF9fMTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NDY6IFRfXzE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUyOiBUX18yMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1ODogVF9fMjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjY0OiBUX18yMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NzA6IFRfXzIzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NjogVF9fMjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjgyOiBUX18yNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6ODg6IFRfXzI2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NDogVF9fMjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwMDogVF9fMjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwNjogVF9fMjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExMjogVF9fMzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExODogVF9fMzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyNDogVF9fMzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMDogVF9fMzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzNjogVF9fMzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0MjogVF9fMzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0ODogVF9fMzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1NDogVF9fMzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2MDogVF9fMzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2NjogVF9fMzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE3MjogVF9fNDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE3ODogVF9fNDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE4NDogVF9fNDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE5MDogVF9fNDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE5NjogVF9fNDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIwMjogVF9fNDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIwODogVF9fNDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIxNDogVF9fNDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIyMDogVF9fNDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIyNjogVF9fNDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIzMjogVF9fNTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjIzODogVF9fNTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI0NDogVF9fNTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI1MDogVF9fNTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI1NjogVF9fNTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI2MjogVF9fNTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI2ODogVF9fNTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI3NDogVF9fNTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI4MDogVF9fNTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI4NjogVF9fNTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI5MjogVF9fNjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjI5ODogVF9fNjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMwNDogVF9fNjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMxMDogVF9fNjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMxNjogVF9fNjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMyMjogVF9fNjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMyODogVF9fNjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjMzNDogVF9fNjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM0MDogVF9fNjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM0NjogVF9fNjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM1MjogVF9fNzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM1ODogVF9fNzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM2NDogVF9fNzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM3MDogVF9fNzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzczKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM3NjogVF9fNzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM4MjogVF9fNzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM4ODogVF9fNzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjM5NDogVF9fNzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQwMDogVF9fNzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQwNjogVF9fNzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQxMjogVF9fODAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQxODogVF9fODEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQyNDogVF9fODIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQzMDogVF9fODMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQzNjogVF9fODQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ0MjogVF9fODUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ0ODogVF9fODYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ1NDogVF9fODcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ2MDogVF9fODgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ2NjogVF9fODkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ3MjogVF9fOTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ3ODogVF9fOTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ4NDogVF9fOTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ5MDogVF9fOTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjQ5NjogVF9fOTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUwMjogVF9fOTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUwODogVF9fOTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUxNDogVF9fOTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUyMDogVF9fOTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUyNjogVF9fOTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjUzMjogVF9fMTAwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTM5OiBUX18xMDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1NDY6IFRfXzEwMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjU1MzogVF9fMTAzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTYwOiBUX18xMDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1Njc6IFRfXzEwNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjU3NDogVF9fMTA2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NTgxOiBUX18xMDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo1ODg6IFRfXzEwOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjU5NTogVF9fMTA5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6NjAyOiBUX18xMTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MDk6IFRfXzExMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTExKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MTY6IFRfXzExMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MjM6IFRfXzExMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2MzA6IFRfXzExNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2Mzc6IFRfXzExNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NDQ6IFRfXzExNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NTE6IFRfXzExNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NTg6IFRfXzExOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NjU6IFRfXzExOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2NzI6IFRfXzEyMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2Nzk6IFRfXzEyMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2ODY6IFRfXzEyMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo2OTM6IFRfXzEyMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MDA6IFRfXzEyNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MDc6IFRfXzEyNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MTQ6IFRfXzEyNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MjE6IFRfXzEyNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3Mjg6IFRfXzEyOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3MzU6IFRfXzEyOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NDI6IFRfXzEzMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NDk6IFRfXzEzMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NTY6IFRfXzEzMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NjM6IFRfXzEzMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3NzA6IFRfXzEzNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3Nzc6IFRfXzEzNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3ODQ6IFRfXzEzNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3OTE6IFRfXzEzNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo3OTg6IFRfXzEzOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MDU6IFRfXzEzOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MTI6IFRfXzE0MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MTk6IFRfXzE0MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MjY6IFRfXzE0MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4MzM6IFRfXzE0MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NDA6IFRfXzE0NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NDc6IFRfXzE0NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NTQ6IFRfXzE0NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NjE6IFRfXzE0NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4Njg6IFRfXzE0OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4NzU6IFRfXzE0OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4ODI6IFRfXzE1MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4ODk6IFRfXzE1MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo4OTY6IFRfXzE1MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MDM6IFRfXzE1MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MTA6IFRfXzE1NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MTc6IFRfXzE1NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MjQ6IFRfXzE1NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5MzE6IFRfXzE1NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5Mzg6IFRfXzE1OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NDU6IFRfXzE1OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTU5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NTI6IFRfXzE2MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NTk6IFRfXzE2MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NjY6IFRfXzE2MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5NzM6IFRfXzE2MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5ODA6IFRfXzE2NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5ODc6IFRfXzE2NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTo5OTQ6IFRfXzE2NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDAxOiBUX18xNjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTAwODogVF9fMTY4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwMTU6IFRfXzE2OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTY5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDIyOiBUX18xNzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTAyOTogVF9fMTcxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwMzY6IFRfXzE3MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTcyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDQzOiBUX18xNzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA1MDogVF9fMTc0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwNTc6IFRfXzE3NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTc1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDY0OiBUX18xNzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA3MTogVF9fMTc3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwNzg6IFRfXzE3OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTc4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMDg1OiBUX18xNzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTA5MjogVF9fMTgwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEwOTk6IFRfXzE4MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTgxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTA2OiBUX18xODIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTExMzogVF9fMTgzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExMjA6IFRfXzE4NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTg0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTI3OiBUX18xODUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTEzNDogVF9fMTg2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExNDE6IFRfXzE4NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTg3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTQ4OiBUX18xODgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE4OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE1NTogVF9fMTg5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xODkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExNjI6IFRfXzE5MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTkwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTY5OiBUX18xOTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE3NjogVF9fMTkyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjExODM6IFRfXzE5MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTkzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMTkwOiBUX18xOTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTE5NzogVF9fMTk1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyMDQ6IFRfXzE5NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTk2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjExOiBUX18xOTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTIxODogVF9fMTk4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyMjU6IFRfXzE5OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTk5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjMyOiBUX18yMDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTIzOTogVF9fMjAxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyNDY6IFRfXzIwMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjUzOiBUX18yMDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTI2MDogVF9fMjA0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyNjc6IFRfXzIwNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjA1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjc0OiBUX18yMDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTI4MTogVF9fMjA3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEyODg6IFRfXzIwOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjA4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMjk1OiBUX18yMDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTMwMjogVF9fMjEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMDk6IFRfXzIxMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjExKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzE2OiBUX18yMTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTMyMzogVF9fMjEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzMzA6IFRfXzIxNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjE0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzM3OiBUX18yMTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM0NDogVF9fMjE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzNTE6IFRfXzIxNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjE3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzU4OiBUX18yMTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIxOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM2NTogVF9fMjE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzNzI6IFRfXzIyMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxMzc5OiBUX18yMjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTM4NjogVF9fMjIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjEzOTM6IFRfXzIyMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDAwOiBUX18yMjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQwNzogVF9fMjI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0MTQ6IFRfXzIyNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDIxOiBUX18yMjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQyODogVF9fMjI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0MzU6IFRfXzIyOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDQyOiBUX18yMzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ0OTogVF9fMjMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0NTY6IFRfXzIzMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDYzOiBUX18yMzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ3MDogVF9fMjM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0Nzc6IFRfXzIzNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNDg0OiBUX18yMzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTQ5MTogVF9fMjM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE0OTg6IFRfXzIzOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTA1OiBUX18yMzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTUxMjogVF9fMjQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1MTk6IFRfXzI0MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTI2OiBUX18yNDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTUzMzogVF9fMjQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1NDA6IFRfXzI0NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTQ3OiBUX18yNDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU1NDogVF9fMjQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1NjE6IFRfXzI0NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTY4OiBUX18yNDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI0OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU3NTogVF9fMjQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE1ODI6IFRfXzI1MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNTg5OiBUX18yNTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTU5NjogVF9fMjUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2MDM6IFRfXzI1MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjEwOiBUX18yNTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTYxNzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjI2OiBSVUxFX0lOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2MzU6IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjQ4OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjU2OiBSVUxFX1NUUklORworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9TVFJJTkcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOjE2Njg6IFJVTEVfTUxfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MToxNjg0OiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTcwMDogUlVMRV9XUworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9XUygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE6MTcwODogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDc1XDFcdWZmZmZcM1w3NVwxXHVmZmZmXDE2XDc1XDJcdWZmZmZcMVx1MDA5YVwxXHUwMDljIisKKyAgICAgICAgIlwxXHUwMDlmXDJcdWZmZmZcMVx1MDBhNFwzXHVmZmZmXDFcdTAwYWFcMVx1MDBhZVwxXHUwMGIwXDFcdTAwYjIiKworICAgICAgICAiXDFcdTAwYjRcMVx1MDBiNlwxXHUwMGI4XDFcdTAwYmFcMVx1MDBiZFwxXHUwMGJmXDFcdWZmZmZcMlw3NVwyIisKKyAgICAgICAgIlx1MDBjNVwxXDY0XDVcdWZmZmZcMlw3NVwxXHUwMGNlXDFcdTAwY2ZcMVx1MDBkMFwzXDc1XDJcdWZmZmZcNCIrCisgICAgICAgICJcNzVcMVx1MDBkYlwxXDc1XDFcdTAwZGVcNFw3NVwxXHVmZmZmXDRcNzVcMVx1MDBmMVwzXDc1XDFcdTAwZjYiKworICAgICAgICAiXDI2XDc1XDFcdTAxMWFcM1w3NVwxXHUwMTIxXDEwXDc1XDFcdTAxMzdcMlw3NVwxXHUwMTNiXDJcNzVcMVx1MDEzZSIrCisgICAgICAgICJcMVx1MDEzZlwxXHUwMTQwXDJcNzVcMVx1MDE0M1wyMFw3NVwxXHUwMTViXDFcNzVcNlx1ZmZmZlwxXHUwMTVlIisKKyAgICAgICAgIlw2XHVmZmZmXDFcdTAxNjBcMjZcdWZmZmZcMVx1MDE2Mlw3XHVmZmZmXDJcNzVcMVx1ZmZmZlwxXHUwMGM1XDQiKworICAgICAgICAiXHVmZmZmXDVcNzVcM1x1ZmZmZlwyXDc1XDFcdTAxNmRcN1w3NVwxXHVmZmZmXDJcNzVcMVx1ZmZmZlwxXDc1IisKKyAgICAgICAgIlwxXHUwMTc5XDIwXDc1XDFcdWZmZmZcNFw3NVwxXHVmZmZmXDExXDc1XDFcdTAxOWFcMjBcNzVcMVx1MDFhYiIrCisgICAgICAgICJcN1w3NVwyXHVmZmZmXDVcNzVcMlx1ZmZmZlwxMVw3NVwxXHUwMWMxXDEzXDc1XDFcdWZmZmZcMlw3NVwxXHUwMWQwIisKKyAgICAgICAgIlwxXHVmZmZmXDJcNzVcM1x1ZmZmZlwyXDc1XDNcdWZmZmZcMVw3NVwxXHUwMWQ4XDJcNzVcMVx1MDFkYlwyMCIrCisgICAgICAgICJcNzVcMVx1ZmZmZlwxXDc1XDZcdWZmZmZcMVw3NVwxXHUwMWYwXDFcdTAxZjFcM1w3NVwxXHUwMWY2XDNcNzUiKworICAgICAgICAiXDFcdWZmZmZcM1w3NVwxXHUwMWZlXDNcNzVcMVx1MDIwM1wzXDc1XDFcdWZmZmZcMVx1MDIwOFwzXDc1XDFcdTAyMGMiKworICAgICAgICAiXDEwXDc1XDFcdTAyMTZcMVw3NVwxXHUwMjE4XDFcNzVcMVx1MDIxYVwxMVw3NVwxXHUwMjI1XDRcNzVcMVx1ZmZmZiIrCisgICAgICAgICJcMTBcNzVcMVx1MDIzM1w2XDc1XDFcdTAyM2FcMVx1ZmZmZlwxXHUwMjNkXDFcNzVcMVx1MDIzZlw3XDc1XDEiKworICAgICAgICAiXHUwMjQ3XDJcNzVcMVx1ZmZmZlw3XDc1XDFcdWZmZmZcMlw3NVwxXHUwMjU0XDEzXDc1XDFcdWZmZmZcM1w3NSIrCisgICAgICAgICJcMVx1MDI2M1wyXHVmZmZmXDFcNzVcMVx1ZmZmZlwxXDc1XDFcdTAyNjdcMVx1ZmZmZlwxXDc1XDFcdTAyNjkiKworICAgICAgICAiXDNcNzVcMVx1MDI2ZFwxXHUwMjZlXDExXDc1XDFcdTAyNzhcMVx1MDI3OVwyXDc1XDJcdWZmZmZcMlw3NVwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDc1XDFcdWZmZmZcNFw3NVwxXHUwMjg1XDJcNzVcMVx1ZmZmZlw0XDc1XDFcdWZmZmZcMVx1MDI4ZCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDc1XDFcdTAyOGZcMVx1ZmZmZlwyXDc1XDFcdTAyOTJcMVx1ZmZmZlwxXDc1XDFcdTAyOTQiKworICAgICAgICAiXDFcdTAyOTZcMVw3NVwxXHUwMjk4XDRcNzVcMVx1ZmZmZlwxXDc1XDFcdWZmZmZcMVx1MDI5ZVwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMmEwXDRcNzVcMVx1MDJhNlwzXDc1XDJcdWZmZmZcM1w3NVwxXHUwMmFkXDFcdTAyYWZcM1w3NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMmIzXDFcNzVcMVx1MDJiNVwxXDc1XDFcdWZmZmZcNVw3NVwxXHUwMmJjXDFcdWZmZmZcMlw3NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDc1XDFcdWZmZmZcMVx1MDJjMFwxXHUwMmMxXDFcdTAyYzJcNFw3NVwxXHVmZmZmXDJcNzVcMVx1MDJjYSIrCisgICAgICAgICJcMVw3NVwxXHUwMmNjXDZcNzVcMlx1ZmZmZlwxXDc1XDFcdWZmZmZcMTRcNzVcMlx1ZmZmZlwyXDc1XDFcdWZmZmYiKworICAgICAgICAiXDFcNzVcMVx1ZmZmZlwzXDc1XDJcdWZmZmZcMVx1MDJlOVwyXDc1XDFcdWZmZmZcMVx1MDJlY1wzXDc1XDFcdTAyZjAiKworICAgICAgICAiXDJcdWZmZmZcMVw3NVwxXHUwMmYyXDJcNzVcMlx1ZmZmZlw1XDc1XDFcdWZmZmZcN1w3NVwxXHVmZmZmXDFcNzUiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDMwM1wxXHUwMzA0XDFcdWZmZmZcMVw3NVwxXHVmZmZmXDFcdTAzMDZcMVx1ZmZmZlwxIisKKyAgICAgICAgIlw3NVwxXHVmZmZmXDFcdTAzMDhcMVw3NVwxXHUwMzBhXDFcNzVcMVx1MDMwY1wxXHVmZmZmXDFcdTAzMGRcMSIrCisgICAgICAgICJcdWZmZmZcNFw3NVwxXHUwMzEyXDFcdWZmZmZcMVx1MDMxM1wxXHUwMzE0XDRcNzVcM1x1ZmZmZlwxXDc1XDEiKworICAgICAgICAiXHUwMzFiXDFcNzVcMVx1ZmZmZlwxXDc1XDFcdWZmZmZcMVx1MDMxZVwzXDc1XDFcdWZmZmZcMVw3NVwxXHVmZmZmIisKKyAgICAgICAgIlwzXDc1XDNcdWZmZmZcMlw3NVwxXHUwMzI5XDRcNzVcMVx1ZmZmZlwxXHUwMzJlXDFcdWZmZmZcMVx1MDMyZiIrCisgICAgICAgICJcMVw3NVwxXHUwMzMxXDFcdTAzMzJcM1w3NVwxXHUwMzM2XDFcNzVcMVx1MDMzYlwyXDc1XDFcdTAzM2VcMVx1MDMzZiIrCisgICAgICAgICJcMVx1MDM0MFw0XDc1XDNcdWZmZmZcMVw3NVwxXHUwMzQ2XDFcdTAzNDdcMVx1MDM0OFwxXHUwMzQ5XDFcNzUiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDM0YlwxXDc1XDFcdWZmZmZcMVx1MDM0ZFwyXDc1XDFcdWZmZmZcMVx1MDM1MFwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMzUxXDFcNzVcMVx1ZmZmZlwzXDc1XDFcdTAzNTdcMVx1ZmZmZlwzXDc1XDFcdTAzNWJcMVw3NVwxXHUwMzVkIisKKyAgICAgICAgIlwyXDc1XDJcdWZmZmZcMVx1MDM2MFwxXHVmZmZmXDFcNzVcMVx1ZmZmZlwxXDc1XDFcdWZmZmZcMVw3NVwzXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMzY4XDFcNzVcMVx1MDM2YVwzXHVmZmZmXDZcNzVcMVx1ZmZmZlwxXDc1XDFcdTAzNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVw3NVwxXHUwMzc0XDFcdTAzNzVcMVx1ZmZmZlw1XDc1XDFcdTAzN2NcMVx1ZmZmZlwxXDc1XDFcdWZmZmYiKworICAgICAgICAiXDJcNzVcMlx1ZmZmZlwxXDc1XDJcdWZmZmZcMVw3NVwxXHUwMzg2XDFcNzVcMVx1ZmZmZlwzXDc1XDFcdTAzOGIiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDM4Y1wxXHUwMzhkXDNcdWZmZmZcM1w3NVwxXHUwMzkxXDFcNzVcNFx1ZmZmZlwxXDc1IisKKyAgICAgICAgIlwxXHVmZmZmXDFcNzVcMVx1ZmZmZlwyXDc1XDJcdWZmZmZcMVw3NVwyXHVmZmZmXDFcdTAzOWRcMVx1MDM5ZSIrCisgICAgICAgICJcMVx1ZmZmZlwyXDc1XDFcdTAzYTFcMVx1ZmZmZlwxXDc1XDFcdWZmZmZcMlw3NVwxXHVmZmZmXDFcNzVcMVx1MDNhNiIrCisgICAgICAgICJcMVw3NVw1XHVmZmZmXDFcNzVcMVx1ZmZmZlwzXDc1XDFcdTAzYWNcM1w3NVwxXHVmZmZmXDFcNzVcM1x1ZmZmZiIrCisgICAgICAgICJcM1w3NVwxXHUwM2I1XDFcNzVcMVx1ZmZmZlwxXDc1XDRcdWZmZmZcM1w3NVwyXHVmZmZmXDFcdTAzYmRcM1w3NSIrCisgICAgICAgICJcM1x1ZmZmZlwyXDc1XDFcdTAzYzNcMVx1ZmZmZlwyXDc1XDFcdWZmZmZcM1w3NVw3XHVmZmZmXDFcdTAzY2EiKworICAgICAgICAiXDFcNzVcMVx1ZmZmZlwxXDc1XDFcdTAzY2RcMVx1MDNjZlwxXDc1XDFcdWZmZmZcMVx1MDNkMVwxXHUwM2QyIisKKyAgICAgICAgIlwzXDc1XDFcdWZmZmZcM1w3NVwxXHUwM2Q5XDFcdWZmZmZcMVw3NVwxXHUwM2RjXDFcdTAzZGRcMVx1ZmZmZiIrCisgICAgICAgICJcNFw3NVwxXHUwM2UyXDNcdWZmZmZcM1w3NVwxXHUwM2U2XDFcdTAzZTdcMVx1ZmZmZlwxXDc1XDFcdTAzZTkiKworICAgICAgICAiXDFcdTAzZWFcMlw3NVwyXHVmZmZmXDFcdTAzZWVcMVw3NVwxXHVmZmZmXDFcdTAzZjBcMVx1ZmZmZlwxXHUwM2YxIisKKyAgICAgICAgIlwyXHVmZmZmXDFcdTAzZjJcMVw3NVwxXHUwM2Y0XDFcNzVcMVx1MDNmNlwxXDc1XDFcdWZmZmZcMVx1MDNmOSIrCisgICAgICAgICJcMVx1MDNmYVwyXHVmZmZmXDRcNzVcMlx1ZmZmZlwyXDc1XDJcdWZmZmZcMVw3NVwyXHVmZmZmXDFcdTA0MDIiKworICAgICAgICAiXDFcNzVcMVx1MDQwNVwxXHVmZmZmXDFcNzVcM1x1ZmZmZlwxXHUwNDA3XDFcdWZmZmZcMVx1MDQwOFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDc1XDNcdWZmZmZcMVx1MDQwYVwyXDc1XDFcdTA0MGRcMlw3NVwxXHUwNDEwXDFcdWZmZmZcMVx1MDQxMSIrCisgICAgICAgICJcMlx1ZmZmZlwxXDc1XDJcdWZmZmZcMVx1MDQxM1wxXHVmZmZmXDFcdTA0MTRcMVw3NVwxXHVmZmZmXDFcdTA0MTYiKworICAgICAgICAiXDFcdTA0MTdcMlx1ZmZmZlwxXDc1XDJcdWZmZmZcMVw3NVwyXHVmZmZmXDFcdTA0MWFcMVw3NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwNDFjXDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW9mUyA9CisgICAgICAgICJcdTA0MWRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWluUyA9CisgICAgICAgICJcMVwwXDFcMTQxXDFcdWZmZmZcMVwxNDFcMVwxNTRcMVwxNDFcMVx1ZmZmZlw0XDE0MVwxXDE0MlwxXDE0MSIrCisgICAgICAgICJcMVwxNDVcMVwxNDFcMVw2M1wxXDE1MVwzXDE0NVwxXDE0M1wyXHVmZmZmXDFcNTVcMVw1NlwxXDUyXDJcdWZmZmYiKworICAgICAgICAiXDFcNzVcM1x1ZmZmZlwxXDUzXDFcNTJcMVw3NVwxXDc2XDFcNzVcMVwxNzRcMVw0NlwxXDc1XDFcNTZcMVw3MiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE1MFwxXDE0MVwyXDYwXDFcNDRcNVx1ZmZmZlwxXDE0M1wxXDE1N1wzXDQ0XDJcMTYyXDEiKworICAgICAgICAiXDE0NlwyXHVmZmZmXDFcMTQyXDFcMTQ2XDFcMTQ3XDFcMTU3XDFcNDRcMVwxNjNcMVw0NFwxXDE1N1wxXDE1NiIrCisgICAgICAgICJcMlwxNTRcMVx1ZmZmZlwxXDE1NFwxXDE2MlwxXDE1NFwxXDE2M1wxXDQ0XDFcMTUxXDFcMTQ0XDFcMTYyXDEiKworICAgICAgICAiXDQ0XDJcMTU2XDFcMTQxXDFcMTcyXDFcMTU3XDFcMTQyXDFcMTQxXDFcMTUxXDJcMTU2XDFcMTYyXDFcMTU3IisKKyAgICAgICAgIlwxXDE1NFwxXDE2MFwxXDE1N1wxXDE0MVwyXDE1NVwxXDE0MlwxXDE2MlwxXDE1MVwxXDU1XDFcNDRcMVwxNTQiKworICAgICAgICAiXDFcMTY0XDFcMTU0XDFcNDRcMVwxNDNcMVwxNDRcMVwxNTZcMVwxNjdcMVwxNTZcMVwxNjJcMVwxNDZcMVwxNTYiKworICAgICAgICAiXDFcNDRcMVwxNjZcMVwxNTRcMVw0NFwxXDE0N1wxXDE2NFwzXDQ0XDFcMTQ1XDFcMTU1XDFcNDRcMVw0MFwxIisKKyAgICAgICAgIlw1NVwxXDE0NlwyXDE1NFwxXDE2N1wxXDE1NlwxXDE0MVwxXDE0NFwxXDE1NVwxXDE1MVwxXDE1NlwxXDE1NyIrCisgICAgICAgICJcMVwxNDFcMVwxNDNcMVwxNTdcMVw0NFwxXDE0MVw2XHVmZmZmXDFcNzRcNlx1ZmZmZlwxXDc1XDI2XHVmZmZmIisKKyAgICAgICAgIlwxXDc1XDdcdWZmZmZcMVwxNTFcMVwxNTRcMVx1ZmZmZlwxXDYwXDRcdWZmZmZcMVwxNTNcMVwxNDVcMVwxNDQiKworICAgICAgICAiXDFcMTUwXDFcMTYwXDNcdWZmZmZcMVwxNjRcMVwxNDNcMVw0NFwxXDE1N1wxXDE0NVwxXDE0NFwxXDE2NFwxIisKKyAgICAgICAgIlwxNTBcMVwxNTNcMVwxNDVcMVx1ZmZmZlwyXDE0NVwxXHVmZmZmXDFcMTU1XDFcNDRcMlwxNjRcMVwxNTFcMSIrCisgICAgICAgICJcMTYzXDFcMTQ1XDFcMTQxXDFcMTQ1XDFcMTU3XDFcMTU2XDFcMTQzXDFcMTYyXDFcMTY0XDFcMTU0XDFcMTY0IisKKyAgICAgICAgIlwxXDE0NVwxXDE0M1wxXHVmZmZmXDFcMTYwXDFcMTUxXDFcMTQ3XDFcMTUxXDFcdWZmZmZcMVwxNTdcMVwxNTEiKworICAgICAgICAiXDFcMTU0XDFcMTUxXDFcMTQ3XDFcMTQ1XDFcMTY3XDFcMTYzXDFcMTQ1XDFcNDRcMVwxNTRcMVwxNDVcMVwxNjQiKworICAgICAgICAiXDFcMTQzXDFcMTYzXDFcMTUxXDFcMTYwXDFcMTUxXDFcMTQ1XDFcMTU1XDFcMTQxXDFcMTU0XDFcMTQxXDJcMTU2IisKKyAgICAgICAgIlwxXDE0NVwxXDQ0XDFcMTY0XDFcMTYwXDFcMTQ1XDJcMTU0XDFcMTU3XDFcMTQ1XDJcdWZmZmZcMVwxNTFcMSIrCisgICAgICAgICJcMTYzXDFcMTY0XDJcMTQ0XDJcdWZmZmZcMVwxNTNcMVw1NVwxXDE1MFwxXDE1MVwxXDE0N1wxXDE1N1wxXDE0NCIrCisgICAgICAgICJcMVwxNTFcMVwxNjVcMVw0NFwxXDE1NlwxXDE1M1wxXDE0MVwxXDE2M1wxXDE1MFwxXDE0M1wzXDE0MVwxXDE2NCIrCisgICAgICAgICJcMVwxNDJcMVx1ZmZmZlwxXDE1MVwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNjJcMVwxNTdcM1x1ZmZmZlwxXDE2MiIrCisgICAgICAgICJcMVwxNTdcMlx1ZmZmZlwxXDE1NFwxXDE1N1wxXDQ0XDFcMTQyXDFcMTU0XDFcNDRcMVwxNTVcMVwxNDVcMVwxNDQiKworICAgICAgICAiXDFcMTQ3XDFcMTQ1XDFcMTU0XDFcMTQ0XDFcMTU3XDFcMTQ1XDFcMTQ0XDFcMTQ3XDFcMTU3XDJcMTQ1XDFcMTUwIisKKyAgICAgICAgIlwxXDE1NlwxXHVmZmZmXDFcMTU0XDZcdWZmZmZcMVwxNTRcMlw0NFwxXDE0MVwxXDU1XDFcMTUxXDFcNDRcMSIrCisgICAgICAgICJcMTQ1XDFcMTYyXDFcMTQ1XDFcdWZmZmZcMVwxNjVcMVwxNTRcMVwxNjNcMVw0NFwxXDE2NFwxXDE2NVwxXDE1NiIrCisgICAgICAgICJcMVw0NFwxXDE0NFwxXDQwXDFcMTQxXDFcdWZmZmZcMVw0NFwxXDE0NVwxXDE1NFwxXDE0NVwxXDQ0XDFcMTU0IisKKyAgICAgICAgIlwxXDE0NFwxXDE2MlwxXDE1NVwxXDE2NFwxXDE0MVwxXDE0NVwxXDE1N1wxXDQ0XDFcMTQ1XDFcNDRcMVwxNTAiKworICAgICAgICAiXDFcNDRcMVwxNDFcMVwxNTFcMVwxNTVcMVwxNjNcMVwxNTVcMVwxNDVcMVwxNTZcMVwxNTFcMVwxNTZcMVw0NCIrCisgICAgICAgICJcMVwxMTdcMVwxNTFcMVwxNjVcMVwxNjJcMVx1ZmZmZlwxXDE0NVwxXDE1NlwxXDE0M1wxXDE1MFwxXDU1XDEiKworICAgICAgICAiXDE0NlwxXDE1MVwxXDE0NFwxXDQ0XDFcMTQxXDFcMTYyXDFcMTQyXDFcMTU0XDFcMTYzXDFcMTQ0XDFcNDRcMSIrCisgICAgICAgICJcdWZmZmZcMVw0NFwxXDE1NFwxXDQ0XDJcMTQ1XDFcMTY3XDFcMTU2XDFcMTYxXDFcMTQ1XDFcMTU3XDFcNDQiKworICAgICAgICAiXDFcMTQ1XDFcMTQ3XDFcdWZmZmZcMVwxNjRcMVwxNTZcMVwxNDVcMVwxNjJcMVwxNDVcMVwxNzJcMVwxNjJcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNTFcMVwxNDVcMVw0NFwxXDE1NVwxXDQwXDFcMTQ1XDFcMTYyXDFcMTUxXDFcMTY1XDFcMTU1IisKKyAgICAgICAgIlwxXDE0NVwxXDE1NFwxXDE0NFwxXDE2MlwxXHVmZmZmXDFcMTQ1XDFcMTY0XDFcMTQxXDFcNDRcMVwxNDVcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNDFcMVw0NFwxXDE0NVwxXDE1MFwxIisKKyAgICAgICAgIlwxNTRcMlw0NFwxXDE2MFwxXDE2NlwxXDE2MlwxXDU1XDFcMTQ1XDJcMTYyXDFcMTQxXDFcMTY0XDJcNDRcMSIrCisgICAgICAgICJcMTUxXDFcMTQ1XDJcdWZmZmZcMVwxNDdcMVwxNDVcMlwxNTZcMVx1ZmZmZlwxXDE2MlwxXDE0MVwxXDE1NlwxIisKKyAgICAgICAgIlwxNjRcMVw0NFwxXDE0M1wxXDE0MVwxXHVmZmZmXDFcMTQ1XDFcMTYwXDFcMTU2XDFcMTQ0XDFcdWZmZmZcMSIrCisgICAgICAgICJcNDRcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcdWZmZmZcMVwxNjJcMVwxNzFcMVw0NFwxXHVmZmZmXDFcMTU0XDIiKworICAgICAgICAiXDQ0XDFcMTU2XDFcNDRcMVwxNjRcMVwxNTZcMVwxNTVcMVwxNTdcMVx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcNDQiKworICAgICAgICAiXDFcdWZmZmZcMVw0NFwxXDE1NlwxXDE2NVwxXDE2MFwxXDE2NVwxXDQ0XDFcMTQ3XDFcMTQzXDFcMTQxXDJcdWZmZmYiKworICAgICAgICAiXDFcMTU2XDFcMTY0XDFcMTQyXDJcNDRcMVwxNjRcMVwxNTBcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTU2XDFcNDQiKworICAgICAgICAiXDFcMTQ2XDFcdWZmZmZcMVwxNjJcMVwxNDRcMVwxNDFcMVw1NVwxXDE0NlwxXDQ0XDFcdWZmZmZcMVwxNTdcMSIrCisgICAgICAgICJcMTU0XDFcdWZmZmZcMVwxNDFcMVx1ZmZmZlwzXDQ0XDFcMTY0XDFcMTY1XDFcMTY0XDFcMTU1XDFcdWZmZmYiKworICAgICAgICAiXDJcMTYyXDFcNDRcMVwxNDdcMVw0NFwxXDE2NFwxXDE2MlwxXDE0NVwzXDE1NlwyXHVmZmZmXDFcMTQxXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ0XDFcMTUxXDJcMTU0XDFcMTUxXDFcMTQ0XDJcMTQ1XDFcMTU2XDFcMTQ3XDFcMTQ1XDFcMTQ3XDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ0XDFcMTU1XDFcMTYyXDFcdWZmZmZcMVwxNTRcMVx1ZmZmZlwxXDE2MlwxXDE2NFwxXDE0MVwyXHVmZmZmIisKKyAgICAgICAgIlwxXDQ0XDFcMTQ1XDFcMTQxXDFcdWZmZmZcMVw0NFwxXDE2NFwxXDE2NlwxXDE1NlwxXDQ0XDJcdWZmZmZcMSIrCisgICAgICAgICJcMTQzXDFcNDRcMVwxNDVcMVwxNTVcMVwxNjVcMVx1ZmZmZlwxXDE0N1wxXDE2NFwxXDE1MVwxXDE2NFwxXDU1IisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTQxXDFcMTYyXDFcMTU2XDFcMTYzXDFcMTQxXDFcMTYzXDFcMTUxXDFcdWZmZmZcMVwxNjQiKworICAgICAgICAiXDFcdWZmZmZcMlw0NFwxXHVmZmZmXDFcMTcxXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTYzXDFcdWZmZmZcMSIrCisgICAgICAgICJcNDRcMVwxNDNcMVw0NFwxXDE1NFwxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcNTVcMVwxNTVcMVwxNDEiKworICAgICAgICAiXDFcMTU1XDFcNDRcMVx1ZmZmZlwyXDQ0XDFcMTY0XDFcMTA2XDFcMTU0XDFcMTY0XDNcdWZmZmZcMVwxNTFcMSIrCisgICAgICAgICJcNDRcMVwxNTdcMVx1ZmZmZlwxXDE0N1wxXHVmZmZmXDFcNDRcMVwxNDdcMVwxNjNcMVwxNjJcMVwxNjBcMVwxNTciKworICAgICAgICAiXDFcdWZmZmZcMVwxNTRcMVwxNTFcMVwxNjRcM1x1ZmZmZlwxXDE0MVwxXDE0NVwxXDQ0XDFcMTU1XDFcNTVcMSIrCisgICAgICAgICJcMTU3XDFcMTQxXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcNDRcMVwxNTFcMlw0NFwxXDE0N1wxXDE2M1wxXDE2MiIrCisgICAgICAgICJcMVw0NFwxXDE0MlwxXDQ0XDFcMTY0XDFcMTQzXDNcNDRcMlwxNDFcMVwxNzBcMVwxNDVcM1x1ZmZmZlwxXDE0MSIrCisgICAgICAgICJcNFw0NFwxXDE0MlwxXHVmZmZmXDFcNDRcMVwxNTRcMVx1ZmZmZlwxXDQ0XDFcMTQxXDFcMTQzXDFcdWZmZmYiKworICAgICAgICAiXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTYwXDFcMTU1XDFcNTVcMVwxNzFcMVwxNjRcMVw0NFwxXHVmZmZmXDFcMTYwIisKKyAgICAgICAgIlwxXDE0N1wxXDE2M1wxXDQ0XDFcMTU0XDFcNDRcMVwxNTdcMVwxNDVcMlx1ZmZmZlwxXDQ0XDFcdWZmZmZcMSIrCisgICAgICAgICJcMTYwXDFcdWZmZmZcMVwxNzFcMVx1ZmZmZlwxXDE1N1wyXHVmZmZmXDFcMTQyXDFcNDRcMVwxNDNcMVw0NFwzIisKKyAgICAgICAgIlx1ZmZmZlwyXDE1MVwxXDE0MVwxXDE0NVwxXDE1MVwxXDE0NlwxXHVmZmZmXDFcMTU2XDFcNDRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMlw0NFwxXDE0MVwxXDE2MlwxXDE1N1wxXDE0N1wxXDE0NVwxXDE2NFwxXDQ0XDFcdWZmZmZcMVwxNDEiKworICAgICAgICAiXDFcMTQyXDFcMTY1XDFcMTYyXDJcdWZmZmZcMVwxNTZcMlx1ZmZmZlwxXDU1XDFcNDRcMVwxNjRcMVx1ZmZmZiIrCisgICAgICAgICJcMlwxNDVcMVwxNTdcMVw0NFwxXHVmZmZmXDJcNDRcM1x1ZmZmZlwzXDE2NFwxXDQ0XDFcMTY0XDRcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDFcdWZmZmZcMVw1NVwxXHVmZmZmXDFcMTU0XDFcMTQ1XDJcdWZmZmZcMVwxNTRcMlwxNDJcMlw0NCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE0NVwxXDE1MVwxXDQ0XDFcdWZmZmZcMVwxMDNcMVx1ZmZmZlwxXDE1NlwxXDE2MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MVwxXDQ0XDFcMTYyXDVcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE1NlwxXDE2MlwxXDE2M1wxXDQ0XDEiKworICAgICAgICAiXDE2NFwyXDE1MVwxXHVmZmZmXDFcMTU2XDJcdWZmZmZcMVwxNDdcMVwxNTVcMVwxNjJcMVwxNTZcMVw0NFwxIisKKyAgICAgICAgIlwxNTFcMVx1ZmZmZlwxXDE2Mlw0XHVmZmZmXDFcMTU2XDJcMTQ3XDFcMTQzXDFcdWZmZmZcMVw0NFwxXDE0NCIrCisgICAgICAgICJcMVwxNDFcMVwxNTdcM1x1ZmZmZlwyXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNjRcMVwxNTRcMVx1ZmZmZlwxXDE2MyIrCisgICAgICAgICJcMVwxNTdcMVwxNDFcMVwxNDVcNlx1ZmZmZlwxXDQ0XDFcMTU2XDFcdWZmZmZcMVwxNjNcMlw0NFwxXDE1NlwxIisKKyAgICAgICAgIlx1ZmZmZlwyXDQ0XDFcMTQ3XDFcMTYzXDFcMTY0XDFcdWZmZmZcMVwxNTRcMVwxNDNcMVwxNzJcMVw0NFwxXDE0NSIrCisgICAgICAgICJcMVwxNjNcMlw0NFwxXHVmZmZmXDFcMTU3XDFcMTQ3XDFcMTQ0XDFcMTUxXDFcNDRcM1x1ZmZmZlwxXDQwXDEiKworICAgICAgICAiXDE0NFwxXDE2NFwyXDQ0XDFcdWZmZmZcMVwxNDVcMlw0NFwxXDE0NlwxXDE2NFwxXDE2MlwxXHVmZmZmXDFcNDQiKworICAgICAgICAiXDFcMTYzXDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDQ0XDFcMTY0XDFcNDRcMVwxNDVcMSIrCisgICAgICAgICJcNDRcMVwxNDVcMVx1ZmZmZlwxXDU1XDFcNDRcMlx1ZmZmZlwxXDE1NlwxXDE1MVwxXDE0M1wxXDE1NlwyXHVmZmZmIisKKyAgICAgICAgIlwyXDE0NVwyXHVmZmZmXDFcMTQ0XDJcdWZmZmZcMVw0NFwxXDE0NVwxXDU1XDFcdWZmZmZcMVwxMjVcM1x1ZmZmZiIrCisgICAgICAgICJcMVw0NFwxXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDE0NFwzXHVmZmZmXDFcNDRcMVwxNTZcMVwxNTdcMVw0NFwyIisKKyAgICAgICAgIlwxNjJcMVw0NFwxXHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDEyMlwyXHVmZmZmXDFcNDRcMVx1ZmZmZlwxXDQ0XDEiKworICAgICAgICAiXDE1NFwxXHVmZmZmXDJcNDRcMlx1ZmZmZlwxXDExMVwyXHVmZmZmXDFcMTU3XDJcdWZmZmZcMVw0NFwxXDE2MiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDQ0XDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWF4UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDE3MFwxXHVmZmZmXDFcMTU3XDFcMTcwXDFcMTYyXDFcdWZmZmZcMVwxNjVcMVwxNTdcMiIrCisgICAgICAgICJcMTcxXDFcMTY1XDFcMTcxXDFcMTY1XDFcMTcxXDFcMTY2XDFcMTYzXDFcMTY1XDFcMTY0XDFcMTYyXDFcMTY0IisKKyAgICAgICAgIlwyXHVmZmZmXDFcNzZcMVw1NlwxXDc1XDJcdWZmZmZcMVw3NlwzXHVmZmZmXDNcNzVcMVw3NlwxXDc1XDFcMTc0IisKKyAgICAgICAgIlwxXDQ2XDFcNzVcMlw3MlwxXHVmZmZmXDFcMTUwXDFcMTQxXDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmZcMSIrCisgICAgICAgICJcMTY0XDFcMTU3XDNcMTcyXDJcMTYyXDFcMTQ2XDJcdWZmZmZcMVwxNzFcMVwxNDZcMVwxNDdcMVwxNTdcMVwxNzIiKworICAgICAgICAiXDFcMTYzXDFcMTcyXDFcMTU3XDFcMTYyXDFcMTU1XDFcMTcwXDFcdWZmZmZcMVwxNjVcMVwxNjNcMVwxNTZcMSIrCisgICAgICAgICJcMTY0XDFcMTcyXDFcMTUxXDFcMTQ0XDFcMTcwXDFcMTcyXDJcMTU2XDFcMTcxXDFcMTcyXDFcMTU3XDFcMTYwIisKKyAgICAgICAgIlwyXDE1MVwyXDE1NlwxXDE2MlwxXDE1N1wxXDE1NFwxXDE2MFwxXDE2N1wxXDE3MVwxXDE3MFwxXDE2NFwxXDE0MiIrCisgICAgICAgICJcMVwxNjJcMVwxNTFcMVw1NVwxXDE3MlwxXDE1NFwyXDE2NFwxXDE3MlwxXDE0NFwxXDE2M1wxXDE2NFwxXDE2NyIrCisgICAgICAgICJcMVwxNTZcMVwxNzFcMVwxNjRcMVwxNTZcMVwxNzJcMVwxNjZcMVwxNjRcMVwxNzJcMVwxNDdcMVwxNjRcM1wxNzIiKworICAgICAgICAiXDFcMTQ1XDFcMTU1XDFcMTcyXDFcNDBcMVw1NVwxXDE0NlwxXDE1NFwxXDE1NVwxXDE2N1wxXDE2MlwxXDE1MSIrCisgICAgICAgICJcMVwxNDRcMVwxNTVcMVwxNTdcMVwxNTZcMVwxNTdcMVwxNjBcMVwxNjRcMVwxNTdcMVwxNzJcMVwxNDFcNlx1ZmZmZiIrCisgICAgICAgICJcMVw3NFw2XHVmZmZmXDFcNzVcMjZcdWZmZmZcMVw3NVw3XHVmZmZmXDFcMTUxXDFcMTYyXDFcdWZmZmZcMVwxNTQiKworICAgICAgICAiXDRcdWZmZmZcMVwxNTNcMVwxNDVcMVwxNDRcMVwxNTBcMVwxNjBcM1x1ZmZmZlwxXDE2NFwxXDE0M1wxXDE3MiIrCisgICAgICAgICJcMVwxNTdcMVwxNDVcMVwxNDRcMVwxNjRcMVwxNTBcMVwxNTNcMVwxNDVcMVx1ZmZmZlwyXDE0NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE1NVwxXDE3MlwyXDE2NFwxXDE1MVwxXDE2M1wxXDE0NVwxXDE0MVwxXDE0NVwxXDE2NVwxXDE1NlwxXDE0MyIrCisgICAgICAgICJcMVwxNjJcMVwxNjRcMVwxNTRcMVwxNjRcMVwxNDVcMVwxNDNcMVx1ZmZmZlwxXDE2MFwxXDE1MVwxXDE0N1wxIisKKyAgICAgICAgIlwxNTFcMVx1ZmZmZlwxXDE1N1wxXDE1MVwxXDE1NFwxXDE1MVwxXDE2NFwxXDE0NVwxXDE2N1wxXDE2NFwxXDE0NSIrCisgICAgICAgICJcMVwxNzJcMVwxNTRcMVwxNDVcMVwxNjRcMVwxNDNcMVwxNjNcMVwxNTFcMVwxNjBcMVwxNTFcMVwxNDVcMVwxNTUiKworICAgICAgICAiXDFcMTQxXDFcMTU0XDFcMTQxXDJcMTU2XDFcMTQ1XDFcMTcyXDFcMTY0XDFcMTYwXDFcMTQ1XDJcMTU0XDFcMTU3IisKKyAgICAgICAgIlwxXDE0NVwyXHVmZmZmXDFcMTUxXDFcMTYzXDFcMTY0XDJcMTQ0XDJcdWZmZmZcMVwxNTNcMVw1NVwxXDE1MCIrCisgICAgICAgICJcMVwxNTFcMVwxNDdcMVwxNTdcMVwxNDRcMVwxNTFcMVwxNjVcMVwxNzJcMVwxNTZcMVwxNTNcMVwxNDVcMVwxNjMiKworICAgICAgICAiXDFcMTUwXDFcMTQzXDNcMTQxXDFcMTY0XDFcMTQyXDFcdWZmZmZcMVwxNTFcMVwxNDVcMVwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjJcMVwxNTdcM1x1ZmZmZlwxXDE2MlwxXDE1N1wyXHVmZmZmXDFcMTYzXDFcMTU3XDFcMTcyXDFcMTQyIisKKyAgICAgICAgIlwxXDE1NFwxXDE3MlwxXDE1NVwxXDE0NVwxXDE0NFwxXDE0N1wxXDE0NVwxXDE1NFwxXDE0NFwxXDE2NVwxXDE0NSIrCisgICAgICAgICJcMVwxNDRcMVwxNDdcMVwxNTdcMVwxNDVcMVwxNjRcMVwxNTBcMVwxNTZcMVx1ZmZmZlwxXDE1NFw2XHVmZmZmIisKKyAgICAgICAgIlwxXDE1NFwyXDE3MlwxXDE0MVwxXDE2NFwxXDE1MVwxXDE3MlwxXDE0NVwxXDE2MlwxXDE0NVwxXHVmZmZmXDEiKworICAgICAgICAiXDE2NVwxXDE1NFwxXDE2M1wxXDE3MlwxXDE2NFwxXDE2NVwxXDE2MlwxXDE3MlwxXDE0NFwxXDQwXDFcMTQxIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTU0XDFcMTQ1XDFcMTcyXDFcMTU0XDFcMTQ0XDFcMTYyXDFcMTU1XDEiKworICAgICAgICAiXDE2NFwxXDE0MVwxXDE0NVwxXDE1N1wxXDE3MlwxXDE0NVwxXDE3MlwxXDE1MFwxXDE3MlwxXDE0MVwxXDE1MSIrCisgICAgICAgICJcMVwxNTVcMVwxNjNcMVwxNTVcMVwxNDVcMVwxNTZcMVwxNTFcMVwxNTZcMVwxNzJcMVwxMTdcMVwxNTFcMVwxNjUiKworICAgICAgICAiXDFcMTYyXDFcdWZmZmZcMVwxNDVcMVwxNTZcMVwxNDNcMVwxNTBcMVw1NVwxXDE0NlwxXDE1MVwxXDE0NFwxIisKKyAgICAgICAgIlwxNzJcMVwxNDFcMVwxNjJcMVwxNDJcMVwxNTRcMVwxNjNcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE1NCIrCisgICAgICAgICJcMVwxNzJcMlwxNDVcMVwxNjdcMVwxNTZcMVwxNjFcMVwxNDVcMVwxNTdcMVwxNzJcMVwxNDVcMVwxNDdcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjRcMVwxNTZcMVwxNDVcMVwxNjJcMVwxNDVcMVwxNzJcMVwxNjJcMVx1ZmZmZlwxXDE1MVwxXDE0NVwxIisKKyAgICAgICAgIlwxNzJcMVwxNTVcMVw0MFwxXDE0NVwxXDE2MlwxXDE1MVwxXDE2NVwxXDE1NVwxXDE0NVwxXDE1NFwxXDE0NCIrCisgICAgICAgICJcMVwxNjJcMVx1ZmZmZlwxXDE0NVwxXDE2NFwxXDE0MVwxXDE3MlwxXDE0NVwxXHVmZmZmXDFcMTYyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNDFcMVwxNzJcMVwxNDVcMVwxNTBcMVwxNTRcMlwxNzJcMVwxNjBcMSIrCisgICAgICAgICJcMTY2XDFcMTYyXDFcNTVcMVwxNDVcMlwxNjJcMVwxNDFcMVwxNjRcMlwxNzJcMVwxNTFcMVwxNDVcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxNDdcMVwxNDVcMVwxNjZcMVwxNTZcMVx1ZmZmZlwxXDE2MlwxXDE0MVwxXDE1NlwxXDE2NFwxXDE3MlwxIisKKyAgICAgICAgIlwxNDNcMVwxNDFcMVx1ZmZmZlwxXDE0NVwxXDE2MFwxXDE1NlwxXDE2M1wxXHVmZmZmXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNjJcMVwxNzFcMVwxNzJcMVx1ZmZmZlwxXDE1NFwyXDE3MlwxXDE1NiIrCisgICAgICAgICJcMVwxNzJcMVwxNjRcMVwxNTZcMVwxNTVcMVwxNTdcMVx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTcyXDFcMTU2XDFcMTY1XDFcMTYwXDFcMTY1XDFcMTcyXDFcMTQ3XDFcMTQzXDFcMTQxXDJcdWZmZmZcMSIrCisgICAgICAgICJcMTU2XDFcMTY0XDFcMTQyXDJcMTcyXDFcMTY0XDFcMTUwXDFcMTYyXDFcdWZmZmZcMVwxNzJcMVwxNTZcMVwxNzIiKworICAgICAgICAiXDFcMTQ2XDFcdWZmZmZcMVwxNjJcMVwxNDRcMVwxNDFcMVw1NVwxXDE0NlwxXDE3MlwxXHVmZmZmXDFcMTU3IisKKyAgICAgICAgIlwxXDE1NFwxXHVmZmZmXDFcMTQxXDFcdWZmZmZcM1wxNzJcMVwxNjRcMVwxNjVcMVwxNjRcMVwxNTVcMVx1ZmZmZiIrCisgICAgICAgICJcMlwxNjJcMVwxNzJcMVwxNDdcMVwxNzJcMVwxNjRcMVwxNjJcMVwxNDVcM1wxNTZcMlx1ZmZmZlwxXDE0MVwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE0NFwxXDE1MVwyXDE1NFwxXDE1MVwxXDE0NFwyXDE0NVwxXDE1NlwxXDE0N1wxXDE0NVwxXDE0NyIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE2NFwxXDE1NVwxXDE2MlwxXHVmZmZmXDFcMTU0XDFcdWZmZmZcMVwxNjJcMVwxNjRcMVwxNDEiKworICAgICAgICAiXDJcdWZmZmZcMVwxNzJcMVwxNDVcMVwxNDFcMVx1ZmZmZlwxXDE3MlwxXDE2NFwxXDE2NlwxXDE1NlwxXDE3MiIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE0M1wxXDE3MlwxXDE0NVwxXDE1NVwxXDE2NVwxXHVmZmZmXDFcMTQ3XDFcMTY0XDFcMTUxIisKKyAgICAgICAgIlwxXDE2NFwxXDU1XDFcdWZmZmZcMVwxNDFcMVwxNjJcMVwxNTZcMVwxNjNcMVwxNDFcMVwxNjNcMVwxNTFcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNjRcMVx1ZmZmZlwyXDE3MlwxXHVmZmZmXDFcMTcxXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNjNcMVx1ZmZmZlwxXDE3MlwxXDE0M1wxXDE3MlwxXDE1NFwxXDE3MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcNTVcMVwxNTVcMVwxNDFcMVwxNTVcMVwxNzJcMVx1ZmZmZlwyXDE3MlwxXDE2NFwxXDExNFwxXDE1NFwxIisKKyAgICAgICAgIlwxNjRcM1x1ZmZmZlwxXDE1MVwxXDE3MlwxXDE1N1wxXHVmZmZmXDFcMTQ3XDFcdWZmZmZcMVwxNzJcMVwxNDciKworICAgICAgICAiXDFcMTYzXDFcMTYyXDFcMTYwXDFcMTU3XDFcdWZmZmZcMVwxNTRcMVwxNTFcMVwxNjRcM1x1ZmZmZlwxXDE0MSIrCisgICAgICAgICJcMVwxNDVcMVwxNzJcMVwxNTVcMVw1NVwxXDE1N1wxXDE0MVwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzIiKworICAgICAgICAiXDFcMTUxXDJcMTcyXDFcMTQ3XDFcMTYzXDFcMTYyXDFcMTcyXDFcMTQyXDFcMTcyXDFcMTY0XDFcMTQzXDNcMTcyIisKKyAgICAgICAgIlwyXDE0MVwxXDE3MFwxXDE0NVwzXHVmZmZmXDFcMTQxXDRcMTcyXDFcMTQyXDFcdWZmZmZcMVwxNzJcMVwxNTQiKworICAgICAgICAiXDFcdWZmZmZcMVwxNzJcMVwxNDFcMVwxNDNcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTcyXDFcMTYwXDFcMTU1IisKKyAgICAgICAgIlwxXDU1XDFcMTcxXDFcMTY0XDFcMTcyXDFcdWZmZmZcMVwxNjBcMVwxNDdcMVwxNjNcMVwxNzJcMVwxNTRcMSIrCisgICAgICAgICJcMTcyXDFcMTU3XDFcMTQ1XDJcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE2MFwxXHVmZmZmXDFcMTcxXDFcdWZmZmYiKworICAgICAgICAiXDFcMTU3XDJcdWZmZmZcMVwxNjRcMVwxNzJcMVwxNDNcMVwxNzJcM1x1ZmZmZlwyXDE1MVwxXDE0MVwxXDE0NSIrCisgICAgICAgICJcMVwxNTFcMVwxNDZcMVx1ZmZmZlwxXDE1NlwxXDE3MlwxXHVmZmZmXDFcMTUxXDJcMTcyXDFcMTQxXDFcMTYyIisKKyAgICAgICAgIlwxXDE1N1wxXDE0N1wxXDE0NVwxXDE2NFwxXDE3MlwxXHVmZmZmXDFcMTQxXDFcMTY0XDFcMTY1XDFcMTYyXDIiKworICAgICAgICAiXHVmZmZmXDFcMTU2XDJcdWZmZmZcMVw1NVwxXDE3MlwxXDE2NFwxXHVmZmZmXDJcMTQ1XDFcMTU3XDFcMTcyIisKKyAgICAgICAgIlwxXHVmZmZmXDJcMTcyXDNcdWZmZmZcM1wxNjRcMVwxNzJcMVwxNjRcNFx1ZmZmZlwxXDE0NVwxXHVmZmZmXDEiKworICAgICAgICAiXDU1XDFcdWZmZmZcMVwxNTRcMVwxNDVcMlx1ZmZmZlwxXDE1NFwxXDE0MlwxXDE2NFwyXDE3MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwxXDE1MVwxXDE3MlwxXHVmZmZmXDFcMTAzXDFcdWZmZmZcMVwxNTZcMVwxNjJcMVx1ZmZmZlwxXDE0MSIrCisgICAgICAgICJcMVwxNzJcMVwxNjJcNVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTU2XDFcMTYyXDFcMTYzXDFcMTcyXDFcMTY0IisKKyAgICAgICAgIlwyXDE1MVwxXHVmZmZmXDFcMTU2XDJcdWZmZmZcMVwxNDdcMVwxNTVcMVwxNjJcMVwxNTZcMVwxNzJcMVwxNTEiKworICAgICAgICAiXDFcdWZmZmZcMVwxNjJcNFx1ZmZmZlwxXDE1NlwyXDE0N1wxXDE2M1wxXHVmZmZmXDFcMTcyXDFcMTQ0XDFcMTQxIisKKyAgICAgICAgIlwxXDE1N1wzXHVmZmZmXDJcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNTRcMVx1ZmZmZlwxXDE2M1wxXDE1NyIrCisgICAgICAgICJcMVwxNDFcMVwxNDVcNlx1ZmZmZlwxXDE3MlwxXDE1NlwxXHVmZmZmXDFcMTYzXDJcMTcyXDFcMTU2XDFcdWZmZmYiKworICAgICAgICAiXDJcMTcyXDFcMTQ3XDFcMTYzXDFcMTY0XDFcdWZmZmZcMVwxNTRcMVwxNDNcMlwxNzJcMVwxNDVcMVwxNjNcMiIrCisgICAgICAgICJcMTcyXDFcdWZmZmZcMVwxNTdcMVwxNDdcMVwxNDRcMVwxNTFcMVwxNzJcM1x1ZmZmZlwxXDQwXDFcMTQ0XDEiKworICAgICAgICAiXDE2NFwyXDE3MlwxXHVmZmZmXDFcMTQ1XDJcMTcyXDFcMTQ2XDFcMTY0XDFcMTYyXDFcdWZmZmZcMVwxNzJcMSIrCisgICAgICAgICJcMTYzXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwyXHVmZmZmXDFcMTcyXDFcMTY0XDFcMTcyXDFcMTQ1IisKKyAgICAgICAgIlwxXDE3MlwxXDE0NVwxXHVmZmZmXDFcNTVcMVwxNzJcMlx1ZmZmZlwxXDE1NlwxXDE1MVwxXDE0M1wxXDE1NiIrCisgICAgICAgICJcMlx1ZmZmZlwyXDE0NVwyXHVmZmZmXDFcMTQ0XDJcdWZmZmZcMVwxNzJcMVwxNDVcMVw1NVwxXHVmZmZmXDEiKworICAgICAgICAiXDEyNVwzXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE0NFwzXHVmZmZmXDFcMTcyXDFcMTU2IisKKyAgICAgICAgIlwxXDE1N1wxXDE3MlwyXDE2MlwxXDE3MlwxXHVmZmZmXDFcMTcyXDJcdWZmZmZcMVwxMjJcMlx1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE3MlwxXDE1NFwxXHVmZmZmXDJcMTcyXDJcdWZmZmZcMVwxMTFcMlx1ZmZmZlwxXDE1N1wyIisKKyAgICAgICAgIlx1ZmZmZlwxXDE3MlwxXDE2MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfYWNjZXB0UyA9CisgICAgICAgICJcMlx1ZmZmZlwxXDJcM1x1ZmZmZlwxXDZcMTZcdWZmZmZcMVwxMzVcMVwxMzZcM1x1ZmZmZlwxXDE1N1wxXDE2MCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE2MlwxXDE2M1wxXDE2NFwxMlx1ZmZmZlwxXHUwMDk0XDVcdWZmZmZcMVx1MDBmNlwyXHUwMGY3IisKKyAgICAgICAgIlwxXHUwMGZhXDFcdTAwZmJcMTBcdWZmZmZcMVx1MDBmNlwxXDJcMTNcdWZmZmZcMVw2XDExMlx1ZmZmZlwxXDEzNSIrCisgICAgICAgICJcMVwxMzZcMVwxNjZcMVx1MDA4NFwxXHUwMDkwXDFcMTQyXDFcdWZmZmZcMVwxNTVcMVwxNjdcMVx1MDA4YlwxIisKKyAgICAgICAgIlwxNTZcMVwxNTdcMVwxNjBcMVx1ZmZmZlwxXHUwMDg3XDFcMTYxXDFcMTYyXDFcMTYzXDFcMTY0XDFcMTY1XDEiKworICAgICAgICAiXHUwMDhmXDFcdTAwOGFcMVwxNzBcMVx1MDBmOFwxXHUwMGY5XDFcdTAwOGNcMVwxNzFcMVx1MDA4ZFwxXHUwMDg4IisKKyAgICAgICAgIlwxXDE3MlwxXDE3NFwxXDE3M1wxXDE3NVwxXHUwMDkzXDFcMTc2XDFcdTAwYWZcMVx1ZmZmZlwxXHUwMDhlXDEiKworICAgICAgICAiXHUwMDg5XDFcdTAwOTJcMVx1MDBhZVwxXHUwMDkxXDFcdTAwOThcMVx1MDA5NFwyXHVmZmZmXDFcdTAwZjNcMSIrCisgICAgICAgICJcdWZmZmZcMVx1MDBmNFwxXHUwMGY1XDFcdTAwZjdcMVx1MDBmYVw1XHVmZmZmXDFcdTAwYjJcMVx1MDBiNFwxIisKKyAgICAgICAgIlx1MDBiN1wxMlx1ZmZmZlwxXHUwMGI2XDJcdWZmZmZcMVx1MDBiNVwyMlx1ZmZmZlwxXHUwMGIxXDRcdWZmZmYiKworICAgICAgICAiXDFcdTAwYjBcNDJcdWZmZmZcMVwxMzJcMVwxMzRcNVx1ZmZmZlwxXDI2XDFcMTE2XDI1XHVmZmZmXDFcdTAwOWQiKworICAgICAgICAiXDNcdWZmZmZcMVwxMDZcMlx1ZmZmZlwxXHUwMGI4XDFcdTAwYjlcMVx1MDBiYVwyXHVmZmZmXDFcNjJcMVwxMzciKworICAgICAgICAiXDI2XHVmZmZmXDFcdTAwOTVcMVx1ZmZmZlwxXHUwMDg1XDFcdTAwODZcMVx1MDA4MVwxXDE3N1wxXHUwMDgyIisKKyAgICAgICAgIlwxXHUwMDgwXDEyXHVmZmZmXDFcdTAwZDFcMTNcdWZmZmZcMVx1MDA5Ylw0MFx1ZmZmZlwxXHUwMGQ0XDIwXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMGFhXDE1XHVmZmZmXDFcdTAwZGNcN1x1ZmZmZlwxXDEwN1wxNlx1ZmZmZlwxXDEyMFw1XHVmZmZmXDEiKworICAgICAgICAiXHUwMGJlXDFcdWZmZmZcMVx1MDBmMVwyXHVmZmZmXDFcdTAwYTNcMjRcdWZmZmZcMVx1MDA5ZVwxXHUwMDlmIisKKyAgICAgICAgIlw0XHVmZmZmXDFcMTI1XDdcdWZmZmZcMVx1MDBjN1w0XHVmZmZmXDFcdTAwOTZcMVx1ZmZmZlwxXDVcMlx1ZmZmZiIrCisgICAgICAgICJcMVwzMlwzXHVmZmZmXDFcNzVcMTFcdWZmZmZcMVwxMTBcMVx1ZmZmZlwxXHUwMDlhXDFcdWZmZmZcMVx1MDBmMCIrCisgICAgICAgICJcMTFcdWZmZmZcMVx1MDBlZVwxXDM2XDEwXHVmZmZmXDFcdTAwYzVcNFx1ZmZmZlwxXDE2XDZcdWZmZmZcMVx1MDBhNSIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE1MVwxXHVmZmZmXDFcNzBcN1x1ZmZmZlwxXDM1XDEzXHVmZmZmXDFcNjdcMVw2NlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MFwxNFx1ZmZmZlwxXDYxXDNcdWZmZmZcMVx1MDBhNlwxXHVmZmZmXDFcdTAwZTBcM1x1ZmZmZlwxXHUwMGQwIisKKyAgICAgICAgIlwxXDEwNVwzXHVmZmZmXDFcdTAwZGVcNVx1ZmZmZlwxXHUwMGIzXDFcMTQ0XDVcdWZmZmZcMVx1MDBlZFw1XHVmZmZmIisKKyAgICAgICAgIlwxXDE1MFw3XHVmZmZmXDFcdTAwZjJcMVx1ZmZmZlwxXDExXDJcdWZmZmZcMVx1MDBhNFwxXHVmZmZmXDFcdTAwY2MiKworICAgICAgICAiXDFcdWZmZmZcMVwyNFwxXHVmZmZmXDFcdTAwZDJcNVx1ZmZmZlwxXHUwMGFkXDFcdWZmZmZcMVwxM1w1XHVmZmZmIisKKyAgICAgICAgIlwxXDM3XDZcdWZmZmZcMVx1MDBhMlwxXHUwMGVmXDFcMTUzXDNcdWZmZmZcMVx1MDBjNlwxXHVmZmZmXDFcdTAwZTEiKworICAgICAgICAiXDZcdWZmZmZcMVwxNDVcM1x1ZmZmZlwxXDEzM1wxXDExMlwxXHUwMGE4XDdcdWZmZmZcMVx1MDBjOVwxXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMGU2XDIzXHVmZmZmXDFcdTAwYmJcMVx1MDBiY1wxXHUwMGJkXDZcdWZmZmZcMVwxMTVcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxMjFcM1x1ZmZmZlwxXHUwMGU3XDFcdWZmZmZcMVx1MDA5Y1w3XHVmZmZmXDFcM1wxMFx1ZmZmZlwxXDEwMyIrCisgICAgICAgICJcMVwzNFwxXHVmZmZmXDFcMTBcMVx1ZmZmZlwxXHUwMGRhXDFcdWZmZmZcMVx1MDBjZlwxXHVmZmZmXDFcdTAwYzgiKworICAgICAgICAiXDFcMTJcNFx1ZmZmZlwxXDE0XDFcMTQxXDFcdTAwYTBcNlx1ZmZmZlwxXHUwMDk3XDJcdWZmZmZcMVx1MDBhNyIrCisgICAgICAgICJcMTJcdWZmZmZcMVx1MDBlOFw0XHVmZmZmXDFcdTAwZGJcMVw2M1wxXHVmZmZmXDFcMTI3XDFcdTAwYTlcM1x1ZmZmZiIrCisgICAgICAgICJcMVx1MDBlM1w0XHVmZmZmXDFcMTAyXDJcdWZmZmZcMVx1MDBlMlwxXHUwMGU0XDFcdTAwZDlcNVx1ZmZmZlwxIisKKyAgICAgICAgIlw2NFwxXHUwMGMxXDFcNzdcMVwxMDFcMVx1ZmZmZlwxXHUwMGU1XDFcdWZmZmZcMVwxNTRcMlx1ZmZmZlwxXHUwMGMyIisKKyAgICAgICAgIlwxXDFcNVx1ZmZmZlwxXHUwMGNkXDNcdWZmZmZcMVwxMjRcMVx1ZmZmZlwxXDMzXDJcdWZmZmZcMVx1MDBhYiIrCisgICAgICAgICJcM1x1ZmZmZlwxXDU1XDFcNTZcMVw1N1wxXDYwXDFcdTAwZDdcMVx1ZmZmZlwxXHUwMGQ2XDdcdWZmZmZcMVx1MDBkZCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDMxXDFcNzJcNlx1ZmZmZlwxXHUwMGMzXDFcdWZmZmZcMVw0NVwxXDQ2XDFcNDdcMVw1MFw0IisKKyAgICAgICAgIlx1ZmZmZlwxXDI1XDRcdWZmZmZcMVwxMTdcMVx1MDA5OVwxXDEyNlwzXHVmZmZmXDFcdTAwZDVcMlx1ZmZmZiIrCisgICAgICAgICJcMVx1MDBjYlw0XHVmZmZmXDFcNTFcMVw1MlwxXDUzXDFcNTRcMVwxMzBcMVx1MDBiZlwyXHVmZmZmXDFcMjciKworICAgICAgICAiXDRcdWZmZmZcMVw2NVw1XHVmZmZmXDFcMTQ2XDEwXHVmZmZmXDFcNzZcNVx1ZmZmZlwxXHUwMGQzXDFcdTAwZDgiKworICAgICAgICAiXDFcNzNcNVx1ZmZmZlwxXDE1Mlw2XHVmZmZmXDFcdTAwYzBcMlx1ZmZmZlwxXHUwMGExXDFcdWZmZmZcMVw0MCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE0M1wxXHUwMGM0XDZcdWZmZmZcMVwyMFwyXHVmZmZmXDFcNDNcMVw0NFw0XHVmZmZmXDEiKworICAgICAgICAiXDc0XDFcNzFcMlx1ZmZmZlwxXDQyXDFcMTMxXDFcdWZmZmZcMVwxMjNcMVwxMjJcM1x1ZmZmZlwxXDIxXDFcdWZmZmYiKworICAgICAgICAiXDFcN1wxXDExMVwxXHUwMGRmXDFcdWZmZmZcMVwxMDRcMVx1ZmZmZlwxXHUwMGNlXDFcdWZmZmZcMVx1MDBlYyIrCisgICAgICAgICJcMVx1MDBlYVwxXDMwXDdcdWZmZmZcMVx1MDA4M1wxXHVmZmZmXDFcdTAwZWJcMVx1MDBlOVwxXHVmZmZmXDEiKworICAgICAgICAiXDEwMFwxXDE0N1wxXHVmZmZmXDFcMTdcMlx1ZmZmZlwxXDIzXDJcdWZmZmZcMVx1MDBjYVwxXDE1XDFcdWZmZmYiKworICAgICAgICAiXDFcdTAwYWNcMVwyMlwxXHVmZmZmXDFcMTEzXDFcMTE0XDJcdWZmZmZcMVw0XDFcdWZmZmZcMVw0MSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9zcGVjaWFsUyA9CisgICAgICAgICJcMVwwXHUwNDFjXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyMV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMTFcNjRcMlw2M1wyXDY0XDFcNjNcMjJcNjRcMVw2M1wxXDQ3XDFcNjFcMVwzNVwxXDYwXDFcNDJcMSIrCisgICAgICAgICAgICAiXDQ2XDFcNjJcMVwyNVwxXDI2XDFcMzFcMVw0MFwxXDMzXDFcMjdcMVwzMFwxXDQxXDFcNTVcMTFcNTYiKworICAgICAgICAgICAgIlwxXDUxXDFcNTJcMVw0M1wxXDM0XDFcNDRcMVw1MFwxXDMyXDMyXDYwXDFcMzZcMVw2NFwxXDM3XDFcNTciKworICAgICAgICAgICAgIlwxXDYwXDFcNjRcMVwxN1wxXDE0XDFcN1wxXDE2XDFcNFwxXDVcMVwyM1wxXDIyXDFcMjRcMlw2MFwxIisKKyAgICAgICAgICAgICJcM1wxXDEwXDFcMjFcMVwxM1wxXDFcMVw2MFwxXDE1XDFcMTFcMVwxMlwxXDIwXDFcNTRcMVw1M1wzXDYwIisKKyAgICAgICAgICAgICJcMVwyXDFcNDVcMVw2XHVmZjgyXDY0IiwKKyAgICAgICAgICAgICJcMVw2NVwxXHVmZmZmXDFcNzBcMVw3NFwxXDczXDExXHVmZmZmXDFcNzJcMlx1ZmZmZlwxXDY2XDEiKworICAgICAgICAgICAgIlx1ZmZmZlwxXDY3XDNcdWZmZmZcMVw3MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3N1wzXHVmZmZmXDFcMTAwXDNcdWZmZmZcMVwxMDFcNVx1ZmZmZlwxXDEwMiIsCisgICAgICAgICAgICAiXDFcMTA0XDFcMTA1XDEyXHVmZmZmXDFcMTAzIiwKKyAgICAgICAgICAgICJcMVwxMTBcN1x1ZmZmZlwxXDExMVw1XHVmZmZmXDFcMTA3XDJcdWZmZmZcMVwxMDYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTE2XDNcdWZmZmZcMVwxMTVcNlx1ZmZmZlwxXDEyMFwxXDExN1wxXHVmZmZmXDFcMTEzXDVcdWZmZmYiKworICAgICAgICAgICAgIlwxXDExNCIsCisgICAgICAgICAgICAiXDFcMTIyXDNcdWZmZmZcMVwxMjFcM1x1ZmZmZlwxXDEyNVwzXHVmZmZmXDFcMTIzXDFcdWZmZmZcMSIrCisgICAgICAgICAgICAiXDEyNCIsCisgICAgICAgICAgICAiXDFcMTM1XDFcdWZmZmZcMVwxMzJcMVx1ZmZmZlwxXDEzNlwyXHVmZmZmXDFcMTMwXDFcMTI3XDJcdWZmZmYiKworICAgICAgICAgICAgIlwxXDEzN1wyXHVmZmZmXDFcMTQwXDRcdWZmZmZcMVwxMjZcMVwxMzFcMVx1ZmZmZlwxXDEzM1wxXHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxMzQiLAorICAgICAgICAgICAgIlwxXDE0NlwzXHVmZmZmXDFcMTQ0XDJcdWZmZmZcMVwxNDdcMVwxNDVcNVx1ZmZmZlwxXDE0MlwyXHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxNDNcNlx1ZmZmZlwxXDE0MSIsCisgICAgICAgICAgICAiXDFcMTUzXDNcdWZmZmZcMVwxNTJcN1x1ZmZmZlwxXDE1MVwzXHVmZmZmXDFcMTUwXDJcdWZmZmZcMSIrCisgICAgICAgICAgICAiXDE1NCIsCisgICAgICAgICAgICAiXDFcMTU3XDE1XHVmZmZmXDFcMTU1XDExXHVmZmZmXDFcMTU2IiwKKyAgICAgICAgICAgICJcMVwxNjFcM1x1ZmZmZlwxXDE2MFw1XHVmZmZmXDFcMTYyXDVcdWZmZmZcMVwxNjMiLAorICAgICAgICAgICAgIlwxXDE2NFwzXHVmZmZmXDFcMTY1XDNcdWZmZmZcMVwxNzBcNVx1ZmZmZlwxXDE2N1wxMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTY2IiwKKyAgICAgICAgICAgICJcMVwxNzZcMVwxNzVcMVwxNzdcNjFcdWZmZmZcMVwxNzNcNFx1ZmZmZlwxXDE3MVw2XHVmZmZmXDEiKworICAgICAgICAgICAgIlwxNzJcMVx1ZmZmZlwxXDE3NFwxXHUwMDgwIiwKKyAgICAgICAgICAgICJcMVx1MDA4Mlw0XHVmZmZmXDFcdTAwODVcMVx1MDA4MVwxXHUwMDgzXDFcdWZmZmZcMVx1MDA4NlwxIisKKyAgICAgICAgICAgICJcdTAwODQiLAorICAgICAgICAgICAgIlwxXHUwMDg4XDExXHVmZmZmXDFcdTAwODlcNVx1ZmZmZlwxXHUwMDg3IiwKKyAgICAgICAgICAgICJcMVx1MDA4YVwzXHVmZmZmXDFcdTAwOGJcMTJcdWZmZmZcMVx1MDA4YyIsCisgICAgICAgICAgICAiXDFcdTAwOGVcMTFcdWZmZmZcMVx1MDA4ZlwyXHVmZmZmXDFcdTAwOGQiLAorICAgICAgICAgICAgIlwxXHUwMDkyXDJcdWZmZmZcMVx1MDA5M1w2XHVmZmZmXDFcdTAwOTBcMVx1MDA5MVw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDA5NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDk5XDE3XHVmZmZmXDFcdTAwOTdcMVx1MDA5OCIsCisgICAgICAgICAgICAiXDFcdTAwOWIiLAorICAgICAgICAgICAgIlwxXHUwMDllXDIyXHVmZmZmXDFcdTAwOWQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhMlwxXHUwMGEzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhOVwyMVx1ZmZmZlwxXHUwMGE4IiwKKyAgICAgICAgICAgICJcMVx1MDBhY1w0XHVmZmZmXDFcdTAwYWRcMTVcdWZmZmZcMVx1MDBhYiIsCisgICAgICAgICAgICAiXDFcdTAwYWYiLAorICAgICAgICAgICAgIlwxXHUwMGIxIiwKKyAgICAgICAgICAgICJcMVx1MDBiMyIsCisgICAgICAgICAgICAiXDFcdTAwYjUiLAorICAgICAgICAgICAgIlwxXHUwMGI3IiwKKyAgICAgICAgICAgICJcMVx1MDBiOSIsCisgICAgICAgICAgICAiXDFcdTAwYmNcMTNcdWZmZmZcMVx1MDBiYiIsCisgICAgICAgICAgICAiXDFcdTAwYmUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYzEiLAorICAgICAgICAgICAgIlwxXHUwMGMyIiwKKyAgICAgICAgICAgICJcMTJcdTAwYzRcMTBcdWZmZmZcMVx1MDBjNlwxXHVmZmZmXDNcdTAwYzZcNVx1ZmZmZlwxXHUwMGM2IisKKyAgICAgICAgICAgICJcMTNcdWZmZmZcMVx1MDBjM1w2XHVmZmZmXDFcdTAwYzRcMlx1ZmZmZlwxXHUwMGM2XDFcdWZmZmZcMyIrCisgICAgICAgICAgICAiXHUwMGM2XDVcdWZmZmZcMVx1MDBjNlwxM1x1ZmZmZlwxXHUwMGMzIiwKKyAgICAgICAgICAgICJcMTJcdTAwYzRcMTBcdWZmZmZcMVx1MDBjNlwxXHVmZmZmXDNcdTAwYzZcNVx1ZmZmZlwxXHUwMGM2IisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDBjNFwyXHVmZmZmXDFcdTAwYzZcMVx1ZmZmZlwzXHUwMGM2XDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMGM2IiwKKyAgICAgICAgICAgICJcMVw3NVwzNFx1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGM5XDFcdTAwY2JcMlx1ZmZmZlwxXHUwMGNhXDE0XHVmZmZmXDFcdTAwY2MiLAorICAgICAgICAgICAgIlwxXHUwMGNkIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDBkMSIsCisgICAgICAgICAgICAiXDFcdTAwZDIiLAorICAgICAgICAgICAgIlwxXHUwMGQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZDVcMTNcdWZmZmZcMVx1MDBkNlwxMlx1ZmZmZlwxXHUwMGQ0IiwKKyAgICAgICAgICAgICJcMVx1MDBkNyIsCisgICAgICAgICAgICAiXDFcdTAwZDgiLAorICAgICAgICAgICAgIlwxXHUwMGQ5IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDIzIisKKyAgICAgICAgICAgICJcNzVcMVx1MDBkYVw2XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDBkYyIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcNzVcMVx1MDBkZFwzMFw3NSIsCisgICAgICAgICAgICAiXDFcdTAwZGYiLAorICAgICAgICAgICAgIlwxXHUwMGUxXDFcdTAwZTJcMlx1ZmZmZlwxXHUwMGUwIiwKKyAgICAgICAgICAgICJcMVx1MDBlNFwxXHUwMGUzIiwKKyAgICAgICAgICAgICJcMVx1MDBlNVwxXHVmZmZmXDFcdTAwZTZcMTFcdWZmZmZcMVx1MDBlNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBlOFwxXHVmZmZmXDFcdTAwZWFcNlx1ZmZmZlwxXHUwMGU5IiwKKyAgICAgICAgICAgICJcMVx1MDBlYlwxXHUwMGVjIiwKKyAgICAgICAgICAgICJcMVx1MDBlZFwxXHVmZmZmXDFcdTAwZWUiLAorICAgICAgICAgICAgIlwxXHUwMGVmXDFcdTAwZjAiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAwZjIiLAorICAgICAgICAgICAgIlwxXHUwMGYzIiwKKyAgICAgICAgICAgICJcMVx1MDBmNFw1XHVmZmZmXDFcdTAwZjUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAwZjciLAorICAgICAgICAgICAgIlwxXHUwMGY4IiwKKyAgICAgICAgICAgICJcMVx1MDBmYlwyMFx1ZmZmZlwxXHUwMGZhXDZcdWZmZmZcMVx1MDBmOSIsCisgICAgICAgICAgICAiXDFcdTAwZmMiLAorICAgICAgICAgICAgIlwxXHUwMGZkIiwKKyAgICAgICAgICAgICJcMVx1MDBmZVwxMlx1ZmZmZlwxXHUwMTAwXDJcdWZmZmZcMVx1MDBmZiIsCisgICAgICAgICAgICAiXDFcdTAxMDFcN1x1ZmZmZlwxXHUwMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTA1IiwKKyAgICAgICAgICAgICJcMVx1MDEwNiIsCisgICAgICAgICAgICAiXDFcdTAxMDciLAorICAgICAgICAgICAgIlwxXHUwMTA4IiwKKyAgICAgICAgICAgICJcMVx1MDEwOSIsCisgICAgICAgICAgICAiXDFcdTAxMGNcMVx1MDEwYVwzXHVmZmZmXDFcdTAxMGRcMlx1ZmZmZlwxXHUwMTBiIiwKKyAgICAgICAgICAgICJcMVx1MDEwZVwzXHVmZmZmXDFcdTAxMGZcMTdcdWZmZmZcMVx1MDExMFwzXHVmZmZmXDFcdTAxMTEiLAorICAgICAgICAgICAgIlwxXHUwMTEzXDEyXHVmZmZmXDFcdTAxMTIiLAorICAgICAgICAgICAgIlwxXHUwMTE0XDZcdWZmZmZcMVx1MDExNSIsCisgICAgICAgICAgICAiXDFcdTAxMTYiLAorICAgICAgICAgICAgIlwxXHUwMTE3IiwKKyAgICAgICAgICAgICJcMVx1MDExOCIsCisgICAgICAgICAgICAiXDFcdTAxMTkiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAxMWIiLAorICAgICAgICAgICAgIlwxXHUwMTFjIiwKKyAgICAgICAgICAgICJcMVx1MDExZVw1XHVmZmZmXDFcdTAxMWZcMVx1ZmZmZlwxXHUwMTFkIiwKKyAgICAgICAgICAgICJcMVw3NVwxMFx1ZmZmZlwxXHUwMTIwXDJcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVw3NVwxXHVmZmZmXDMyXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDEyMlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVx1MDEyNlwyXHVmZmZmXDFcdTAxMjRcMTNcdWZmZmZcMVx1MDEyNSIsCisgICAgICAgICAgICAiXDFcdTAxMjhcMVx1ZmZmZlwxXHUwMTI3XDJcdWZmZmZcMVx1MDEyOVwxXHUwMTJhIiwKKyAgICAgICAgICAgICJcMVx1MDEyYiIsCisgICAgICAgICAgICAiXDFcdTAxMmMiLAorICAgICAgICAgICAgIlwxXHUwMTJkXDFcdTAxMzBcMVx1MDEyZVw0XHVmZmZmXDFcdTAxMmYiLAorICAgICAgICAgICAgIlwxXHUwMTMzXDE0XHVmZmZmXDFcdTAxMzFcMVx1MDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxMzQiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMjMiKworICAgICAgICAgICAgIlw3NVwxXHUwMTM1XDFcdTAxMzZcNVw3NSIsCisgICAgICAgICAgICAiXDFcdTAxMzgiLAorICAgICAgICAgICAgIlwxXHUwMTNhXDdcdWZmZmZcMVx1MDEzOSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDEzYyIsCisgICAgICAgICAgICAiXDFcdTAxM2QiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMTQxIiwKKyAgICAgICAgICAgICJcMVx1MDE0MiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDE0NCIsCisgICAgICAgICAgICAiXDFcdTAxNDUiLAorICAgICAgICAgICAgIlwxXHUwMTQ2IiwKKyAgICAgICAgICAgICJcMVx1MDE0NyIsCisgICAgICAgICAgICAiXDFcdTAxNDlcMVx1MDE0OCIsCisgICAgICAgICAgICAiXDFcdTAxNGEiLAorICAgICAgICAgICAgIlwxXHUwMTRjXDNcdWZmZmZcMVx1MDE0YiIsCisgICAgICAgICAgICAiXDFcdTAxNGRcN1x1ZmZmZlwxXHUwMTRlIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZiIsCisgICAgICAgICAgICAiXDFcdTAxNTAiLAorICAgICAgICAgICAgIlwxXHUwMTUxXDVcdWZmZmZcMVx1MDE1MiIsCisgICAgICAgICAgICAiXDFcdTAxNTMiLAorICAgICAgICAgICAgIlwxXHUwMTU0IiwKKyAgICAgICAgICAgICJcMVx1MDE1NVwxNlx1ZmZmZlwxXHUwMTU2IiwKKyAgICAgICAgICAgICJcMVx1MDE1OVwxN1x1ZmZmZlwxXHUwMTU4XDFcdTAxNTciLAorICAgICAgICAgICAgIlwxXHUwMTVhIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMTVjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjMiLAorICAgICAgICAgICAgIlwxXHUwMTY1XDVcdWZmZmZcMVx1MDE2NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMTJcdTAwYzRcMTBcdWZmZmZcMVx1MDBjNlwxXHVmZmZmXDNcdTAwYzZcNVx1ZmZmZlwxXHUwMGM2IisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDBjNFwyXHVmZmZmXDFcdTAwYzZcMVx1ZmZmZlwzXHUwMGM2XDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMGM2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTY2IiwKKyAgICAgICAgICAgICJcMVx1MDE2NyIsCisgICAgICAgICAgICAiXDFcdTAxNjgiLAorICAgICAgICAgICAgIlwxXHUwMTY5IiwKKyAgICAgICAgICAgICJcMVx1MDE2YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNmIiLAorICAgICAgICAgICAgIlwxXHUwMTZjIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMTZlIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZiIsCisgICAgICAgICAgICAiXDFcdTAxNzAiLAorICAgICAgICAgICAgIlwxXHUwMTcxIiwKKyAgICAgICAgICAgICJcMVx1MDE3MiIsCisgICAgICAgICAgICAiXDFcdTAxNzMiLAorICAgICAgICAgICAgIlwxXHUwMTc0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICJcMVx1MDE3NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3NyIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwxNCIrCisgICAgICAgICAgICAiXDc1XDFcdTAxNzhcMTVcNzUiLAorICAgICAgICAgICAgIlwxXHUwMTdhIiwKKyAgICAgICAgICAgICJcMVx1MDE3YiIsCisgICAgICAgICAgICAiXDFcdTAxN2MiLAorICAgICAgICAgICAgIlwxXHUwMTdkIiwKKyAgICAgICAgICAgICJcMVx1MDE3ZSIsCisgICAgICAgICAgICAiXDFcdTAxN2YiLAorICAgICAgICAgICAgIlwxXHUwMTgwIiwKKyAgICAgICAgICAgICJcMVx1MDE4MVw1XHVmZmZmXDFcdTAxODIiLAorICAgICAgICAgICAgIlwxXHUwMTgzIiwKKyAgICAgICAgICAgICJcMVx1MDE4NCIsCisgICAgICAgICAgICAiXDFcdTAxODUiLAorICAgICAgICAgICAgIlwxXHUwMTg2IiwKKyAgICAgICAgICAgICJcMVx1MDE4NyIsCisgICAgICAgICAgICAiXDFcdTAxODgiLAorICAgICAgICAgICAgIlwxXHUwMTg5IiwKKyAgICAgICAgICAgICJcMVx1MDE4YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4YiIsCisgICAgICAgICAgICAiXDFcdTAxOGMiLAorICAgICAgICAgICAgIlwxXHUwMThkIiwKKyAgICAgICAgICAgICJcMVx1MDE4ZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4ZiIsCisgICAgICAgICAgICAiXDFcdTAxOTAiLAorICAgICAgICAgICAgIlwxXHUwMTkxIiwKKyAgICAgICAgICAgICJcMVx1MDE5MiIsCisgICAgICAgICAgICAiXDFcdTAxOTRcMTRcdWZmZmZcMVx1MDE5MyIsCisgICAgICAgICAgICAiXDFcdTAxOTUiLAorICAgICAgICAgICAgIlwxXHUwMTk2IiwKKyAgICAgICAgICAgICJcMVx1MDE5OFwxXHUwMTk3IiwKKyAgICAgICAgICAgICJcMVx1MDE5OSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDE5YiIsCisgICAgICAgICAgICAiXDFcdTAxOWMiLAorICAgICAgICAgICAgIlwxXHUwMTlkIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZSIsCisgICAgICAgICAgICAiXDFcdTAxOWYiLAorICAgICAgICAgICAgIlwxXHUwMWEwIiwKKyAgICAgICAgICAgICJcMVx1MDFhMSIsCisgICAgICAgICAgICAiXDFcdTAxYTIiLAorICAgICAgICAgICAgIlwxXHUwMWEzIiwKKyAgICAgICAgICAgICJcMVx1MDFhNCIsCisgICAgICAgICAgICAiXDFcdTAxYTUiLAorICAgICAgICAgICAgIlwxXHUwMWE2IiwKKyAgICAgICAgICAgICJcMVx1MDFhNyIsCisgICAgICAgICAgICAiXDFcdTAxYTgiLAorICAgICAgICAgICAgIlwxXHUwMWE5IiwKKyAgICAgICAgICAgICJcMVx1MDFhYSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDFhYyIsCisgICAgICAgICAgICAiXDFcdTAxYWQiLAorICAgICAgICAgICAgIlwxXHUwMWFlIiwKKyAgICAgICAgICAgICJcMVx1MDFhZiIsCisgICAgICAgICAgICAiXDFcdTAxYjAiLAorICAgICAgICAgICAgIlwxXHUwMWIxIiwKKyAgICAgICAgICAgICJcMVx1MDFiMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWIzIiwKKyAgICAgICAgICAgICJcMVx1MDFiNCIsCisgICAgICAgICAgICAiXDFcdTAxYjUiLAorICAgICAgICAgICAgIlwxXHUwMWI2IiwKKyAgICAgICAgICAgICJcMVx1MDFiNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWI4IiwKKyAgICAgICAgICAgICJcMVx1MDFiOSIsCisgICAgICAgICAgICAiXDFcdTAxYmEiLAorICAgICAgICAgICAgIlwxXHUwMWJiIiwKKyAgICAgICAgICAgICJcMVx1MDFiYyIsCisgICAgICAgICAgICAiXDFcdTAxYmQiLAorICAgICAgICAgICAgIlwxXHUwMWJlIiwKKyAgICAgICAgICAgICJcMVx1MDFiZiIsCisgICAgICAgICAgICAiXDFcdTAxYzAiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAxYzIiLAorICAgICAgICAgICAgIlwxXHUwMWMzIiwKKyAgICAgICAgICAgICJcMVx1MDFjNVwzXHVmZmZmXDFcdTAxYzQiLAorICAgICAgICAgICAgIlwxXHUwMWM2IiwKKyAgICAgICAgICAgICJcMVx1MDFjNyIsCisgICAgICAgICAgICAiXDFcdTAxYzgiLAorICAgICAgICAgICAgIlwxXHUwMWM5IiwKKyAgICAgICAgICAgICJcMVx1MDFjYSIsCisgICAgICAgICAgICAiXDFcdTAxY2IiLAorICAgICAgICAgICAgIlwxXHUwMWNjIiwKKyAgICAgICAgICAgICJcMVx1MDFjZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFjZSIsCisgICAgICAgICAgICAiXDFcdTAxY2YiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFkMSIsCisgICAgICAgICAgICAiXDFcdTAxZDIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWQzIiwKKyAgICAgICAgICAgICJcMVx1MDFkNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWQ1XDZcdWZmZmZcMVx1MDFkNiIsCisgICAgICAgICAgICAiXDFcdTAxZDciLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAxZDkiLAorICAgICAgICAgICAgIlwxXHUwMWRhIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMWRjIiwKKyAgICAgICAgICAgICJcMVx1MDFkZCIsCisgICAgICAgICAgICAiXDFcdTAxZGUiLAorICAgICAgICAgICAgIlwxXHUwMWRmIiwKKyAgICAgICAgICAgICJcMVx1MDFlMCIsCisgICAgICAgICAgICAiXDFcdTAxZTEiLAorICAgICAgICAgICAgIlwxXHUwMWUyIiwKKyAgICAgICAgICAgICJcMVx1MDFlNFw1XHVmZmZmXDFcdTAxZTMiLAorICAgICAgICAgICAgIlwxXHUwMWU1IiwKKyAgICAgICAgICAgICJcMVx1MDFlNiIsCisgICAgICAgICAgICAiXDFcdTAxZTciLAorICAgICAgICAgICAgIlwxXHUwMWU4IiwKKyAgICAgICAgICAgICJcMVx1MDFlOSIsCisgICAgICAgICAgICAiXDFcdTAxZWJcMTZcdWZmZmZcMVx1MDFlYSIsCisgICAgICAgICAgICAiXDFcdTAxZWMiLAorICAgICAgICAgICAgIlwxXHUwMWVkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWVlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFlZiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMWYyIiwKKyAgICAgICAgICAgICJcMVx1MDFmNFwxMDZcdWZmZmZcMVx1MDFmMyIsCisgICAgICAgICAgICAiXDFcdTAxZjUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAxZjciLAorICAgICAgICAgICAgIlwxXHUwMWY4IiwKKyAgICAgICAgICAgICJcMVx1MDFmOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFmYSIsCisgICAgICAgICAgICAiXDFcdTAxZmIiLAorICAgICAgICAgICAgIlwxXHUwMWZjIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDE0IisKKyAgICAgICAgICAgICJcNzVcMVx1MDFmZFwxNVw3NSIsCisgICAgICAgICAgICAiXDFcdTAxZmYiLAorICAgICAgICAgICAgIlwxXHUwMjAwIiwKKyAgICAgICAgICAgICJcMVx1MDIwMlwzXHVmZmZmXDFcdTAyMDEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyMDQiLAorICAgICAgICAgICAgIlwxXHUwMjA1IiwKKyAgICAgICAgICAgICJcMVx1MDIwNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDIyIisKKyAgICAgICAgICAgICJcNzVcMVx1MDIwN1w3XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDIwOSIsCisgICAgICAgICAgICAiXDFcdTAyMGEiLAorICAgICAgICAgICAgIlwxXHUwMjBiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMjBkIiwKKyAgICAgICAgICAgICJcMVx1MDIwZSIsCisgICAgICAgICAgICAiXDFcdTAyMGYiLAorICAgICAgICAgICAgIlwxXHUwMjEwIiwKKyAgICAgICAgICAgICJcMVx1MDIxMSIsCisgICAgICAgICAgICAiXDFcdTAyMTIiLAorICAgICAgICAgICAgIlwxXHUwMjEzIiwKKyAgICAgICAgICAgICJcMVx1MDIxNCIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwyIisKKyAgICAgICAgICAgICJcNzVcMVx1MDIxNVwyN1w3NSIsCisgICAgICAgICAgICAiXDFcdTAyMTciLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyMTkiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyMWIiLAorICAgICAgICAgICAgIlwxXHUwMjFjIiwKKyAgICAgICAgICAgICJcMVx1MDIxZCIsCisgICAgICAgICAgICAiXDFcdTAyMWUiLAorICAgICAgICAgICAgIlwxXHUwMjFmIiwKKyAgICAgICAgICAgICJcMVx1MDIyMCIsCisgICAgICAgICAgICAiXDFcdTAyMjEiLAorICAgICAgICAgICAgIlwxXHUwMjIyIiwKKyAgICAgICAgICAgICJcMVx1MDIyMyIsCisgICAgICAgICAgICAiXDFcNzVcMTBcdWZmZmZcMVx1MDIyNFwyXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNzVcMVx1ZmZmZlwzMlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyMjYiLAorICAgICAgICAgICAgIlwxXHUwMjI3IiwKKyAgICAgICAgICAgICJcMVx1MDIyOCIsCisgICAgICAgICAgICAiXDFcdTAyMjkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMmEiLAorICAgICAgICAgICAgIlwxXHUwMjJiIiwKKyAgICAgICAgICAgICJcMVx1MDIyYyIsCisgICAgICAgICAgICAiXDFcdTAyMmQiLAorICAgICAgICAgICAgIlwxXHUwMjJlIiwKKyAgICAgICAgICAgICJcMVx1MDIyZiIsCisgICAgICAgICAgICAiXDFcdTAyMzAiLAorICAgICAgICAgICAgIlwxXHUwMjMxIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDE2IisKKyAgICAgICAgICAgICJcNzVcMVx1MDIzMlwxM1w3NSIsCisgICAgICAgICAgICAiXDFcdTAyMzQiLAorICAgICAgICAgICAgIlwxXHUwMjM1IiwKKyAgICAgICAgICAgICJcMVx1MDIzNiIsCisgICAgICAgICAgICAiXDFcdTAyMzciLAorICAgICAgICAgICAgIlwxXHUwMjM4IiwKKyAgICAgICAgICAgICJcMVx1MDIzOSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMjNjXDFcNzVcMVx1MDIzYlwyN1w3NSIsCisgICAgICAgICAgICAiXDFcdTAyM2UiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyNDAiLAorICAgICAgICAgICAgIlwxXHUwMjQxIiwKKyAgICAgICAgICAgICJcMVx1MDI0MiIsCisgICAgICAgICAgICAiXDFcdTAyNDMiLAorICAgICAgICAgICAgIlwxXHUwMjQ0IiwKKyAgICAgICAgICAgICJcMVx1MDI0NSIsCisgICAgICAgICAgICAiXDFcdTAyNDYiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyNDgiLAorICAgICAgICAgICAgIlwxXHUwMjQ5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjRhIiwKKyAgICAgICAgICAgICJcMVx1MDI0YiIsCisgICAgICAgICAgICAiXDFcdTAyNGMiLAorICAgICAgICAgICAgIlwxXHUwMjRkIiwKKyAgICAgICAgICAgICJcMVx1MDI0ZSIsCisgICAgICAgICAgICAiXDFcdTAyNGYiLAorICAgICAgICAgICAgIlwxXHUwMjUwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjUxIiwKKyAgICAgICAgICAgICJcMVx1MDI1MiIsCisgICAgICAgICAgICAiXDFcNzVcNlx1ZmZmZlwxXHUwMjUzXDRcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVw3NVwxXHVmZmZmXDMyXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDI1NSIsCisgICAgICAgICAgICAiXDFcdTAyNTYiLAorICAgICAgICAgICAgIlwxXHUwMjU3IiwKKyAgICAgICAgICAgICJcMVx1MDI1OCIsCisgICAgICAgICAgICAiXDFcdTAyNTkiLAorICAgICAgICAgICAgIlwxXHUwMjVhIiwKKyAgICAgICAgICAgICJcMVx1MDI1YiIsCisgICAgICAgICAgICAiXDFcdTAyNWMiLAorICAgICAgICAgICAgIlwxXHUwMjVkIiwKKyAgICAgICAgICAgICJcMVx1MDI1ZSIsCisgICAgICAgICAgICAiXDFcdTAyNWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNjAiLAorICAgICAgICAgICAgIlwxXHUwMjYxIiwKKyAgICAgICAgICAgICJcMVx1MDI2MiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDI2NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI2NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI2NiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjY4IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMjZhIiwKKyAgICAgICAgICAgICJcMVx1MDI2YiIsCisgICAgICAgICAgICAiXDFcdTAyNmMiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDI2ZiIsCisgICAgICAgICAgICAiXDFcdTAyNzAiLAorICAgICAgICAgICAgIlwxXHUwMjcxIiwKKyAgICAgICAgICAgICJcMVx1MDI3MiIsCisgICAgICAgICAgICAiXDFcdTAyNzMiLAorICAgICAgICAgICAgIlwxXHUwMjc0IiwKKyAgICAgICAgICAgICJcMVx1MDI3NSIsCisgICAgICAgICAgICAiXDFcdTAyNzYiLAorICAgICAgICAgICAgIlwxXHUwMjc3IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyN2EiLAorICAgICAgICAgICAgIlwxXHUwMjdiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyN2MiLAorICAgICAgICAgICAgIlwxXHUwMjdkIiwKKyAgICAgICAgICAgICJcMVx1MDI3ZVw3XHVmZmZmXDFcdTAyN2YiLAorICAgICAgICAgICAgIlwxXHUwMjgwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjgxIiwKKyAgICAgICAgICAgICJcMVx1MDI4MiIsCisgICAgICAgICAgICAiXDFcdTAyODMiLAorICAgICAgICAgICAgIlwxXHUwMjg0IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMjg2IiwKKyAgICAgICAgICAgICJcMVx1MDI4NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI4OCIsCisgICAgICAgICAgICAiXDFcdTAyODkiLAorICAgICAgICAgICAgIlwxXHUwMjhhIiwKKyAgICAgICAgICAgICJcMVx1MDI4YlwxNlx1ZmZmZlwxXHUwMjhjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI4ZSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjkwIiwKKyAgICAgICAgICAgICJcMVx1MDI5MSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjkzIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMjIiKworICAgICAgICAgICAgIlw3NVwxXHUwMjk1XDdcNzUiLAorICAgICAgICAgICAgIlwxXHUwMjk3IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMjk5IiwKKyAgICAgICAgICAgICJcMVx1MDI5YSIsCisgICAgICAgICAgICAiXDFcdTAyOWIiLAorICAgICAgICAgICAgIlwxXHUwMjljIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjlkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDIyIisKKyAgICAgICAgICAgICJcNzVcMVx1MDI5Zlw3XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDJhMSIsCisgICAgICAgICAgICAiXDFcdTAyYTIiLAorICAgICAgICAgICAgIlwxXHUwMmEzIiwKKyAgICAgICAgICAgICJcMVx1MDJhNCIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwyMiIrCisgICAgICAgICAgICAiXDc1XDFcdTAyYTVcN1w3NSIsCisgICAgICAgICAgICAiXDFcdTAyYTciLAorICAgICAgICAgICAgIlwxXHUwMmE4IiwKKyAgICAgICAgICAgICJcMVx1MDJhOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmFhIiwKKyAgICAgICAgICAgICJcMVx1MDJhYiIsCisgICAgICAgICAgICAiXDFcdTAyYWMiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTBcdWZmZmZcMVx1MDJhZVwyXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNzVcMVx1ZmZmZlwzMlw3NSIsCisgICAgICAgICAgICAiXDFcdTAyYjAiLAorICAgICAgICAgICAgIlwxXHUwMmIxIiwKKyAgICAgICAgICAgICJcMVx1MDJiMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMmI0IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMmI2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmI3IiwKKyAgICAgICAgICAgICJcMVx1MDJiOCIsCisgICAgICAgICAgICAiXDFcdTAyYjkiLAorICAgICAgICAgICAgIlwxXHUwMmJhIiwKKyAgICAgICAgICAgICJcMVx1MDJiYiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmJkIiwKKyAgICAgICAgICAgICJcMVx1MDJiZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJiZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDJjMyIsCisgICAgICAgICAgICAiXDFcdTAyYzQiLAorICAgICAgICAgICAgIlwxXHUwMmM1IiwKKyAgICAgICAgICAgICJcMVx1MDJjNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJjNyIsCisgICAgICAgICAgICAiXDFcdTAyYzgiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMTQiKworICAgICAgICAgICAgIlw3NVwxXHUwMmM5XDE1XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDJjYiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDJjZCIsCisgICAgICAgICAgICAiXDFcdTAyY2UiLAorICAgICAgICAgICAgIlwxXHUwMmNmIiwKKyAgICAgICAgICAgICJcMVx1MDJkMCIsCisgICAgICAgICAgICAiXDFcdTAyZDEiLAorICAgICAgICAgICAgIlwxXHUwMmQyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZDMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZDQiLAorICAgICAgICAgICAgIlwxXHUwMmQ1IiwKKyAgICAgICAgICAgICJcMVx1MDJkNiIsCisgICAgICAgICAgICAiXDFcdTAyZDciLAorICAgICAgICAgICAgIlwxXHUwMmQ4IiwKKyAgICAgICAgICAgICJcMVx1MDJkOSIsCisgICAgICAgICAgICAiXDFcdTAyZGEiLAorICAgICAgICAgICAgIlwxXHUwMmRiIiwKKyAgICAgICAgICAgICJcMVx1MDJkYyIsCisgICAgICAgICAgICAiXDFcdTAyZGQiLAorICAgICAgICAgICAgIlwxXHUwMmRlIiwKKyAgICAgICAgICAgICJcMVx1MDJkZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDJlMlwyXHVmZmZmXDFcdTAyZTFcMTRcdWZmZmZcMVx1MDJlMCIsCisgICAgICAgICAgICAiXDFcdTAyZTMiLAorICAgICAgICAgICAgIlwxXHUwMmU0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmU1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmU2IiwKKyAgICAgICAgICAgICJcMVx1MDJlNyIsCisgICAgICAgICAgICAiXDFcdTAyZTgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMmVhIiwKKyAgICAgICAgICAgICJcMVx1MDJlYiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMmVkIiwKKyAgICAgICAgICAgICJcMVx1MDJlZSIsCisgICAgICAgICAgICAiXDFcdTAyZWYiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmYxIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMmYzIiwKKyAgICAgICAgICAgICJcMVx1MDJmNCIsCisgICAgICAgICAgICAiXDFcdTAyZjUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyZjYiLAorICAgICAgICAgICAgIlwxXHUwMmY3IiwKKyAgICAgICAgICAgICJcMVx1MDJmOCIsCisgICAgICAgICAgICAiXDFcdTAyZjkiLAorICAgICAgICAgICAgIlwxXHUwMmZhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMmZiIiwKKyAgICAgICAgICAgICJcMVx1MDJmYyIsCisgICAgICAgICAgICAiXDFcdTAyZmQiLAorICAgICAgICAgICAgIlwxXHUwMmZlIiwKKyAgICAgICAgICAgICJcMVx1MDJmZiIsCisgICAgICAgICAgICAiXDFcdTAzMDAiLAorICAgICAgICAgICAgIlwxXHUwMzAxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzAyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzA1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDMwNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzA5IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzBiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzBlIiwKKyAgICAgICAgICAgICJcMVx1MDMwZiIsCisgICAgICAgICAgICAiXDFcdTAzMTAiLAorICAgICAgICAgICAgIlwxXHUwMzExIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzE1IiwKKyAgICAgICAgICAgICJcMVx1MDMxNlw1XHVmZmZmXDFcdTAzMTciLAorICAgICAgICAgICAgIlwxXHUwMzE4IiwKKyAgICAgICAgICAgICJcMVx1MDMxOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMWEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzMWMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMWQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDMxZiIsCisgICAgICAgICAgICAiXDFcdTAzMjAiLAorICAgICAgICAgICAgIlwxXHUwMzIxIiwKKyAgICAgICAgICAgICJcMVx1MDMyMiIsCisgICAgICAgICAgICAiXDFcdTAzMjMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMjQiLAorICAgICAgICAgICAgIlwxXHUwMzI1IiwKKyAgICAgICAgICAgICJcMVx1MDMyNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzMjciLAorICAgICAgICAgICAgIlwxXHUwMzI4IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzJhIiwKKyAgICAgICAgICAgICJcMVx1MDMyYiIsCisgICAgICAgICAgICAiXDFcdTAzMmMiLAorICAgICAgICAgICAgIlwxXHUwMzJkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzMwIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzMzMiLAorICAgICAgICAgICAgIlwxXHUwMzM0IiwKKyAgICAgICAgICAgICJcMVx1MDMzNSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDMzNyIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlw1IisKKyAgICAgICAgICAgICJcNzVcMVx1MDMzOVwxXDc1XDFcdTAzMzhcMTJcNzVcMVx1MDMzYVw3XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDMzYyIsCisgICAgICAgICAgICAiXDFcdTAzM2QiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzQxIiwKKyAgICAgICAgICAgICJcMVx1MDM0MiIsCisgICAgICAgICAgICAiXDFcdTAzNDMiLAorICAgICAgICAgICAgIlwxXHUwMzQ0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM0NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDM0YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzRjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzNGUiLAorICAgICAgICAgICAgIlwxXHUwMzRmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzUyIiwKKyAgICAgICAgICAgICJcMVx1MDM1MyIsCisgICAgICAgICAgICAiXDFcdTAzNTQiLAorICAgICAgICAgICAgIlwxXHUwMzU1IiwKKyAgICAgICAgICAgICJcMVx1MDM1NiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzU4IiwKKyAgICAgICAgICAgICJcMVx1MDM1OSIsCisgICAgICAgICAgICAiXDFcdTAzNWEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzNWMiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzNWUiLAorICAgICAgICAgICAgIlwxXHUwMzVmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzYxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzYyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzYzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzNjVcMTFcdWZmZmZcMVx1MDM2Nlw1XHVmZmZmXDFcdTAzNjdcMVx1ZmZmZlwxXHUwMzY0IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzY5IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzZiIiwKKyAgICAgICAgICAgICJcMVx1MDM2YyIsCisgICAgICAgICAgICAiXDFcdTAzNmQiLAorICAgICAgICAgICAgIlwxXHUwMzZlIiwKKyAgICAgICAgICAgICJcMVx1MDM2ZiIsCisgICAgICAgICAgICAiXDFcdTAzNzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzNzEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM3MyIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzc2IiwKKyAgICAgICAgICAgICJcMVx1MDM3NyIsCisgICAgICAgICAgICAiXDFcdTAzNzgiLAorICAgICAgICAgICAgIlwxXHUwMzc5IiwKKyAgICAgICAgICAgICJcMVx1MDM3YSIsCisgICAgICAgICAgICAiXDFcdTAzN2IiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM3ZCIsCisgICAgICAgICAgICAiXDFcdTAzN2ZcMTFcdWZmZmZcMVx1MDM4MFw1XHVmZmZmXDFcdTAzODFcMVx1ZmZmZlwxXHUwMzdlIiwKKyAgICAgICAgICAgICJcMVx1MDM4MiIsCisgICAgICAgICAgICAiXDFcdTAzODMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM4NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzg1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwMzg3IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMzg4IiwKKyAgICAgICAgICAgICJcMVx1MDM4OSIsCisgICAgICAgICAgICAiXDFcdTAzOGEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzOGUiLAorICAgICAgICAgICAgIlwxXHUwMzhmIiwKKyAgICAgICAgICAgICJcMVx1MDM5MCIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDM5MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM5MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM5NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM5NSIsCisgICAgICAgICAgICAiXDFcdTAzOTYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDM5NyIsCisgICAgICAgICAgICAiXDFcdTAzOTgiLAorICAgICAgICAgICAgIlwxXHUwMzlhXDExXHVmZmZmXDFcdTAzOWJcNVx1ZmZmZlwxXHUwMzljXDFcdWZmZmZcMVx1MDM5OSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzOWYiLAorICAgICAgICAgICAgIlwxXHUwM2EwIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYTMiLAorICAgICAgICAgICAgIlwxXHUwM2E0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2E1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwM2E3IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYTgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYTkiLAorICAgICAgICAgICAgIlwxXHUwM2FhIiwKKyAgICAgICAgICAgICJcMVx1MDNhYiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDNhZCIsCisgICAgICAgICAgICAiXDFcdTAzYWUiLAorICAgICAgICAgICAgIlwxXHUwM2FmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2IwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYjEiLAorICAgICAgICAgICAgIlwxXHUwM2IyIiwKKyAgICAgICAgICAgICJcMVx1MDNiMyIsCisgICAgICAgICAgICAiXDFcdTAzYjQiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzYjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYjciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzYjgiLAorICAgICAgICAgICAgIlwxXHUwM2I5IiwKKyAgICAgICAgICAgICJcMVx1MDNiYSIsCisgICAgICAgICAgICAiXDFcdTAzYmJcMTdcdWZmZmZcMVx1MDNiYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwM2JlIiwKKyAgICAgICAgICAgICJcMVx1MDNiZiIsCisgICAgICAgICAgICAiXDFcdTAzYzAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2MxIiwKKyAgICAgICAgICAgICJcMVx1MDNjMiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2M0IiwKKyAgICAgICAgICAgICJcMVx1MDNjNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNjNiIsCisgICAgICAgICAgICAiXDFcdTAzYzciLAorICAgICAgICAgICAgIlwxXHUwM2M4IiwKKyAgICAgICAgICAgICJcMVx1MDNjOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDNjYiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNjYyIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDIyIisKKyAgICAgICAgICAgICJcNzVcMVx1MDNjZVw3XDc1IiwKKyAgICAgICAgICAgICJcMVx1MDNkMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzZDMiLAorICAgICAgICAgICAgIlwxXHUwM2Q0IiwKKyAgICAgICAgICAgICJcMVx1MDNkNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDNkNiIsCisgICAgICAgICAgICAiXDFcdTAzZDciLAorICAgICAgICAgICAgIlwxXHUwM2Q4IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwM2RhIiwKKyAgICAgICAgICAgICJcMVx1MDNkYiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZGUiLAorICAgICAgICAgICAgIlwxXHUwM2RmIiwKKyAgICAgICAgICAgICJcMVx1MDNlMCIsCisgICAgICAgICAgICAiXDFcdTAzZTEiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZTMiLAorICAgICAgICAgICAgIlwxXHUwM2U0IiwKKyAgICAgICAgICAgICJcMVx1MDNlNSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZTgiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDNlYiIsCisgICAgICAgICAgICAiXDFcdTAzZWMiLAorICAgICAgICAgICAgIlwxXHUwM2VkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzZWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzZjMiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzZjUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTAzZjciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZjgiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwM2ZiIiwKKyAgICAgICAgICAgICJcMVx1MDNmYyIsCisgICAgICAgICAgICAiXDFcdTAzZmQiLAorICAgICAgICAgICAgIlwxXHUwM2ZlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAzZmYiLAorICAgICAgICAgICAgIlwxXHUwNDAwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTA0MDEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwNDAzIiwKKyAgICAgICAgICAgICJcMVx1MDQwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDQwNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDQwOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDQwYiIsCisgICAgICAgICAgICAiXDFcdTA0MGMiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiXDFcdTA0MGUiLAorICAgICAgICAgICAgIlwxXHUwNDBmIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTA0MTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzVcMTNcdWZmZmZcMTJcNzVcN1x1ZmZmZlwzMlw3NVw0XHVmZmZmXDFcNzVcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDc1IiwKKyAgICAgICAgICAgICJcMVx1MDQxNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwNDE4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTA0MTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3NVwxM1x1ZmZmZlwxMlw3NVw3XHVmZmZmXDMyXDc1XDRcdWZmZmZcMVw3NVwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzUiLAorICAgICAgICAgICAgIlwxXHUwNDFiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDc1XDEzXHVmZmZmXDEyXDc1XDdcdWZmZmZcMzJcNzVcNFx1ZmZmZlwxXDc1XDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3NSIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxX21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIxX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTIxX3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMjFfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkEyMV90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyMV90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMjEgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyMShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDIxOworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkEyMV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTIxX2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMjFfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkEyMV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTIxX2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTIxX3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBUX18xMTIgfCBUX18xMTMgfCBUX18xMTQgfCBUX18xMTUgfCBUX18xMTYgfCBUX18xMTcgfCBUX18xMTggfCBUX18xMTkgfCBUX18xMjAgfCBUX18xMjEgfCBUX18xMjIgfCBUX18xMjMgfCBUX18xMjQgfCBUX18xMjUgfCBUX18xMjYgfCBUX18xMjcgfCBUX18xMjggfCBUX18xMjkgfCBUX18xMzAgfCBUX18xMzEgfCBUX18xMzIgfCBUX18xMzMgfCBUX18xMzQgfCBUX18xMzUgfCBUX18xMzYgfCBUX18xMzcgfCBUX18xMzggfCBUX18xMzkgfCBUX18xNDAgfCBUX18xNDEgfCBUX18xNDIgfCBUX18xNDMgfCBUX18xNDQgfCBUX18xNDUgfCBUX18xNDYgfCBUX18xNDcgfCBUX18xNDggfCBUX18xNDkgfCBUX18xNTAgfCBUX18xNTEgfCBUX18xNTIgfCBUX18xNTMgfCBUX18xNTQgfCBUX18xNTUgfCBUX18xNTYgfCBUX18xNTcgfCBUX18xNTggfCBUX18xNTkgfCBUX18xNjAgfCBUX18xNjEgfCBUX18xNjIgfCBUX18xNjMgfCBUX18xNjQgfCBUX18xNjUgfCBUX18xNjYgfCBUX18xNjcgfCBUX18xNjggfCBUX18xNjkgfCBUX18xNzAgfCBUX18xNzEgfCBUX18xNzIgfCBUX18xNzMgfCBUX18xNzQgfCBUX18xNzUgfCBUX18xNzYgfCBUX18xNzcgfCBUX18xNzggfCBUX18xNzkgfCBUX18xODAgfCBUX18xODEgfCBUX18xODIgfCBUX18xODMgfCBUX18xODQgfCBUX18xODUgfCBUX18xODYgfCBUX18xODcgfCBUX18xODggfCBUX18xODkgfCBUX18xOTAgfCBUX18xOTEgfCBUX18xOTIgfCBUX18xOTMgfCBUX18xOTQgfCBUX18xOTUgfCBUX18xOTYgfCBUX18xOTcgfCBUX18xOTggfCBUX18xOTkgfCBUX18yMDAgfCBUX18yMDEgfCBUX18yMDIgfCBUX18yMDMgfCBUX18yMDQgfCBUX18yMDUgfCBUX18yMDYgfCBUX18yMDcgfCBUX18yMDggfCBUX18yMDkgfCBUX18yMTAgfCBUX18yMTEgfCBUX18yMTIgfCBUX18yMTMgfCBUX18yMTQgfCBUX18yMTUgfCBUX18yMTYgfCBUX18yMTcgfCBUX18yMTggfCBUX18yMTkgfCBUX18yMjAgfCBUX18yMjEgfCBUX18yMjIgfCBUX18yMjMgfCBUX18yMjQgfCBUX18yMjUgfCBUX18yMjYgfCBUX18yMjcgfCBUX18yMjggfCBUX18yMjkgfCBUX18yMzAgfCBUX18yMzEgfCBUX18yMzIgfCBUX18yMzMgfCBUX18yMzQgfCBUX18yMzUgfCBUX18yMzYgfCBUX18yMzcgfCBUX18yMzggfCBUX18yMzkgfCBUX18yNDAgfCBUX18yNDEgfCBUX18yNDIgfCBUX18yNDMgfCBUX18yNDQgfCBUX18yNDUgfCBUX18yNDYgfCBUX18yNDcgfCBUX18yNDggfCBUX18yNDkgfCBUX18yNTAgfCBUX18yNTEgfCBUX18yNTIgfCBUX18yNTMgfCBUX18yNTQgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisgICAgICAgIAlpbnQgX3MgPSBzOworICAgICAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09J3AnKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0neycpICkge3MgPSAyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdsJykgKSB7cyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZicpICkge3MgPSA1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd9JykgKSB7cyA9IDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2MnKSApIHtzID0gNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbScpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdzJykgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3QnKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J28nKSApIHtzID0gMTE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2InKSApIHtzID0gMTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3InKSApIHtzID0gMTM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2QnKSApIHtzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gMTU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3UnKSApIHtzID0gMTY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J24nKSApIHtzID0gMTc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2gnKSApIHtzID0gMTg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2cnKSApIHtzID0gMTk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2knKSApIHtzID0gMjA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JygnKSApIHtzID0gMjE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyknKSApIHtzID0gMjI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy0nKSApIHtzID0gMjM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy4nKSApIHtzID0gMjQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyonKSApIHtzID0gMjU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J0AnKSApIHtzID0gMjY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JywnKSApIHtzID0gMjc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz0nKSApIHtzID0gMjg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyMnKSApIHtzID0gMjk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1snKSApIHtzID0gMzA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J10nKSApIHtzID0gMzE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JysnKSApIHtzID0gMzI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy8nKSApIHtzID0gMzM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyUnKSApIHtzID0gMzQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzwnKSApIHtzID0gMzU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz4nKSApIHtzID0gMzY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3wnKSApIHtzID0gMzc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyYnKSApIHtzID0gMzg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyEnKSApIHtzID0gMzk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jz8nKSApIHtzID0gNDA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzonKSApIHtzID0gNDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzsnKSApIHtzID0gNDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3cnKSApIHtzID0gNDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3YnKSApIHtzID0gNDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JzAnKSApIHtzID0gNDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PScxJyAmJiBMQTIxXzA8PSc5JykpICkge3MgPSA0Njt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXicpICkge3MgPSA0Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJCd8fChMQTIxXzA+PSdBJyAmJiBMQTIxXzA8PSdaJyl8fExBMjFfMD09J18nfHwoTEEyMV8wPj0naicgJiYgTEEyMV8wPD0naycpfHxMQTIxXzA9PSdxJ3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDQ4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA0OTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdCcgJiYgTEEyMV8wPD0nXG4nKXx8TEEyMV8wPT0nXHInfHxMQTIxXzA9PScgJykgKSB7cyA9IDUxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorIAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI1MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDE1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbS5IaWRkZW5Ub2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyRGF0YXR5cGVSdWxlVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuc2VydmljZXMuUmVwb3J0RFNMR3JhbW1hckFjY2VzczsKKworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFJlcG9ydERTTFBhcnNlciBleHRlbmRzIEFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJSVUxFX1NUUklORyIsICJSVUxFX0lEIiwgIlJVTEVfSU5UIiwgIlJVTEVfSEVYIiwgIlJVTEVfREVDSU1BTCIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiwgIlJVTEVfV1MiLCAiUlVMRV9BTllfT1RIRVIiLCAiJ3BhY2thZ2UnIiwgIid7JyIsICInbGF5b3V0LWRhdGEnIiwgIidleHRlcm5hbENzc1VSSSciLCAiJ2Zyb20gYnVuZGxlJyIsICInfSciLCAiJ2Zvcm1hdHRlcnMnIiwgIidjb2xvcnMnIiwgIidmb250cyciLCAiJ21lZGlhcyciLCAiJ21lZGlhJyIsICInc3R5bGVzJyIsICIncGFnZXRlbXBsYXRlJyIsICIndHlwZSciLCAiJ29yaWVudGF0aW9uJyIsICIndG9wbWFyZ2luJyIsICInbGVmdG1hcmdpbiciLCAiJ2JvdHRvbW1hcmdpbiciLCAiJ3JpZ2h0bWFyZ2luJyIsICInY29sb3InIiwgIidkYXJrZW5zJyIsICInYnktcGVyY2VudCciLCAiJ2xpZ2h0ZW5zJyIsICIndHJhbnNmb3JtcyciLCAiJ3Rvd2FyZHMnIiwgIidmb250JyIsICInZXh0ZW5kcyciLCAiJ2ZhbWlseSciLCAiJ2JvbGQnIiwgIidzaXplJyIsICInc3R5bGUnIiwgIidmb3JtYXR0ZXInIiwgIidiYWNrZ3JvdW5kY29sb3InIiwgIidhbHRlcm5hdGUnIiwgIid0ZXh0Y29sb3InIiwgIid0ZXh0YWxpZ24nIiwgIidib3JkZXItdG9wJyIsICInYm9yZGVyLWJvdHRvbSciLCAiJ2JvcmRlci1sZWZ0JyIsICInYm9yZGVyLXJpZ2h0JyIsICIncGFkZGluZy10b3AnIiwgIidwYWRkaW5nLWJvdHRvbSciLCAiJ3BhZGRpbmctbGVmdCciLCAiJ3BhZGRpbmctcmlnaHQnIiwgIidtYXJnaW4tdG9wJyIsICInbWFyZ2luLWJvdHRvbSciLCAiJ21hcmdpbi1sZWZ0JyIsICInbWFyZ2luLXJpZ2h0JyIsICIndW9tbyciLCAiJ3VpJyIsICIncmVwb3J0JyIsICInbnVtYmVyJyIsICInY3VycmVuY3knIiwgIidkYXRlJyIsICInZGF0ZSt0aW1lJyIsICIndGltZSciLCAiJ2Rlc2NyaWJlZCBieSciLCAiJ3Rvb2xiYXInIiwgIidkYXRhbWFydCciLCAiJ3JlbmRlcmluZyciLCAiJ2ZpbGUnIiwgIid0ZW1wbGF0ZSciLCAiJ2hlYWRlciciLCAiJ3Nob3dPbkZpcnN0JyIsICInaGVpZ2h0JyIsICInZGV0YWlsJyIsICInZm9vdGVyJyIsICInc2hvd09uTGFzdCciLCAiJ2dyaWQnIiwgIidhcyciLCAiJ3JvdyciLCAiJ2NlbGwnIiwgIidjb2x1bW5zcGFuJyIsICIndGFibGUnIiwgIidkZXRhaWxoZWFkZXInIiwgIidkZXRhaWxmb290ZXInIiwgIidncm91cCciLCAiJ2J5JyIsICInZGV0YWlscyciLCAiJ2FsbCciLCAiJ2ltYWdlJyIsICInaW50ZXJ2YWxzJyIsICInaGlkZWxhYmVsJyIsICInbG9va3VwcyciLCAiJ3BhdGgnIiwgIidkeW5hbWljJyIsICIncmVzaXplJyIsICIncHJvcGVydHknIiwgIidhZ2dyZWdhdGUnIiwgIidvbi1ncm91cCciLCAiJ3RpdGxlJyIsICInb2YnIiwgIicoJyIsICInKSciLCAiJ3VwIHRvJyIsICInZGF5cyBpbiBwYXN0JyIsICInc3RyaW5nJyIsICInLSciLCAiJ2NlbGxjb2xvciciLCAiJ2ljb24nIiwgIid0cmVuZCciLCAiJ3N1YnRpdGxlJyIsICInc3Vic3VidGl0bGUnIiwgIidsYWJlbCciLCAiJ3RleHQnIiwgIidhdXRvdGV4dCciLCAiJ3NjYWxlJyIsICInaW1wb3J0JyIsICInLiciLCAiJyonIiwgIidAJyIsICInLCciLCAiJz0nIiwgIicjJyIsICInWyciLCAiJ10nIiwgIicrPSciLCAiJy09JyIsICInKj0nIiwgIicvPSciLCAiJyU9JyIsICInPCciLCAiJz4nIiwgIic+PSciLCAiJ3x8JyIsICInJiYnIiwgIic9PSciLCAiJyE9JyIsICInPT09JyIsICInIT09JyIsICInaW5zdGFuY2VvZiciLCAiJy0+JyIsICInLi48JyIsICInLi4nIiwgIic9PiciLCAiJzw+JyIsICInPzonIiwgIicrJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIic7JyIsICInaWYnIiwgIidlbHNlJyIsICInc3dpdGNoJyIsICInOiciLCAiJ2RlZmF1bHQnIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ3ZhciciLCAiJ3ZhbCciLCAiJ3N0YXRpYyciLCAiJ2V4dGVuc2lvbiciLCAiJ3N1cGVyJyIsICInbmV3JyIsICInZmFsc2UnIiwgIid0cnVlJyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidtbSciLCAiJ2NtJyIsICIncHQnIiwgIidpbmNoJyIsICIncGMnIiwgIidlbSciLCAiJ2V4JyIsICIncHgnIiwgIidhNCciLCAiJ2EzJyIsICInYTUnIiwgIid1cy1sZXR0ZXInIiwgIid1cy1sZWdhbCciLCAiJ3VzLWxlZGdlciciLCAiJ3VzLXN1cGVyLWInIiwgIidwb3J0cmFpdCciLCAiJ2xhbmRzY2FwZSciLCAiJ25vcm1hbCciLCAiJ2l0YWxpYyciLCAiJ29ibGlxdWUnIiwgIidtb25vc3BhY2UnIiwgIidzYW5zLXNlcmlmJyIsICInc2VyaWYnIiwgIidsZWZ0JyIsICInY2VudGVyJyIsICIncmlnaHQnIiwgIid1bmZvcm1hdHRlZCciLCAiJ2dlbmVyYWwtbnVtYmVyJyIsICInZml4ZWQnIiwgIidwZXJjZW50JyIsICInc2NpZW50aWZpYyciLCAiJ2N1c3RvbSciLCAiJ2h0bWwnIiwgIidwZGYnIiwgIidjb3VudCciLCAiJ3J1bm5pbmctY291bnQnIiwgIidzdW0nIiwgIidhdmVyYWdlJyIsICInbWluaW11bSciLCAiJ21heGltdW0nIiwgIidydW5uaW5nLXN1bSciLCAiJ2RpdmlkZSciLCAiJ2NvbmNhdCciLCAiJ3Jpc2luZyciLCAiJ2JhZC1yaXNpbmcnIiwgIidzbG9waW5nJyIsICInZ29vZC1zbG9waW5nJyIsICInc3RhZ25hdGluZyciLCAiJ25vbmUnIiwgIidzb2xpZCciLCAiJ2RvdHRlZCciLCAiJ2Rhc2hlZCciLCAiJ2RvdWJsZSciLCAiJ2dyb292ZSciLCAiJ3JpZGdlJyIsICInaW5zZXQnIiwgIidvdXRzZXQnIiwgIidwYWdlLW51bWJlciciLCAiJ3RvdGFsLXBhZ2UnIiwgIidwYWdlLW51bWJlci11bmZpbHRlcmVkJyIsICIndG90YWwtcGFnZS11bmZpbHRlcmVkJyIsICIncGFnZS12YXJpYWJsZSciLCAiJ3NpemUtdG8taW1hZ2UnIiwgIidzY2FsZS10by1pdGVtJyIsICInY2xpcCciLCAiJ3VybCciLCAiJ2VtYmVkJyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0ND0xNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQzPTE0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDY9MTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUwPTUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0NT0xNDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQwPTE0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDI9MTQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0MT0xNDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTk9NTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTU9NTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTY9NTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTc9NTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTg9NTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTE9NTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM3PTEzNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mj01MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzY9MTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUzPTUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzOT0xMzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTQ9NTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM4PTEzODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzM9MTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1ND0yNTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMyPTEzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTM9MjUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYwPTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNT0xMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM0PTEzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTA9MjUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSUQ9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzE9MTMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1Mj0yNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMwPTEzMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNTE9MjUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI5PTEyOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjY9MTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0Nz0yNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjM9NjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI1PTEyNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDY9MjQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY0PTY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOD0xMjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ5PTI0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0OD0yNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY2PTE2NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjU9MTY1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2OD0xNjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY3PTE2NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjI9MTYyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MT0xNjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY0PTE2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjM9MTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2MD0xNjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzM9MzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU5PTE1OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTg9MTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1NT0xNTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU0PTE1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTc9MTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Nj0xNTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUxPTE1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTA9MTUwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1Mz0xNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUyPTE1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDg9MTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQxPTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nz0xNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ5PTE0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyMT0yMjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjIwPTIyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDI9MTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyMz0yMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjI9MjIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5PTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1PTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2PTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3PTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4PTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxOD0yMTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE3PTIxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTk9MjE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxND0yMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjEzPTIxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTY9MjE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxNT0yMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjEwPTIxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMTI9MjEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxMT0yMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9ERUNJTUFMPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjY9MjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjc9Mjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjg9Mjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjk9Mjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA3PTIwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDY9MjA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwOT0yMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA4PTIwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDM9MjAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwMj0yMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA9MjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA1PTIwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDQ9MjA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMj0xMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQzPTI0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjE9MTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0Mj0yNDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI0PTEyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNDU9MjQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMz0xMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ0PTI0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjA9MTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0MT0yNDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQwPTI0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE5PTExOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTg9MTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzOT0yMzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE1PTExNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzY9MjM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0tMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTQ9MTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzNT0yMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE3PTExNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzg9MjM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNj0xMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM3PTIzNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzMj0yMzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMzE9MjMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMz0xMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM0PTIzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTI9MTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzMz0yMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjMwPTIzMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDg9MTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyOT0yMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA3PTEwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjg9MjI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjU9MjI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMz0xMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI0PTIyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDY9MTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyNz0yMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMjY9MjI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjAxPTIwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMDA9MjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkxPTkxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4OD0xODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTI9OTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg3PTE4NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mz05MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185ND05NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODk9MTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4ND0xODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTgzPTE4MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODY9MTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkwPTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4NT0xODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTgwPTE4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xODI9MTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4MT0xODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTk9OTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTU9OTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTY9OTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTc9OTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTg9OTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc3PTE3NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzY9MTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3OT0xNzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc4PTE3ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzM9MTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3Mj0xNzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc1PTE3NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNzQ9MTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3MT0xNzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTcwPTE3MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNjk9MTY5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcwPTcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcxPTcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcyPTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU1RSSU5HPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzg9Nzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzU9NzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzY9NzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODA9ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk5PTE5OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MT04MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTg9MTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5NT0xOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk0PTE5NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1dTPTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5Nz0xOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk2PTE5NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTE9MTkxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5MD0xOTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTkzPTE5MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOTI9MTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQU5ZX09USEVSPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg4PTg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg5PTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg0PTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg1PTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg3PTg3OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisKKyAgICAgICAgcHVibGljIEludGVybmFsUmVwb3J0RFNMUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJbnRlcm5hbFJlcG9ydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbFJlcG9ydERTTFBhcnNlci50b2tlbk5hbWVzOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZyI7IH0KKworCisKKyAgICAgCXByaXZhdGUgUmVwb3J0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworICAgICAJCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbFJlcG9ydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVwb3J0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisgICAgICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgICAgIHRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgICAgICAgICByZWdpc3RlclJ1bGVzKGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RSdWxlTmFtZSgpIHsKKyAgICAgICAgCXJldHVybiAiUmVwb3J0TW9kZWwiOwkKKyAgICAgICAJfQorICAgICAgIAkKKyAgICAgICAJQE92ZXJyaWRlCisgICAgICAgCXByb3RlY3RlZCBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisgICAgICAgCQlyZXR1cm4gZ3JhbW1hckFjY2VzczsKKyAgICAgICAJfQorCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUmVwb3J0TW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2ODoxOiBlbnRyeVJ1bGVSZXBvcnRNb2RlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUmVwb3J0TW9kZWw9IHJ1bGVSZXBvcnRNb2RlbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJlcG9ydE1vZGVsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSZXBvcnRNb2RlbCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2OToyOiAoaXZfcnVsZVJlcG9ydE1vZGVsPSBydWxlUmVwb3J0TW9kZWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzA6MjogaXZfcnVsZVJlcG9ydE1vZGVsPSBydWxlUmVwb3J0TW9kZWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRNb2RlbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJlcG9ydE1vZGVsX2luX2VudHJ5UnVsZVJlcG9ydE1vZGVsNzUpOworICAgICAgICAgICAgaXZfcnVsZVJlcG9ydE1vZGVsPXJ1bGVSZXBvcnRNb2RlbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJlcG9ydE1vZGVsOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJlcG9ydE1vZGVsODUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUmVwb3J0TW9kZWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJlcG9ydE1vZGVsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Nzc6MTogcnVsZVJlcG9ydE1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKGx2X3Bja2dfMF8wPSBydWxlUmVwb3J0UGFja2FnZSApICkqIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUmVwb3J0TW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcGNrZ18wXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MDoyODogKCAoIChsdl9wY2tnXzBfMD0gcnVsZVJlcG9ydFBhY2thZ2UgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgxOjE6ICggKGx2X3Bja2dfMF8wPSBydWxlUmVwb3J0UGFja2FnZSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgxOjE6ICggKGx2X3Bja2dfMF8wPSBydWxlUmVwb3J0UGFja2FnZSApICkqCisgICAgICAgICAgICBsb29wMToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MjoxOiAobHZfcGNrZ18wXzA9IHJ1bGVSZXBvcnRQYWNrYWdlICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgyOjE6IChsdl9wY2tnXzBfMD0gcnVsZVJlcG9ydFBhY2thZ2UgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgzOjM6IGx2X3Bja2dfMF8wPSBydWxlUmVwb3J0UGFja2FnZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0TW9kZWxBY2Nlc3MoKS5nZXRQY2tnUmVwb3J0UGFja2FnZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJlcG9ydFBhY2thZ2VfaW5fcnVsZVJlcG9ydE1vZGVsMTMwKTsKKyAgICAgICAgICAgIAkgICAgbHZfcGNrZ18wXzA9cnVsZVJlcG9ydFBhY2thZ2UoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRNb2RlbFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwY2tnIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGNrZ18wXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiUmVwb3J0UGFja2FnZSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSZXBvcnRNb2RlbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSZXBvcnRQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA3OjE6IGVudHJ5UnVsZVJlcG9ydFBhY2thZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJlcG9ydFBhY2thZ2U9IHJ1bGVSZXBvcnRQYWNrYWdlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUmVwb3J0UGFja2FnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUmVwb3J0UGFja2FnZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDg6MjogKGl2X3J1bGVSZXBvcnRQYWNrYWdlPSBydWxlUmVwb3J0UGFja2FnZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDk6MjogaXZfcnVsZVJlcG9ydFBhY2thZ2U9IHJ1bGVSZXBvcnRQYWNrYWdlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJlcG9ydFBhY2thZ2VfaW5fZW50cnlSdWxlUmVwb3J0UGFja2FnZTE2Nik7CisgICAgICAgICAgICBpdl9ydWxlUmVwb3J0UGFja2FnZT1ydWxlUmVwb3J0UGFja2FnZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJlcG9ydFBhY2thZ2U7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUmVwb3J0UGFja2FnZTE3Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSZXBvcnRQYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSZXBvcnRQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE2OjE6IHJ1bGVSZXBvcnRQYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVJlcG9ydEltcG9ydCApICkqIChvdGhlcmx2XzU9ICdsYXlvdXQtZGF0YScgb3RoZXJsdl82PSAneycgKG90aGVybHZfNz0gJ2V4dGVybmFsQ3NzVVJJJyAoIChsdl9leHRlcm5hbENzc1VSSV84XzA9IFJVTEVfU1RSSU5HICkgKSAob3RoZXJsdl85PSAnZnJvbSBidW5kbGUnICggKGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEwXzA9IFJVTEVfU1RSSU5HICkgKSApPyApPyAoIChsdl9wYWdldGVtcGxhdGVzXzExXzA9IHJ1bGVQYWdlVGVtcGxhdGVzICkgKSAoIChsdl9mb3JtYXR0ZXJzXzEyXzA9IHJ1bGVTb21lRm9ybWF0cyApICkgKCAobHZfY29sb3JzXzEzXzA9IHJ1bGVDb2xvcnMgKSApICggKGx2X2ZvbnRzXzE0XzA9IHJ1bGVGb250cyApICkgKCAobHZfbWVkaWFzXzE1XzA9IHJ1bGVNZWRpYXMgKSApICggKGx2X3N0eWxlc18xNl8wPSBydWxlU3R5bGVzICkgKSBvdGhlcmx2XzE3PSAnfScgKT8gKCAobHZfcmVwb3J0c18xOF8wPSBydWxlUmVwb3J0ICkgKSogb3RoZXJsdl8xOT0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSZXBvcnRQYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl83PW51bGw7CisgICAgICAgIFRva2VuIGx2X2V4dGVybmFsQ3NzVVJJXzhfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzk9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE3PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTk9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9uYW1lXzJfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9pbXBvcnRzXzRfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9wYWdldGVtcGxhdGVzXzExXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZm9ybWF0dGVyc18xMl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2NvbG9yc18xM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2ZvbnRzXzE0XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfbWVkaWFzXzE1XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfc3R5bGVzXzE2XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmVwb3J0c18xOF8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5OjI4OiAoICggKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVJlcG9ydEltcG9ydCApICkqIChvdGhlcmx2XzU9ICdsYXlvdXQtZGF0YScgb3RoZXJsdl82PSAneycgKG90aGVybHZfNz0gJ2V4dGVybmFsQ3NzVVJJJyAoIChsdl9leHRlcm5hbENzc1VSSV84XzA9IFJVTEVfU1RSSU5HICkgKSAob3RoZXJsdl85PSAnZnJvbSBidW5kbGUnICggKGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEwXzA9IFJVTEVfU1RSSU5HICkgKSApPyApPyAoIChsdl9wYWdldGVtcGxhdGVzXzExXzA9IHJ1bGVQYWdlVGVtcGxhdGVzICkgKSAoIChsdl9mb3JtYXR0ZXJzXzEyXzA9IHJ1bGVTb21lRm9ybWF0cyApICkgKCAobHZfY29sb3JzXzEzXzA9IHJ1bGVDb2xvcnMgKSApICggKGx2X2ZvbnRzXzE0XzA9IHJ1bGVGb250cyApICkgKCAobHZfbWVkaWFzXzE1XzA9IHJ1bGVNZWRpYXMgKSApICggKGx2X3N0eWxlc18xNl8wPSBydWxlU3R5bGVzICkgKSBvdGhlcmx2XzE3PSAnfScgKT8gKCAobHZfcmVwb3J0c18xOF8wPSBydWxlUmVwb3J0ICkgKSogb3RoZXJsdl8xOT0gJ30nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjA6MTogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlUmVwb3J0SW1wb3J0ICkgKSogKG90aGVybHZfNT0gJ2xheW91dC1kYXRhJyBvdGhlcmx2XzY9ICd7JyAob3RoZXJsdl83PSAnZXh0ZXJuYWxDc3NVUkknICggKGx2X2V4dGVybmFsQ3NzVVJJXzhfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2Xzk9ICdmcm9tIGJ1bmRsZScgKCAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKSApICk/ICk/ICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD0gcnVsZVBhZ2VUZW1wbGF0ZXMgKSApICggKGx2X2Zvcm1hdHRlcnNfMTJfMD0gcnVsZVNvbWVGb3JtYXRzICkgKSAoIChsdl9jb2xvcnNfMTNfMD0gcnVsZUNvbG9ycyApICkgKCAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkgKSAoIChsdl9tZWRpYXNfMTVfMD0gcnVsZU1lZGlhcyApICkgKCAobHZfc3R5bGVzXzE2XzA9IHJ1bGVTdHlsZXMgKSApIG90aGVybHZfMTc9ICd9JyApPyAoIChsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQgKSApKiBvdGhlcmx2XzE5PSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjA6MTogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlUmVwb3J0SW1wb3J0ICkgKSogKG90aGVybHZfNT0gJ2xheW91dC1kYXRhJyBvdGhlcmx2XzY9ICd7JyAob3RoZXJsdl83PSAnZXh0ZXJuYWxDc3NVUkknICggKGx2X2V4dGVybmFsQ3NzVVJJXzhfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2Xzk9ICdmcm9tIGJ1bmRsZScgKCAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKSApICk/ICk/ICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD0gcnVsZVBhZ2VUZW1wbGF0ZXMgKSApICggKGx2X2Zvcm1hdHRlcnNfMTJfMD0gcnVsZVNvbWVGb3JtYXRzICkgKSAoIChsdl9jb2xvcnNfMTNfMD0gcnVsZUNvbG9ycyApICkgKCAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkgKSAoIChsdl9tZWRpYXNfMTVfMD0gcnVsZU1lZGlhcyApICkgKCAobHZfc3R5bGVzXzE2XzA9IHJ1bGVTdHlsZXMgKSApIG90aGVybHZfMTc9ICd9JyApPyAoIChsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQgKSApKiBvdGhlcmx2XzE5PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjA6MjogKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVJlcG9ydEltcG9ydCApICkqIChvdGhlcmx2XzU9ICdsYXlvdXQtZGF0YScgb3RoZXJsdl82PSAneycgKG90aGVybHZfNz0gJ2V4dGVybmFsQ3NzVVJJJyAoIChsdl9leHRlcm5hbENzc1VSSV84XzA9IFJVTEVfU1RSSU5HICkgKSAob3RoZXJsdl85PSAnZnJvbSBidW5kbGUnICggKGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEwXzA9IFJVTEVfU1RSSU5HICkgKSApPyApPyAoIChsdl9wYWdldGVtcGxhdGVzXzExXzA9IHJ1bGVQYWdlVGVtcGxhdGVzICkgKSAoIChsdl9mb3JtYXR0ZXJzXzEyXzA9IHJ1bGVTb21lRm9ybWF0cyApICkgKCAobHZfY29sb3JzXzEzXzA9IHJ1bGVDb2xvcnMgKSApICggKGx2X2ZvbnRzXzE0XzA9IHJ1bGVGb250cyApICkgKCAobHZfbWVkaWFzXzE1XzA9IHJ1bGVNZWRpYXMgKSApICggKGx2X3N0eWxlc18xNl8wPSBydWxlU3R5bGVzICkgKSBvdGhlcmx2XzE3PSAnfScgKT8gKCAobHZfcmVwb3J0c18xOF8wPSBydWxlUmVwb3J0ICkgKSogb3RoZXJsdl8xOT0gJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyMDoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjE6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmVwb3J0UGFja2FnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMyxGT0xMT1dfMTNfaW5fcnVsZVJlcG9ydFBhY2thZ2UyMjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRQYWNrYWdlS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMDoxOiAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMToxOiAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMxOjE6IChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzI6MzogbHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX3J1bGVSZXBvcnRQYWNrYWdlMjQzKTsKKyAgICAgICAgICAgIGx2X25hbWVfMl8wPXJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJRdWFsaWZpZWROYW1lIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVJlcG9ydFBhY2thZ2UyNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MjoxOiAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZVJlcG9ydEltcG9ydCApICkqCisgICAgICAgICAgICBsb29wMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTUzOjE6IChsdl9pbXBvcnRzXzRfMD0gcnVsZVJlcG9ydEltcG9ydCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTM6MTogKGx2X2ltcG9ydHNfNF8wPSBydWxlUmVwb3J0SW1wb3J0ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTQ6MzogbHZfaW1wb3J0c180XzA9IHJ1bGVSZXBvcnRJbXBvcnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzUmVwb3J0SW1wb3J0UGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSZXBvcnRJbXBvcnRfaW5fcnVsZVJlcG9ydFBhY2thZ2UyNzYpOworICAgICAgICAgICAgCSAgICBsdl9pbXBvcnRzXzRfMD1ydWxlUmVwb3J0SW1wb3J0KCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJpbXBvcnRzIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfaW1wb3J0c180XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiUmVwb3J0SW1wb3J0Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MDozOiAob3RoZXJsdl81PSAnbGF5b3V0LWRhdGEnIG90aGVybHZfNj0gJ3snIChvdGhlcmx2Xzc9ICdleHRlcm5hbENzc1VSSScgKCAobHZfZXh0ZXJuYWxDc3NVUklfOF8wPSBSVUxFX1NUUklORyApICkgKG90aGVybHZfOT0gJ2Zyb20gYnVuZGxlJyAoIChsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wPSBSVUxFX1NUUklORyApICkgKT8gKT8gKCAobHZfcGFnZXRlbXBsYXRlc18xMV8wPSBydWxlUGFnZVRlbXBsYXRlcyApICkgKCAobHZfZm9ybWF0dGVyc18xMl8wPSBydWxlU29tZUZvcm1hdHMgKSApICggKGx2X2NvbG9yc18xM18wPSBydWxlQ29sb3JzICkgKSAoIChsdl9mb250c18xNF8wPSBydWxlRm9udHMgKSApICggKGx2X21lZGlhc18xNV8wPSBydWxlTWVkaWFzICkgKSAoIChsdl9zdHlsZXNfMTZfMD0gcnVsZVN0eWxlcyApICkgb3RoZXJsdl8xNz0gJ30nICk/CisgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcwOjU6IG90aGVybHZfNT0gJ2xheW91dC1kYXRhJyBvdGhlcmx2XzY9ICd7JyAob3RoZXJsdl83PSAnZXh0ZXJuYWxDc3NVUkknICggKGx2X2V4dGVybmFsQ3NzVVJJXzhfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2Xzk9ICdmcm9tIGJ1bmRsZScgKCAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKSApICk/ICk/ICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD0gcnVsZVBhZ2VUZW1wbGF0ZXMgKSApICggKGx2X2Zvcm1hdHRlcnNfMTJfMD0gcnVsZVNvbWVGb3JtYXRzICkgKSAoIChsdl9jb2xvcnNfMTNfMD0gcnVsZUNvbG9ycyApICkgKCAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkgKSAoIChsdl9tZWRpYXNfMTVfMD0gcnVsZU1lZGlhcyApICkgKCAobHZfc3R5bGVzXzE2XzA9IHJ1bGVTdHlsZXMgKSApIG90aGVybHZfMTc9ICd9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzE1X2luX3J1bGVSZXBvcnRQYWNrYWdlMjkwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldExheW91dERhdGFLZXl3b3JkXzVfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVJlcG9ydFBhY2thZ2UzMDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNV8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODoxOiAob3RoZXJsdl83PSAnZXh0ZXJuYWxDc3NVUkknICggKGx2X2V4dGVybmFsQ3NzVVJJXzhfMD0gUlVMRV9TVFJJTkcgKSApIChvdGhlcmx2Xzk9ICdmcm9tIGJ1bmRsZScgKCAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKSApICk/ICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ0PTI7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODozOiBvdGhlcmx2Xzc9ICdleHRlcm5hbENzc1VSSScgKCAobHZfZXh0ZXJuYWxDc3NVUklfOF8wPSBSVUxFX1NUUklORyApICkgKG90aGVybHZfOT0gJ2Zyb20gYnVuZGxlJyAoIChsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wPSBSVUxFX1NUUklORyApICkgKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMTZfaW5fcnVsZVJlcG9ydFBhY2thZ2UzMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldEV4dGVybmFsQ3NzVVJJS2V5d29yZF81XzJfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODI6MTogKCAobHZfZXh0ZXJuYWxDc3NVUklfOF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MzoxOiAobHZfZXh0ZXJuYWxDc3NVUklfOF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgzOjE6IChsdl9leHRlcm5hbENzc1VSSV84XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NDozOiBsdl9leHRlcm5hbENzc1VSSV84XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2V4dGVybmFsQ3NzVVJJXzhfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVSZXBvcnRQYWNrYWdlMzMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2V4dGVybmFsQ3NzVVJJXzhfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMl8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiZXh0ZXJuYWxDc3NVUkkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2V4dGVybmFsQ3NzVVJJXzhfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAwOjI6IChvdGhlcmx2Xzk9ICdmcm9tIGJ1bmRsZScgKCAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKSApICk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDA6NDogb3RoZXJsdl85PSAnZnJvbSBidW5kbGUnICggKGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEwXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCwxNyxGT0xMT1dfMTdfaW5fcnVsZVJlcG9ydFBhY2thZ2UzNTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl85LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGcm9tQnVuZGxlS2V5d29yZF81XzJfMl8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNDoxOiAoIChsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA1OjE6IChsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNToxOiAobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDY6MzogbHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEwXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlUmVwb3J0UGFja2FnZTM2Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMTBfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMl8yXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJleHRlcm5hbENzc1VSSUJ1bmRsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9leHRlcm5hbENzc1VSSUJ1bmRsZV8xMF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMjo2OiAoIChsdl9wYWdldGVtcGxhdGVzXzExXzA9IHJ1bGVQYWdlVGVtcGxhdGVzICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMzoxOiAobHZfcGFnZXRlbXBsYXRlc18xMV8wPSBydWxlUGFnZVRlbXBsYXRlcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjM6MTogKGx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD0gcnVsZVBhZ2VUZW1wbGF0ZXMgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNDozOiBsdl9wYWdldGVtcGxhdGVzXzExXzA9IHJ1bGVQYWdlVGVtcGxhdGVzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UGFnZXRlbXBsYXRlc1BhZ2VUZW1wbGF0ZXNQYXJzZXJSdWxlQ2FsbF81XzNfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGFnZVRlbXBsYXRlc19pbl9ydWxlUmVwb3J0UGFja2FnZTM5Nyk7CisgICAgICAgICAgICAgICAgICAgIGx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMD1ydWxlUGFnZVRlbXBsYXRlcygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkicGFnZXRlbXBsYXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3BhZ2V0ZW1wbGF0ZXNfMTFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJQYWdlVGVtcGxhdGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDA6MjogKCAobHZfZm9ybWF0dGVyc18xMl8wPSBydWxlU29tZUZvcm1hdHMgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQxOjE6IChsdl9mb3JtYXR0ZXJzXzEyXzA9IHJ1bGVTb21lRm9ybWF0cyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDE6MTogKGx2X2Zvcm1hdHRlcnNfMTJfMD0gcnVsZVNvbWVGb3JtYXRzICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI6MzogbHZfZm9ybWF0dGVyc18xMl8wPSBydWxlU29tZUZvcm1hdHMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzU29tZUZvcm1hdHNQYXJzZXJSdWxlQ2FsbF81XzRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlU29tZUZvcm1hdHNfaW5fcnVsZVJlcG9ydFBhY2thZ2U0MTgpOworICAgICAgICAgICAgICAgICAgICBsdl9mb3JtYXR0ZXJzXzEyXzA9cnVsZVNvbWVGb3JtYXRzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJmb3JtYXR0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZm9ybWF0dGVyc18xMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlNvbWVGb3JtYXRzIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTg6MjogKCAobHZfY29sb3JzXzEzXzA9IHJ1bGVDb2xvcnMgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU5OjE6IChsdl9jb2xvcnNfMTNfMD0gcnVsZUNvbG9ycyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTk6MTogKGx2X2NvbG9yc18xM18wPSBydWxlQ29sb3JzICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjA6MzogbHZfY29sb3JzXzEzXzA9IHJ1bGVDb2xvcnMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRDb2xvcnNDb2xvcnNQYXJzZXJSdWxlQ2FsbF81XzVfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ29sb3JzX2luX3J1bGVSZXBvcnRQYWNrYWdlNDM5KTsKKyAgICAgICAgICAgICAgICAgICAgbHZfY29sb3JzXzEzXzA9cnVsZUNvbG9ycygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiY29sb3JzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfY29sb3JzXzEzXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiQ29sb3JzIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzY6MjogKCAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3NzoxOiAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3NzoxOiAobHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzg6MzogbHZfZm9udHNfMTRfMD0gcnVsZUZvbnRzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Rm9udHNGb250c1BhcnNlclJ1bGVDYWxsXzVfNl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVGb250c19pbl9ydWxlUmVwb3J0UGFja2FnZTQ2MCk7CisgICAgICAgICAgICAgICAgICAgIGx2X2ZvbnRzXzE0XzA9cnVsZUZvbnRzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJmb250cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2ZvbnRzXzE0XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiRm9udHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5NDoyOiAoIChsdl9tZWRpYXNfMTVfMD0gcnVsZU1lZGlhcyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTU6MTogKGx2X21lZGlhc18xNV8wPSBydWxlTWVkaWFzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5NToxOiAobHZfbWVkaWFzXzE1XzA9IHJ1bGVNZWRpYXMgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5NjozOiBsdl9tZWRpYXNfMTVfMD0gcnVsZU1lZGlhcworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldE1lZGlhc01lZGlhc1BhcnNlclJ1bGVDYWxsXzVfN18wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVNZWRpYXNfaW5fcnVsZVJlcG9ydFBhY2thZ2U0ODEpOworICAgICAgICAgICAgICAgICAgICBsdl9tZWRpYXNfMTVfMD1ydWxlTWVkaWFzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJtZWRpYXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9tZWRpYXNfMTVfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJNZWRpYXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMjoyOiAoIChsdl9zdHlsZXNfMTZfMD0gcnVsZVN0eWxlcyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTM6MTogKGx2X3N0eWxlc18xNl8wPSBydWxlU3R5bGVzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMzoxOiAobHZfc3R5bGVzXzE2XzA9IHJ1bGVTdHlsZXMgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxNDozOiBsdl9zdHlsZXNfMTZfMD0gcnVsZVN0eWxlcworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFN0eWxlc1N0eWxlc1BhcnNlclJ1bGVDYWxsXzVfOF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVTdHlsZXNfaW5fcnVsZVJlcG9ydFBhY2thZ2U1MDIpOworICAgICAgICAgICAgICAgICAgICBsdl9zdHlsZXNfMTZfMD1ydWxlU3R5bGVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJzdHlsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9zdHlsZXNfMTZfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJTdHlsZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE3PShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZVJlcG9ydFBhY2thZ2U1MTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTcsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzNDozOiAoIChsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQgKSApKgorICAgICAgICAgICAgbG9vcDY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM1OjE6IChsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM1OjE6IChsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzNjozOiBsdl9yZXBvcnRzXzE4XzA9IHJ1bGVSZXBvcnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSZXBvcnRzUmVwb3J0UGFyc2VyUnVsZUNhbGxfNl8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSZXBvcnRfaW5fcnVsZVJlcG9ydFBhY2thZ2U1MzcpOworICAgICAgICAgICAgCSAgICBsdl9yZXBvcnRzXzE4XzA9cnVsZVJlcG9ydCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicmVwb3J0cyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JlcG9ydHNfMThfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJSZXBvcnQiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG90aGVybHZfMTk9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlUmVwb3J0UGFja2FnZTU1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE5LCBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNygpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUmVwb3J0UGFja2FnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVQYWdlVGVtcGxhdGVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY0OjE6IGVudHJ5UnVsZVBhZ2VUZW1wbGF0ZXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBhZ2VUZW1wbGF0ZXM9IHJ1bGVQYWdlVGVtcGxhdGVzIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUGFnZVRlbXBsYXRlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUGFnZVRlbXBsYXRlcyA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjU6MjogKGl2X3J1bGVQYWdlVGVtcGxhdGVzPSBydWxlUGFnZVRlbXBsYXRlcyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjY6MjogaXZfcnVsZVBhZ2VUZW1wbGF0ZXM9IHJ1bGVQYWdlVGVtcGxhdGVzIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBhZ2VUZW1wbGF0ZXNfaW5fZW50cnlSdWxlUGFnZVRlbXBsYXRlczU4Nik7CisgICAgICAgICAgICBpdl9ydWxlUGFnZVRlbXBsYXRlcz1ydWxlUGFnZVRlbXBsYXRlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBhZ2VUZW1wbGF0ZXM7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUGFnZVRlbXBsYXRlczU5Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVQYWdlVGVtcGxhdGVzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVQYWdlVGVtcGxhdGVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzczOjE6IHJ1bGVQYWdlVGVtcGxhdGVzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgKCAobHZfcGFnZXRlbXBsYXRlc18xXzA9IHJ1bGVQYWdlVGVtcGxhdGUgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUGFnZVRlbXBsYXRlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9wYWdldGVtcGxhdGVzXzFfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NjoyODogKCAoICgpICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPSBydWxlUGFnZVRlbXBsYXRlICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NzoxOiAoICgpICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPSBydWxlUGFnZVRlbXBsYXRlICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzc6MTogKCAoKSAoIChsdl9wYWdldGVtcGxhdGVzXzFfMD0gcnVsZVBhZ2VUZW1wbGF0ZSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc3OjI6ICgpICggKGx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPSBydWxlUGFnZVRlbXBsYXRlICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc3OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3ODo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZXNBY2Nlc3MoKS5nZXRQYWdlVGVtcGxhdGVzQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4MzoyOiAoIChsdl9wYWdldGVtcGxhdGVzXzFfMD0gcnVsZVBhZ2VUZW1wbGF0ZSApICkqCisgICAgICAgICAgICBsb29wNzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODQ6MTogKGx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPSBydWxlUGFnZVRlbXBsYXRlICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4NDoxOiAobHZfcGFnZXRlbXBsYXRlc18xXzA9IHJ1bGVQYWdlVGVtcGxhdGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4NTozOiBsdl9wYWdldGVtcGxhdGVzXzFfMD0gcnVsZVBhZ2VUZW1wbGF0ZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlc0FjY2VzcygpLmdldFBhZ2V0ZW1wbGF0ZXNQYWdlVGVtcGxhdGVQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBhZ2VUZW1wbGF0ZV9pbl9ydWxlUGFnZVRlbXBsYXRlczY1MSk7CisgICAgICAgICAgICAJICAgIGx2X3BhZ2V0ZW1wbGF0ZXNfMV8wPXJ1bGVQYWdlVGVtcGxhdGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVzUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZ2V0ZW1wbGF0ZXMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWdldGVtcGxhdGVzXzFfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJQYWdlVGVtcGxhdGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVBhZ2VUZW1wbGF0ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlU29tZUZvcm1hdHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MDk6MTogZW50cnlSdWxlU29tZUZvcm1hdHMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVNvbWVGb3JtYXRzPSBydWxlU29tZUZvcm1hdHMgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVTb21lRm9ybWF0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlU29tZUZvcm1hdHMgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDEwOjI6IChpdl9ydWxlU29tZUZvcm1hdHM9IHJ1bGVTb21lRm9ybWF0cyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MTE6MjogaXZfcnVsZVNvbWVGb3JtYXRzPSBydWxlU29tZUZvcm1hdHMgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0c1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVNvbWVGb3JtYXRzX2luX2VudHJ5UnVsZVNvbWVGb3JtYXRzNjg4KTsKKyAgICAgICAgICAgIGl2X3J1bGVTb21lRm9ybWF0cz1ydWxlU29tZUZvcm1hdHMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVTb21lRm9ybWF0czsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVTb21lRm9ybWF0czY5OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVTb21lRm9ybWF0cyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlU29tZUZvcm1hdHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MTg6MTogcnVsZVNvbWVGb3JtYXRzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZm9ybWF0dGVycycgb3RoZXJsdl8yPSAneycgKCAobHZfZm9ybWF0dGVyc18zXzA9IHJ1bGVTb21lRm9ybWF0ICkgKSogb3RoZXJsdl80PSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVNvbWVGb3JtYXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2Zvcm1hdHRlcnNfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDIxOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnZm9ybWF0dGVycycgb3RoZXJsdl8yPSAneycgKCAobHZfZm9ybWF0dGVyc18zXzA9IHJ1bGVTb21lRm9ybWF0ICkgKSogb3RoZXJsdl80PSAnfScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQyMjoxOiAoICgpIG90aGVybHZfMT0gJ2Zvcm1hdHRlcnMnIG90aGVybHZfMj0gJ3snICggKGx2X2Zvcm1hdHRlcnNfM18wPSBydWxlU29tZUZvcm1hdCApICkqIG90aGVybHZfND0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDIyOjE6ICggKCkgb3RoZXJsdl8xPSAnZm9ybWF0dGVycycgb3RoZXJsdl8yPSAneycgKCAobHZfZm9ybWF0dGVyc18zXzA9IHJ1bGVTb21lRm9ybWF0ICkgKSogb3RoZXJsdl80PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MjI6MjogKCkgb3RoZXJsdl8xPSAnZm9ybWF0dGVycycgb3RoZXJsdl8yPSAneycgKCAobHZfZm9ybWF0dGVyc18zXzA9IHJ1bGVTb21lRm9ybWF0ICkgKSogb3RoZXJsdl80PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDIyOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQyMzo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0U29tZUZvcm1hdHNBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTksRk9MTE9XXzE5X2luX3J1bGVTb21lRm9ybWF0czc0NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlU29tZUZvcm1hdHM3NTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0MzY6MTogKCAobHZfZm9ybWF0dGVyc18zXzA9IHJ1bGVTb21lRm9ybWF0ICkgKSoKKyAgICAgICAgICAgIGxvb3A4OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICBjYXNlIDY0OgorICAgICAgICAgICAgICAgIGNhc2UgNjU6CisgICAgICAgICAgICAgICAgY2FzZSA2NjoKKyAgICAgICAgICAgICAgICBjYXNlIDY3OgorICAgICAgICAgICAgICAgIGNhc2UgNjg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0OD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Mzc6MTogKGx2X2Zvcm1hdHRlcnNfM18wPSBydWxlU29tZUZvcm1hdCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Mzc6MTogKGx2X2Zvcm1hdHRlcnNfM18wPSBydWxlU29tZUZvcm1hdCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDM4OjM6IGx2X2Zvcm1hdHRlcnNfM18wPSBydWxlU29tZUZvcm1hdAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNBY2Nlc3MoKS5nZXRGb3JtYXR0ZXJzU29tZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlU29tZUZvcm1hdF9pbl9ydWxlU29tZUZvcm1hdHM3NzcpOworICAgICAgICAgICAgCSAgICBsdl9mb3JtYXR0ZXJzXzNfMD1ydWxlU29tZUZvcm1hdCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImZvcm1hdHRlcnMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9mb3JtYXR0ZXJzXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJTb21lRm9ybWF0Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlU29tZUZvcm1hdHM3OTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVNvbWVGb3JtYXRzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNvbG9ycyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ2NjoxOiBlbnRyeVJ1bGVDb2xvcnMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNvbG9ycz0gcnVsZUNvbG9ycyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNvbG9ycygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ29sb3JzID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ2NzoyOiAoaXZfcnVsZUNvbG9ycz0gcnVsZUNvbG9ycyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Njg6MjogaXZfcnVsZUNvbG9ycz0gcnVsZUNvbG9ycyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbG9yc1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNvbG9yc19pbl9lbnRyeVJ1bGVDb2xvcnM4MjYpOworICAgICAgICAgICAgaXZfcnVsZUNvbG9ycz1ydWxlQ29sb3JzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQ29sb3JzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNvbG9yczgzNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDb2xvcnMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNvbG9ycyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3NToxOiBydWxlQ29sb3JzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnY29sb3JzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9jb2xvcnNfM18wPSBydWxlQ29sb3IgKSApKiBvdGhlcmx2XzQ9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ29sb3JzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2NvbG9yc18zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Nzg6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdjb2xvcnMnIG90aGVybHZfMj0gJ3snICggKGx2X2NvbG9yc18zXzA9IHJ1bGVDb2xvciApICkqIG90aGVybHZfND0gJ30nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0Nzk6MTogKCAoKSBvdGhlcmx2XzE9ICdjb2xvcnMnIG90aGVybHZfMj0gJ3snICggKGx2X2NvbG9yc18zXzA9IHJ1bGVDb2xvciApICkqIG90aGVybHZfND0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NDc5OjE6ICggKCkgb3RoZXJsdl8xPSAnY29sb3JzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9jb2xvcnNfM18wPSBydWxlQ29sb3IgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3OToyOiAoKSBvdGhlcmx2XzE9ICdjb2xvcnMnIG90aGVybHZfMj0gJ3snICggKGx2X2NvbG9yc18zXzA9IHJ1bGVDb2xvciApICkqIG90aGVybHZfND0gJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ3OToyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0ODA6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjAsRk9MTE9XXzIwX2luX3J1bGVDb2xvcnM4ODIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldENvbG9yc0tleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZUNvbG9yczg5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0OTM6MTogKCAobHZfY29sb3JzXzNfMD0gcnVsZUNvbG9yICkgKSoKKyAgICAgICAgICAgIGxvb3A5OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ5NDoxOiAobHZfY29sb3JzXzNfMD0gcnVsZUNvbG9yICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjQ5NDoxOiAobHZfY29sb3JzXzNfMD0gcnVsZUNvbG9yICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo0OTU6MzogbHZfY29sb3JzXzNfMD0gcnVsZUNvbG9yCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvcnNBY2Nlc3MoKS5nZXRDb2xvcnNDb2xvclBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ29sb3JfaW5fcnVsZUNvbG9yczkxNSk7CisgICAgICAgICAgICAJICAgIGx2X2NvbG9yc18zXzA9cnVsZUNvbG9yKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JzUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImNvbG9ycyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2NvbG9yc18zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQ29sb3IiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTgsRk9MTE9XXzE4X2luX3J1bGVDb2xvcnM5MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldENvbG9yc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDb2xvcnMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRm9udHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MjM6MTogZW50cnlSdWxlRm9udHMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUZvbnRzPSBydWxlRm9udHMgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVGb250cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlRm9udHMgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTI0OjI6IChpdl9ydWxlRm9udHM9IHJ1bGVGb250cyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MjU6MjogaXZfcnVsZUZvbnRzPSBydWxlRm9udHMgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250c1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZvbnRzX2luX2VudHJ5UnVsZUZvbnRzOTY0KTsKKyAgICAgICAgICAgIGl2X3J1bGVGb250cz1ydWxlRm9udHMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVGb250czsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVGb250czk3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVGb250cyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRm9udHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MzI6MTogcnVsZUZvbnRzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZm9udHMnIG90aGVybHZfMj0gJ3snICggKGx2X2ZvbnRzXzNfMD0gcnVsZUZvbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRm9udHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIEVPYmplY3QgbHZfZm9udHNfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTM1OjI4OiAoICggKCkgb3RoZXJsdl8xPSAnZm9udHMnIG90aGVybHZfMj0gJ3snICggKGx2X2ZvbnRzXzNfMD0gcnVsZUZvbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTM2OjE6ICggKCkgb3RoZXJsdl8xPSAnZm9udHMnIG90aGVybHZfMj0gJ3snICggKGx2X2ZvbnRzXzNfMD0gcnVsZUZvbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjUzNjoxOiAoICgpIG90aGVybHZfMT0gJ2ZvbnRzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9mb250c18zXzA9IHJ1bGVGb250ICkgKSogb3RoZXJsdl80PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MzY6MjogKCkgb3RoZXJsdl8xPSAnZm9udHMnIG90aGVybHZfMj0gJ3snICggKGx2X2ZvbnRzXzNfMD0gcnVsZUZvbnQgKSApKiBvdGhlcmx2XzQ9ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1MzY6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTM3OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0FjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fcnVsZUZvbnRzMTAyMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0tleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZUZvbnRzMTAzMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU1MDoxOiAoIChsdl9mb250c18zXzA9IHJ1bGVGb250ICkgKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDIpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDIwNToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA3OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgIGNhc2UgMjA1OgorICAgICAgICAgICAgICAgIGNhc2UgMjA2OgorICAgICAgICAgICAgICAgIGNhc2UgMjA3OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NTE6MTogKGx2X2ZvbnRzXzNfMD0gcnVsZUZvbnQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTUxOjE6IChsdl9mb250c18zXzA9IHJ1bGVGb250ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1NTI6MzogbHZfZm9udHNfM18wPSBydWxlRm9udAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udHNBY2Nlc3MoKS5nZXRGb250c0ZvbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZvbnRfaW5fcnVsZUZvbnRzMTA1Myk7CisgICAgICAgICAgICAJICAgIGx2X2ZvbnRzXzNfMD1ydWxlRm9udCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZvbnRzUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImZvbnRzIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZm9udHNfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkZvbnQiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlRm9udHMxMDY2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRGb250c0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVGb250cyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVNZWRpYXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1ODA6MTogZW50cnlSdWxlTWVkaWFzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVNZWRpYXM9IHJ1bGVNZWRpYXMgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVNZWRpYXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZU1lZGlhcyA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1ODE6MjogKGl2X3J1bGVNZWRpYXM9IHJ1bGVNZWRpYXMgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTgyOjI6IGl2X3J1bGVNZWRpYXM9IHJ1bGVNZWRpYXMgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVNZWRpYXNfaW5fZW50cnlSdWxlTWVkaWFzMTEwMik7CisgICAgICAgICAgICBpdl9ydWxlTWVkaWFzPXJ1bGVNZWRpYXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVNZWRpYXM7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlTWVkaWFzMTExMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVNZWRpYXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU1lZGlhcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU4OToxOiBydWxlTWVkaWFzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnbWVkaWFzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9tZWRpYXNfM18wPSBydWxlTWVkaWEgKSApKiBvdGhlcmx2XzQ9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlTWVkaWFzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBFT2JqZWN0IGx2X21lZGlhc18zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1OTI6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdtZWRpYXMnIG90aGVybHZfMj0gJ3snICggKGx2X21lZGlhc18zXzA9IHJ1bGVNZWRpYSApICkqIG90aGVybHZfND0gJ30nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1OTM6MTogKCAoKSBvdGhlcmx2XzE9ICdtZWRpYXMnIG90aGVybHZfMj0gJ3snICggKGx2X21lZGlhc18zXzA9IHJ1bGVNZWRpYSApICkqIG90aGVybHZfND0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NTkzOjE6ICggKCkgb3RoZXJsdl8xPSAnbWVkaWFzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9tZWRpYXNfM18wPSBydWxlTWVkaWEgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU5MzoyOiAoKSBvdGhlcmx2XzE9ICdtZWRpYXMnIG90aGVybHZfMj0gJ3snICggKGx2X21lZGlhc18zXzA9IHJ1bGVNZWRpYSApICkqIG90aGVybHZfND0gJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjU5MzoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo1OTQ6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVNZWRpYXMxMTU4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVNZWRpYXMxMTcwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYwNzoxOiAoIChsdl9tZWRpYXNfM18wPSBydWxlTWVkaWEgKSApKgorICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYwODoxOiAobHZfbWVkaWFzXzNfMD0gcnVsZU1lZGlhICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjYwODoxOiAobHZfbWVkaWFzXzNfMD0gcnVsZU1lZGlhICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2MDk6MzogbHZfbWVkaWFzXzNfMD0gcnVsZU1lZGlhCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYXNBY2Nlc3MoKS5nZXRNZWRpYXNNZWRpYVBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlTWVkaWFfaW5fcnVsZU1lZGlhczExOTEpOworICAgICAgICAgICAgCSAgICBsdl9tZWRpYXNfM18wPXJ1bGVNZWRpYSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhc1J1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtZWRpYXMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tZWRpYXNfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIk1lZGlhIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZU1lZGlhczEyMDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVNZWRpYXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlTWVkaWEiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mzc6MTogZW50cnlSdWxlTWVkaWEgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZU1lZGlhPSBydWxlTWVkaWEgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVNZWRpYSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlTWVkaWEgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjM4OjI6IChpdl9ydWxlTWVkaWE9IHJ1bGVNZWRpYSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2Mzk6MjogaXZfcnVsZU1lZGlhPSBydWxlTWVkaWEgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU1lZGlhX2luX2VudHJ5UnVsZU1lZGlhMTI0MCk7CisgICAgICAgICAgICBpdl9ydWxlTWVkaWE9cnVsZU1lZGlhKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlTWVkaWE7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlTWVkaWExMjUwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU1lZGlhIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVNZWRpYSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY0NjoxOiBydWxlTWVkaWEgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ21lZGlhJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZU1lZGlhKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfbmFtZV8xXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY0OToyODogKCAob3RoZXJsdl8wPSAnbWVkaWEnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjUwOjE6IChvdGhlcmx2XzA9ICdtZWRpYScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjUwOjE6IChvdGhlcmx2XzA9ICdtZWRpYScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjUwOjM6IG90aGVybHZfMD0gJ21lZGlhJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVNZWRpYTEyODcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldE1lZGlhQWNjZXNzKCkuZ2V0TWVkaWFLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjU0OjE6ICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2NTU6MTogKGx2X25hbWVfMV8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjU1OjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY1NjozOiBsdl9uYW1lXzFfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfbmFtZV8xXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZU1lZGlhMTMwNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlTWVkaWEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlU3R5bGVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjgwOjE6IGVudHJ5UnVsZVN0eWxlcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlU3R5bGVzPSBydWxlU3R5bGVzIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlU3R5bGVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVTdHlsZXMgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjgxOjI6IChpdl9ydWxlU3R5bGVzPSBydWxlU3R5bGVzIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY4MjoyOiBpdl9ydWxlU3R5bGVzPSBydWxlU3R5bGVzIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlU3R5bGVzX2luX2VudHJ5UnVsZVN0eWxlczEzNDUpOworICAgICAgICAgICAgaXZfcnVsZVN0eWxlcz1ydWxlU3R5bGVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlU3R5bGVzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVN0eWxlczEzNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlU3R5bGVzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVTdHlsZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2ODk6MTogcnVsZVN0eWxlcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3N0eWxlcycgb3RoZXJsdl8yPSAneycgKCAobHZfc3R5bGVzXzNfMD0gcnVsZVN0eWxlICkgKSogb3RoZXJsdl80PSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVN0eWxlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9zdHlsZXNfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjkyOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnc3R5bGVzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9zdHlsZXNfM18wPSBydWxlU3R5bGUgKSApKiBvdGhlcmx2XzQ9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NjkzOjE6ICggKCkgb3RoZXJsdl8xPSAnc3R5bGVzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9zdHlsZXNfM18wPSBydWxlU3R5bGUgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjY5MzoxOiAoICgpIG90aGVybHZfMT0gJ3N0eWxlcycgb3RoZXJsdl8yPSAneycgKCAobHZfc3R5bGVzXzNfMD0gcnVsZVN0eWxlICkgKSogb3RoZXJsdl80PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2OTM6MjogKCkgb3RoZXJsdl8xPSAnc3R5bGVzJyBvdGhlcmx2XzI9ICd7JyAoIChsdl9zdHlsZXNfM18wPSBydWxlU3R5bGUgKSApKiBvdGhlcmx2XzQ9ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo2OTM6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Njk0OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDI0LEZPTExPV18yNF9pbl9ydWxlU3R5bGVzMTQwMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlU3R5bGVzMTQxMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3MDc6MTogKCAobHZfc3R5bGVzXzNfMD0gcnVsZVN0eWxlICkgKSoKKyAgICAgICAgICAgIGxvb3AxMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTI9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3MDg6MTogKGx2X3N0eWxlc18zXzA9IHJ1bGVTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3MDg6MTogKGx2X3N0eWxlc18zXzA9IHJ1bGVTdHlsZSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzA5OjM6IGx2X3N0eWxlc18zXzA9IHJ1bGVTdHlsZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0U3R5bGVzU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVN0eWxlX2luX3J1bGVTdHlsZXMxNDM0KTsKKyAgICAgICAgICAgIAkgICAgbHZfc3R5bGVzXzNfMD1ydWxlU3R5bGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkic3R5bGVzIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfc3R5bGVzXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJTdHlsZSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTgsRk9MTE9XXzE4X2luX3J1bGVTdHlsZXMxNDQ3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlU3R5bGVzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVBhZ2VUZW1wbGF0ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjczNzoxOiBlbnRyeVJ1bGVQYWdlVGVtcGxhdGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVBhZ2VUZW1wbGF0ZT0gcnVsZVBhZ2VUZW1wbGF0ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVBhZ2VUZW1wbGF0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUGFnZVRlbXBsYXRlID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjczODoyOiAoaXZfcnVsZVBhZ2VUZW1wbGF0ZT0gcnVsZVBhZ2VUZW1wbGF0ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3Mzk6MjogaXZfcnVsZVBhZ2VUZW1wbGF0ZT0gcnVsZVBhZ2VUZW1wbGF0ZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBhZ2VUZW1wbGF0ZV9pbl9lbnRyeVJ1bGVQYWdlVGVtcGxhdGUxNDgzKTsKKyAgICAgICAgICAgIGl2X3J1bGVQYWdlVGVtcGxhdGU9cnVsZVBhZ2VUZW1wbGF0ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVBhZ2VUZW1wbGF0ZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVQYWdlVGVtcGxhdGUxNDkzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVBhZ2VUZW1wbGF0ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUGFnZVRlbXBsYXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzQ2OjE6IHJ1bGVQYWdlVGVtcGxhdGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ3BhZ2V0ZW1wbGF0ZScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3R5cGUnICggKGx2X3NpemVfNF8wPSBydWxlUGFnZVNpemVFbnVtICkgKSBvdGhlcmx2XzU9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNl8wPSBydWxlT3JpZW50YXRpb25FbnVtICkgKSBvdGhlcmx2Xzc9ICd0b3BtYXJnaW4nICggKGx2X3RvcE1hcmdpblZhbHVlXzhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl90b3BNYXJnaW5Vbml0XzlfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzEwPSAnbGVmdG1hcmdpbicgKCAobHZfbGVmdE1hcmdpblZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbGVmdE1hcmdpblVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzEzPSAnYm90dG9tbWFyZ2luJyAoIChsdl9ib3R0b21NYXJnaW5WYWx1ZV8xNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X2JvdHRvbU1hcmdpblVuaXRfMTVfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzE2PSAncmlnaHRtYXJnaW4nICggKGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9yaWdodE1hcmdpblVuaXRfMThfMD0gcnVsZVVuaXRFbnVtICkgKSAoIChsdl9oZWFkZXJfMTlfMD0gcnVsZVBhZ2VIZWFkZXIgKSApPyAoIChsdl9mb290ZXJfMjBfMD0gcnVsZVBhZ2VGb290ZXIgKSApPyBvdGhlcmx2XzIxPSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVBhZ2VUZW1wbGF0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X25hbWVfMV8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNz1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzIxPW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfc2l6ZV80XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfb3JpZW50YXRpb25fNl8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X3RvcE1hcmdpblZhbHVlXzhfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl90b3BNYXJnaW5Vbml0XzlfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9sZWZ0TWFyZ2luVmFsdWVfMTFfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X2JvdHRvbU1hcmdpblZhbHVlXzE0XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfYm90dG9tTWFyZ2luVW5pdF8xNV8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9yaWdodE1hcmdpblVuaXRfMThfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9oZWFkZXJfMTlfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9mb290ZXJfMjBfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc0OToyODogKCAob3RoZXJsdl8wPSAncGFnZXRlbXBsYXRlJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndHlwZScgKCAobHZfc2l6ZV80XzA9IHJ1bGVQYWdlU2l6ZUVudW0gKSApIG90aGVybHZfNT0gJ29yaWVudGF0aW9uJyAoIChsdl9vcmllbnRhdGlvbl82XzA9IHJ1bGVPcmllbnRhdGlvbkVudW0gKSApIG90aGVybHZfNz0gJ3RvcG1hcmdpbicgKCAobHZfdG9wTWFyZ2luVmFsdWVfOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3RvcE1hcmdpblVuaXRfOV8wPSBydWxlVW5pdEVudW0gKSApIG90aGVybHZfMTA9ICdsZWZ0bWFyZ2luJyAoIChsdl9sZWZ0TWFyZ2luVmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApIG90aGVybHZfMTM9ICdib3R0b21tYXJnaW4nICggKGx2X2JvdHRvbU1hcmdpblZhbHVlXzE0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfYm90dG9tTWFyZ2luVW5pdF8xNV8wPSBydWxlVW5pdEVudW0gKSApIG90aGVybHZfMTY9ICdyaWdodG1hcmdpbicgKCAobHZfcmlnaHRNYXJnaW5WYWx1ZV8xN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3JpZ2h0TWFyZ2luVW5pdF8xOF8wPSBydWxlVW5pdEVudW0gKSApICggKGx2X2hlYWRlcl8xOV8wPSBydWxlUGFnZUhlYWRlciApICk/ICggKGx2X2Zvb3Rlcl8yMF8wPSBydWxlUGFnZUZvb3RlciApICk/IG90aGVybHZfMjE9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzUwOjE6IChvdGhlcmx2XzA9ICdwYWdldGVtcGxhdGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd0eXBlJyAoIChsdl9zaXplXzRfMD0gcnVsZVBhZ2VTaXplRW51bSApICkgb3RoZXJsdl81PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzZfMD0gcnVsZU9yaWVudGF0aW9uRW51bSApICkgb3RoZXJsdl83PSAndG9wbWFyZ2luJyAoIChsdl90b3BNYXJnaW5WYWx1ZV84XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfdG9wTWFyZ2luVW5pdF85XzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xMD0gJ2xlZnRtYXJnaW4nICggKGx2X2xlZnRNYXJnaW5WYWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X2xlZnRNYXJnaW5Vbml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xMz0gJ2JvdHRvbW1hcmdpbicgKCAobHZfYm90dG9tTWFyZ2luVmFsdWVfMTRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xNj0gJ3JpZ2h0bWFyZ2luJyAoIChsdl9yaWdodE1hcmdpblZhbHVlXzE3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcmlnaHRNYXJnaW5Vbml0XzE4XzA9IHJ1bGVVbml0RW51bSApICkgKCAobHZfaGVhZGVyXzE5XzA9IHJ1bGVQYWdlSGVhZGVyICkgKT8gKCAobHZfZm9vdGVyXzIwXzA9IHJ1bGVQYWdlRm9vdGVyICkgKT8gb3RoZXJsdl8yMT0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzUwOjE6IChvdGhlcmx2XzA9ICdwYWdldGVtcGxhdGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd0eXBlJyAoIChsdl9zaXplXzRfMD0gcnVsZVBhZ2VTaXplRW51bSApICkgb3RoZXJsdl81PSAnb3JpZW50YXRpb24nICggKGx2X29yaWVudGF0aW9uXzZfMD0gcnVsZU9yaWVudGF0aW9uRW51bSApICkgb3RoZXJsdl83PSAndG9wbWFyZ2luJyAoIChsdl90b3BNYXJnaW5WYWx1ZV84XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfdG9wTWFyZ2luVW5pdF85XzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xMD0gJ2xlZnRtYXJnaW4nICggKGx2X2xlZnRNYXJnaW5WYWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X2xlZnRNYXJnaW5Vbml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xMz0gJ2JvdHRvbW1hcmdpbicgKCAobHZfYm90dG9tTWFyZ2luVmFsdWVfMTRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzA9IHJ1bGVVbml0RW51bSApICkgb3RoZXJsdl8xNj0gJ3JpZ2h0bWFyZ2luJyAoIChsdl9yaWdodE1hcmdpblZhbHVlXzE3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcmlnaHRNYXJnaW5Vbml0XzE4XzA9IHJ1bGVVbml0RW51bSApICkgKCAobHZfaGVhZGVyXzE5XzA9IHJ1bGVQYWdlSGVhZGVyICkgKT8gKCAobHZfZm9vdGVyXzIwXzA9IHJ1bGVQYWdlRm9vdGVyICkgKT8gb3RoZXJsdl8yMT0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzUwOjM6IG90aGVybHZfMD0gJ3BhZ2V0ZW1wbGF0ZScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3R5cGUnICggKGx2X3NpemVfNF8wPSBydWxlUGFnZVNpemVFbnVtICkgKSBvdGhlcmx2XzU9ICdvcmllbnRhdGlvbicgKCAobHZfb3JpZW50YXRpb25fNl8wPSBydWxlT3JpZW50YXRpb25FbnVtICkgKSBvdGhlcmx2Xzc9ICd0b3BtYXJnaW4nICggKGx2X3RvcE1hcmdpblZhbHVlXzhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl90b3BNYXJnaW5Vbml0XzlfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzEwPSAnbGVmdG1hcmdpbicgKCAobHZfbGVmdE1hcmdpblZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbGVmdE1hcmdpblVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzEzPSAnYm90dG9tbWFyZ2luJyAoIChsdl9ib3R0b21NYXJnaW5WYWx1ZV8xNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X2JvdHRvbU1hcmdpblVuaXRfMTVfMD0gcnVsZVVuaXRFbnVtICkgKSBvdGhlcmx2XzE2PSAncmlnaHRtYXJnaW4nICggKGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9yaWdodE1hcmdpblVuaXRfMThfMD0gcnVsZVVuaXRFbnVtICkgKSAoIChsdl9oZWFkZXJfMTlfMD0gcnVsZVBhZ2VIZWFkZXIgKSApPyAoIChsdl9mb290ZXJfMjBfMD0gcnVsZVBhZ2VGb290ZXIgKSApPyBvdGhlcmx2XzIxPSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjUsRk9MTE9XXzI1X2luX3J1bGVQYWdlVGVtcGxhdGUxNTMwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRQYWdldGVtcGxhdGVLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzU0OjE6ICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3NTU6MTogKGx2X25hbWVfMV8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzU1OjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc1NjozOiBsdl9uYW1lXzFfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfbmFtZV8xXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE1NDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE1NjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX3J1bGVQYWdlVGVtcGxhdGUxNTc2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUeXBlS2V5d29yZF8zKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc4MDoxOiAoIChsdl9zaXplXzRfMD0gcnVsZVBhZ2VTaXplRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6NzgxOjE6IChsdl9zaXplXzRfMD0gcnVsZVBhZ2VTaXplRW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjc4MToxOiAobHZfc2l6ZV80XzA9IHJ1bGVQYWdlU2l6ZUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo3ODI6MzogbHZfc2l6ZV80XzA9IHJ1bGVQYWdlU2l6ZUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRTaXplUGFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzRfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUGFnZVNpemVFbnVtX2luX3J1bGVQYWdlVGVtcGxhdGUxNTk3KTsKKyAgICAgICAgICAgIGx2X3NpemVfNF8wPXJ1bGVQYWdlU2l6ZUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkic2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9zaXplXzRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUGFnZVNpemVFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwyNyxGT0xMT1dfMjdfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE2MDkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldE9yaWVudGF0aW9uS2V5d29yZF81KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgwMjoxOiAoIChsdl9vcmllbnRhdGlvbl82XzA9IHJ1bGVPcmllbnRhdGlvbkVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgwMzoxOiAobHZfb3JpZW50YXRpb25fNl8wPSBydWxlT3JpZW50YXRpb25FbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODAzOjE6IChsdl9vcmllbnRhdGlvbl82XzA9IHJ1bGVPcmllbnRhdGlvbkVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MDQ6MzogbHZfb3JpZW50YXRpb25fNl8wPSBydWxlT3JpZW50YXRpb25FbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0T3JpZW50YXRpb25PcmllbnRhdGlvbkVudW1FbnVtUnVsZUNhbGxfNl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcmllbnRhdGlvbkVudW1faW5fcnVsZVBhZ2VUZW1wbGF0ZTE2MzApOworICAgICAgICAgICAgbHZfb3JpZW50YXRpb25fNl8wPXJ1bGVPcmllbnRhdGlvbkVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkib3JpZW50YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfb3JpZW50YXRpb25fNl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJPcmllbnRhdGlvbkVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2Xzc9KFRva2VuKW1hdGNoKGlucHV0LDI4LEZPTExPV18yOF9pbl9ydWxlUGFnZVRlbXBsYXRlMTY0Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0VG9wbWFyZ2luS2V5d29yZF83KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgyNDoxOiAoIChsdl90b3BNYXJnaW5WYWx1ZV84XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODI1OjE6IChsdl90b3BNYXJnaW5WYWx1ZV84XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjgyNToxOiAobHZfdG9wTWFyZ2luVmFsdWVfOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4MjY6MzogbHZfdG9wTWFyZ2luVmFsdWVfOF8wPSBydWxlVW5zaWduZWROdW1iZXIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRUb3BNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfOF8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbnNpZ25lZE51bWJlcl9pbl9ydWxlUGFnZVRlbXBsYXRlMTY2Myk7CisgICAgICAgICAgICBsdl90b3BNYXJnaW5WYWx1ZV84XzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInRvcE1hcmdpblZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3RvcE1hcmdpblZhbHVlXzhfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg0MjoyOiAoIChsdl90b3BNYXJnaW5Vbml0XzlfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDM6MTogKGx2X3RvcE1hcmdpblVuaXRfOV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDM6MTogKGx2X3RvcE1hcmdpblVuaXRfOV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NDQ6MzogbHZfdG9wTWFyZ2luVW5pdF85XzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFRvcE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF85XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVQYWdlVGVtcGxhdGUxNjg0KTsKKyAgICAgICAgICAgIGx2X3RvcE1hcmdpblVuaXRfOV8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJ0b3BNYXJnaW5Vbml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3RvcE1hcmdpblVuaXRfOV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDI5LEZPTExPV18yOV9pbl9ydWxlUGFnZVRlbXBsYXRlMTY5Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRtYXJnaW5LZXl3b3JkXzEwKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg2NDoxOiAoIChsdl9sZWZ0TWFyZ2luVmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NjU6MTogKGx2X2xlZnRNYXJnaW5WYWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NjU6MTogKGx2X2xlZnRNYXJnaW5WYWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4NjY6MzogbHZfbGVmdE1hcmdpblZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldExlZnRNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTFfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE3MTcpOworICAgICAgICAgICAgbHZfbGVmdE1hcmdpblZhbHVlXzExXzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJImxlZnRNYXJnaW5WYWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9sZWZ0TWFyZ2luVmFsdWVfMTFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg4MjoyOiAoIChsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjg4MzoxOiAobHZfbGVmdE1hcmdpblVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6ODgzOjE6IChsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo4ODQ6MzogbHZfbGVmdE1hcmdpblVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0TGVmdE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8xMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbml0RW51bV9pbl9ydWxlUGFnZVRlbXBsYXRlMTczOCk7CisgICAgICAgICAgICBsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJsZWZ0TWFyZ2luVW5pdCIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9sZWZ0TWFyZ2luVW5pdF8xMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMTM9KFRva2VuKW1hdGNoKGlucHV0LDMwLEZPTExPV18zMF9pbl9ydWxlUGFnZVRlbXBsYXRlMTc1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEJvdHRvbW1hcmdpbktleXdvcmRfMTMoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTA0OjE6ICggKGx2X2JvdHRvbU1hcmdpblZhbHVlXzE0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTA1OjE6IChsdl9ib3R0b21NYXJnaW5WYWx1ZV8xNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5MDU6MTogKGx2X2JvdHRvbU1hcmdpblZhbHVlXzE0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkwNjozOiBsdl9ib3R0b21NYXJnaW5WYWx1ZV8xNF8wPSBydWxlVW5zaWduZWROdW1iZXIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21NYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTRfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE3NzEpOworICAgICAgICAgICAgbHZfYm90dG9tTWFyZ2luVmFsdWVfMTRfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiYm90dG9tTWFyZ2luVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfYm90dG9tTWFyZ2luVmFsdWVfMTRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkyMjoyOiAoIChsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTIzOjE6IChsdl9ib3R0b21NYXJnaW5Vbml0XzE1XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjkyMzoxOiAobHZfYm90dG9tTWFyZ2luVW5pdF8xNV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5MjQ6MzogbHZfYm90dG9tTWFyZ2luVW5pdF8xNV8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRCb3R0b21NYXJnaW5Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMTVfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZVBhZ2VUZW1wbGF0ZTE3OTIpOworICAgICAgICAgICAgbHZfYm90dG9tTWFyZ2luVW5pdF8xNV8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJib3R0b21NYXJnaW5Vbml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2JvdHRvbU1hcmdpblVuaXRfMTVfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVW5pdEVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE2PShUb2tlbiltYXRjaChpbnB1dCwzMSxGT0xMT1dfMzFfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE4MDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodG1hcmdpbktleXdvcmRfMTYoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTQ0OjE6ICggKGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5NDU6MTogKGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTQ1OjE6IChsdl9yaWdodE1hcmdpblZhbHVlXzE3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk0NjozOiBsdl9yaWdodE1hcmdpblZhbHVlXzE3XzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0TWFyZ2luVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzE3XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVQYWdlVGVtcGxhdGUxODI1KTsKKyAgICAgICAgICAgIGx2X3JpZ2h0TWFyZ2luVmFsdWVfMTdfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicmlnaHRNYXJnaW5WYWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yaWdodE1hcmdpblZhbHVlXzE3XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzo5NjI6MjogKCAobHZfcmlnaHRNYXJnaW5Vbml0XzE4XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTYzOjE6IChsdl9yaWdodE1hcmdpblVuaXRfMThfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTYzOjE6IChsdl9yaWdodE1hcmdpblVuaXRfMThfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTY0OjM6IGx2X3JpZ2h0TWFyZ2luVW5pdF8xOF8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKS5nZXRSaWdodE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8xOF8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbml0RW51bV9pbl9ydWxlUGFnZVRlbXBsYXRlMTg0Nik7CisgICAgICAgICAgICBsdl9yaWdodE1hcmdpblVuaXRfMThfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicmlnaHRNYXJnaW5Vbml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3JpZ2h0TWFyZ2luVW5pdF8xOF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTgwOjI6ICggKGx2X2hlYWRlcl8xOV8wPSBydWxlUGFnZUhlYWRlciApICk/CisgICAgICAgICAgICBpbnQgYWx0MTM9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgNzU6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTgxOjE6IChsdl9oZWFkZXJfMTlfMD0gcnVsZVBhZ2VIZWFkZXIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6OTgxOjE6IChsdl9oZWFkZXJfMTlfMD0gcnVsZVBhZ2VIZWFkZXIgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk4MjozOiBsdl9oZWFkZXJfMTlfMD0gcnVsZVBhZ2VIZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldEhlYWRlclBhZ2VIZWFkZXJQYXJzZXJSdWxlQ2FsbF8xOV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVQYWdlSGVhZGVyX2luX3J1bGVQYWdlVGVtcGxhdGUxODY3KTsKKyAgICAgICAgICAgICAgICAgICAgbHZfaGVhZGVyXzE5XzA9cnVsZVBhZ2VIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfaGVhZGVyXzE5XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiUGFnZUhlYWRlciIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk5ODozOiAoIChsdl9mb290ZXJfMjBfMD0gcnVsZVBhZ2VGb290ZXIgKSApPworICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk5OToxOiAobHZfZm9vdGVyXzIwXzA9IHJ1bGVQYWdlRm9vdGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjk5OToxOiAobHZfZm9vdGVyXzIwXzA9IHJ1bGVQYWdlRm9vdGVyICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDAwOjM6IGx2X2Zvb3Rlcl8yMF8wPSBydWxlUGFnZUZvb3RlcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0Rm9vdGVyUGFnZUZvb3RlclBhcnNlclJ1bGVDYWxsXzIwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVBhZ2VGb290ZXJfaW5fcnVsZVBhZ2VUZW1wbGF0ZTE4ODkpOworICAgICAgICAgICAgICAgICAgICBsdl9mb290ZXJfMjBfMD1ydWxlUGFnZUZvb3RlcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJmb290ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9mb290ZXJfMjBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJQYWdlRm9vdGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMjE9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlUGFnZVRlbXBsYXRlMTkwMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIxLCBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUGFnZVRlbXBsYXRlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVVuc2lnbmVkTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAyODoxOiBlbnRyeVJ1bGVVbnNpZ25lZE51bWJlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVVbnNpZ25lZE51bWJlcj0gcnVsZVVuc2lnbmVkTnVtYmVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVVbnNpZ25lZE51bWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVVbnNpZ25lZE51bWJlciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDI5OjI6IChpdl9ydWxlVW5zaWduZWROdW1iZXI9IHJ1bGVVbnNpZ25lZE51bWJlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDMwOjI6IGl2X3J1bGVVbnNpZ25lZE51bWJlcj0gcnVsZVVuc2lnbmVkTnVtYmVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5zaWduZWROdW1iZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbnNpZ25lZE51bWJlcl9pbl9lbnRyeVJ1bGVVbnNpZ25lZE51bWJlcjE5MzkpOworICAgICAgICAgICAgaXZfcnVsZVVuc2lnbmVkTnVtYmVyPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVVuc2lnbmVkTnVtYmVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVVbnNpZ25lZE51bWJlcjE5NTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlVW5zaWduZWROdW1iZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVVuc2lnbmVkTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTAzNzoxOiBydWxlVW5zaWduZWROdW1iZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19OdW1iZXJfMD0gcnVsZU51bWJlciA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZVVuc2lnbmVkTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHRoaXNfTnVtYmVyXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDQwOjI4OiAodGhpc19OdW1iZXJfMD0gcnVsZU51bWJlciApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNDI6NTogdGhpc19OdW1iZXJfMD0gcnVsZU51bWJlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VW5zaWduZWROdW1iZXJBY2Nlc3MoKS5nZXROdW1iZXJQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVOdW1iZXJfaW5fcnVsZVVuc2lnbmVkTnVtYmVyMTk5Nik7CisgICAgICAgICAgICB0aGlzX051bWJlcl8wPXJ1bGVOdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCWN1cnJlbnQubWVyZ2UodGhpc19OdW1iZXJfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVVuc2lnbmVkTnVtYmVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNvbG9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA2MDoxOiBlbnRyeVJ1bGVDb2xvciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ29sb3I9IHJ1bGVDb2xvciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNvbG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDb2xvciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDYxOjI6IChpdl9ydWxlQ29sb3I9IHJ1bGVDb2xvciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDYyOjI6IGl2X3J1bGVDb2xvcj0gcnVsZUNvbG9yIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDb2xvcl9pbl9lbnRyeVJ1bGVDb2xvcjIwNDApOworICAgICAgICAgICAgaXZfcnVsZUNvbG9yPXJ1bGVDb2xvcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNvbG9yOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNvbG9yMjA1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDb2xvciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ29sb3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDY5OjE6IHJ1bGVDb2xvciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnY29sb3InICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSAoICggKGx2X2NvbG9yXzJfMD0gUlVMRV9TVFJJTkcgKSApIHwgKG90aGVybHZfMz0gJ2RhcmtlbnMnICggKG90aGVybHZfND0gUlVMRV9JRCApICkgb3RoZXJsdl81PSAnYnktcGVyY2VudCcgKCAobHZfZGFya2Vuc2J5XzZfMD0gUlVMRV9JTlQgKSApICkgfCAob3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2XzExPSAndHJhbnNmb3JtcycgKCAob3RoZXJsdl8xMj0gUlVMRV9JRCApICkgb3RoZXJsdl8xMz0gJ2J5LXBlcmNlbnQnICggKGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVCApICkgb3RoZXJsdl8xNT0gJ3Rvd2FyZHMnICggKG90aGVybHZfMTY9IFJVTEVfSUQgKSApICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9uYW1lXzFfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9jb2xvcl8yXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzU9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGFya2Vuc2J5XzZfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzc9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl84PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBUb2tlbiBsdl9saWdodGVuc2J5XzEwXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEyPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTM9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfdHJhbnNmb3Jtc2J5XzE0XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE2PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDcyOjI4OiAoIChvdGhlcmx2XzA9ICdjb2xvcicgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApICggKCAobHZfY29sb3JfMl8wPSBSVUxFX1NUUklORyApICkgfCAob3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2Xzc9ICdsaWdodGVucycgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSBvdGhlcmx2Xzk9ICdieS1wZXJjZW50JyAoIChsdl9saWdodGVuc2J5XzEwXzA9IFJVTEVfSU5UICkgKSApIHwgKG90aGVybHZfMTE9ICd0cmFuc2Zvcm1zJyAoIChvdGhlcmx2XzEyPSBSVUxFX0lEICkgKSBvdGhlcmx2XzEzPSAnYnktcGVyY2VudCcgKCAobHZfdHJhbnNmb3Jtc2J5XzE0XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2XzE1PSAndG93YXJkcycgKCAob3RoZXJsdl8xNj0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDczOjE6IChvdGhlcmx2XzA9ICdjb2xvcicgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApICggKCAobHZfY29sb3JfMl8wPSBSVUxFX1NUUklORyApICkgfCAob3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2Xzc9ICdsaWdodGVucycgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSBvdGhlcmx2Xzk9ICdieS1wZXJjZW50JyAoIChsdl9saWdodGVuc2J5XzEwXzA9IFJVTEVfSU5UICkgKSApIHwgKG90aGVybHZfMTE9ICd0cmFuc2Zvcm1zJyAoIChvdGhlcmx2XzEyPSBSVUxFX0lEICkgKSBvdGhlcmx2XzEzPSAnYnktcGVyY2VudCcgKCAobHZfdHJhbnNmb3Jtc2J5XzE0XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2XzE1PSAndG93YXJkcycgKCAob3RoZXJsdl8xNj0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA3MzoxOiAob3RoZXJsdl8wPSAnY29sb3InICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSAoICggKGx2X2NvbG9yXzJfMD0gUlVMRV9TVFJJTkcgKSApIHwgKG90aGVybHZfMz0gJ2RhcmtlbnMnICggKG90aGVybHZfND0gUlVMRV9JRCApICkgb3RoZXJsdl81PSAnYnktcGVyY2VudCcgKCAobHZfZGFya2Vuc2J5XzZfMD0gUlVMRV9JTlQgKSApICkgfCAob3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2XzExPSAndHJhbnNmb3JtcycgKCAob3RoZXJsdl8xMj0gUlVMRV9JRCApICkgb3RoZXJsdl8xMz0gJ2J5LXBlcmNlbnQnICggKGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVCApICkgb3RoZXJsdl8xNT0gJ3Rvd2FyZHMnICggKG90aGVybHZfMTY9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNzM6Mzogb3RoZXJsdl8wPSAnY29sb3InICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSAoICggKGx2X2NvbG9yXzJfMD0gUlVMRV9TVFJJTkcgKSApIHwgKG90aGVybHZfMz0gJ2RhcmtlbnMnICggKG90aGVybHZfND0gUlVMRV9JRCApICkgb3RoZXJsdl81PSAnYnktcGVyY2VudCcgKCAobHZfZGFya2Vuc2J5XzZfMD0gUlVMRV9JTlQgKSApICkgfCAob3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2XzExPSAndHJhbnNmb3JtcycgKCAob3RoZXJsdl8xMj0gUlVMRV9JRCApICkgb3RoZXJsdl8xMz0gJ2J5LXBlcmNlbnQnICggKGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVCApICkgb3RoZXJsdl8xNT0gJ3Rvd2FyZHMnICggKG90aGVybHZfMTY9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCwzMixGT0xMT1dfMzJfaW5fcnVsZUNvbG9yMjA4Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvcktleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDc3OjE6ICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDc4OjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwNzg6MTogKGx2X25hbWVfMV8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTA3OTozOiBsdl9uYW1lXzFfMD0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfbmFtZV8xXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUNvbG9yMjEwNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDk1OjI6ICggKCAobHZfY29sb3JfMl8wPSBSVUxFX1NUUklORyApICkgfCAob3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkgKSB8IChvdGhlcmx2Xzc9ICdsaWdodGVucycgKCAob3RoZXJsdl84PSBSVUxFX0lEICkgKSBvdGhlcmx2Xzk9ICdieS1wZXJjZW50JyAoIChsdl9saWdodGVuc2J5XzEwXzA9IFJVTEVfSU5UICkgKSApIHwgKG90aGVybHZfMTE9ICd0cmFuc2Zvcm1zJyAoIChvdGhlcmx2XzEyPSBSVUxFX0lEICkgKSBvdGhlcmx2XzEzPSAnYnktcGVyY2VudCcgKCAobHZfdHJhbnNmb3Jtc2J5XzE0XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2XzE1PSAndG93YXJkcycgKCAob3RoZXJsdl8xNj0gUlVMRV9JRCApICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTU9NDsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBSVUxFX1NUUklORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDE1PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTU9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwOTU6MzogKCAobHZfY29sb3JfMl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwOTU6MzogKCAobHZfY29sb3JfMl8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMDk2OjE6IChsdl9jb2xvcl8yXzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwOTY6MTogKGx2X2NvbG9yXzJfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEwOTc6MzogbHZfY29sb3JfMl8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X2NvbG9yXzJfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVDb2xvcjIxMjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl9jb2xvcl8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvclNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImNvbG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfY29sb3JfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTExNDo2OiAob3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTExNDo2OiAob3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMTQ6ODogb3RoZXJsdl8zPSAnZGFya2VucycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSBvdGhlcmx2XzU9ICdieS1wZXJjZW50JyAoIChsdl9kYXJrZW5zYnlfNl8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDMzLEZPTExPV18zM19pbl9ydWxlQ29sb3IyMTUxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXREYXJrZW5zS2V5d29yZF8yXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTE4OjE6ICggKG90aGVybHZfND0gUlVMRV9JRCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTE5OjE6IChvdGhlcmx2XzQ9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTExOToxOiAob3RoZXJsdl80PSBSVUxFX0lEICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTIwOjM6IG90aGVybHZfND0gUlVMRV9JRAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUNvbG9yMjE3MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QmFzZWNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfMzRfaW5fcnVsZUNvbG9yMjE4Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzFfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTM1OjE6ICggKGx2X2RhcmtlbnNieV82XzA9IFJVTEVfSU5UICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMzY6MTogKGx2X2RhcmtlbnNieV82XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExMzY6MTogKGx2X2RhcmtlbnNieV82XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTM3OjM6IGx2X2RhcmtlbnNieV82XzA9IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbHZfZGFya2Vuc2J5XzZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XX1JVTEVfSU5UX2luX3J1bGVDb2xvcjIyMDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl9kYXJrZW5zYnlfNl8wLCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0RGFya2Vuc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfM18wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJkYXJrZW5zYnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9kYXJrZW5zYnlfNl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIklOVCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE1NDo2OiAob3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE1NDo2OiAob3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNTQ6ODogb3RoZXJsdl83PSAnbGlnaHRlbnMnICggKG90aGVybHZfOD0gUlVMRV9JRCApICkgb3RoZXJsdl85PSAnYnktcGVyY2VudCcgKCAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2Xzc9KFRva2VuKW1hdGNoKGlucHV0LDM1LEZPTExPV18zNV9pbl9ydWxlQ29sb3IyMjI1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JBY2Nlc3MoKS5nZXRMaWdodGVuc0tleXdvcmRfMl8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE1ODoxOiAoIChvdGhlcmx2Xzg9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE1OToxOiAob3RoZXJsdl84PSBSVUxFX0lEICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNTk6MTogKG90aGVybHZfOD0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE2MDozOiBvdGhlcmx2Xzg9IFJVTEVfSUQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDb2xvclJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVDb2xvcjIyNDUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8yXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsMzQsRk9MTE9XXzM0X2luX3J1bGVDb2xvcjIyNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJ5UGVyY2VudEtleXdvcmRfMl8yXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE3NToxOiAoIChsdl9saWdodGVuc2J5XzEwXzA9IFJVTEVfSU5UICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExNzY6MTogKGx2X2xpZ2h0ZW5zYnlfMTBfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE3NjoxOiAobHZfbGlnaHRlbnNieV8xMF8wPSBSVUxFX0lOVCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE3NzozOiBsdl9saWdodGVuc2J5XzEwXzA9IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbHZfbGlnaHRlbnNieV8xMF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lOVCxGT0xMT1dfUlVMRV9JTlRfaW5fcnVsZUNvbG9yMjI3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2xpZ2h0ZW5zYnlfMTBfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldExpZ2h0ZW5zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfMl8zXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImxpZ2h0ZW5zYnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9saWdodGVuc2J5XzEwXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiSU5UIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMTk0OjY6IChvdGhlcmx2XzExPSAndHJhbnNmb3JtcycgKCAob3RoZXJsdl8xMj0gUlVMRV9JRCApICkgb3RoZXJsdl8xMz0gJ2J5LXBlcmNlbnQnICggKGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVCApICkgb3RoZXJsdl8xNT0gJ3Rvd2FyZHMnICggKG90aGVybHZfMTY9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExOTQ6NjogKG90aGVybHZfMTE9ICd0cmFuc2Zvcm1zJyAoIChvdGhlcmx2XzEyPSBSVUxFX0lEICkgKSBvdGhlcmx2XzEzPSAnYnktcGVyY2VudCcgKCAobHZfdHJhbnNmb3Jtc2J5XzE0XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2XzE1PSAndG93YXJkcycgKCAob3RoZXJsdl8xNj0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExOTQ6ODogb3RoZXJsdl8xMT0gJ3RyYW5zZm9ybXMnICggKG90aGVybHZfMTI9IFJVTEVfSUQgKSApIG90aGVybHZfMTM9ICdieS1wZXJjZW50JyAoIChsdl90cmFuc2Zvcm1zYnlfMTRfMD0gUlVMRV9JTlQgKSApIG90aGVybHZfMTU9ICd0b3dhcmRzJyAoIChvdGhlcmx2XzE2PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LDM2LEZPTExPV18zNl9pbl9ydWxlQ29sb3IyMjk5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc0tleXdvcmRfMl8zXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5ODoxOiAoIChvdGhlcmx2XzEyPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjExOTk6MTogKG90aGVybHZfMTI9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTE5OToxOiAob3RoZXJsdl8xMj0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIwMDozOiBvdGhlcmx2XzEyPSBSVUxFX0lECisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUNvbG9yMjMxOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldEJhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8zXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTM9KFRva2VuKW1hdGNoKGlucHV0LDM0LEZPTExPV18zNF9pbl9ydWxlQ29sb3IyMzMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0QnlQZXJjZW50S2V5d29yZF8yXzNfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjE1OjE6ICggKGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjE2OjE6IChsdl90cmFuc2Zvcm1zYnlfMTRfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIxNjoxOiAobHZfdHJhbnNmb3Jtc2J5XzE0XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjE3OjM6IGx2X3RyYW5zZm9ybXNieV8xNF8wPSBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X3RyYW5zZm9ybXNieV8xNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lOVCxGT0xMT1dfUlVMRV9JTlRfaW5fcnVsZUNvbG9yMjM0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X3RyYW5zZm9ybXNieV8xNF8wLCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VHJhbnNmb3Jtc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzNfM18wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJ0cmFuc2Zvcm1zYnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl90cmFuc2Zvcm1zYnlfMTRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJJTlQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTU9KFRva2VuKW1hdGNoKGlucHV0LDM3LEZPTExPV18zN19pbl9ydWxlQ29sb3IyMzY1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldENvbG9yQWNjZXNzKCkuZ2V0VG93YXJkc0tleXdvcmRfMl8zXzQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzNzoxOiAoIChvdGhlcmx2XzE2PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyMzg6MTogKG90aGVybHZfMTY9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzODoxOiAob3RoZXJsdl8xNj0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTIzOTozOiBvdGhlcmx2XzE2PSBSVUxFX0lECisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q29sb3JSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMTY9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUNvbG9yMjM4NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXRDb2xvckFjY2VzcygpLmdldFRhcmdldGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzNfNV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNvbG9yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUZvbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjU4OjE6IGVudHJ5UnVsZUZvbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUZvbnQ9IHJ1bGVGb250IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlRm9udCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlRm9udCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjU5OjI6IChpdl9ydWxlRm9udD0gcnVsZUZvbnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI2MDoyOiBpdl9ydWxlRm9udD0gcnVsZUZvbnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRm9udF9pbl9lbnRyeVJ1bGVGb250MjQyMyk7CisgICAgICAgICAgICBpdl9ydWxlRm9udD1ydWxlRm9udCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUZvbnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlRm9udDI0MzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRm9udCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRm9udCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNjc6MTogcnVsZUZvbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ib2xkXzlfMD0gJ2JvbGQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKSApICkrIHsuLi59PykgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRm9udCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIGx2X25hbWVfMl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMz1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBsdl9ib2xkXzlfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTM9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9mYW1pbHlfN18wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X3N0eWxlXzhfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9zaXpldmFsdWVfMTFfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9zaXpldW5pdF8xMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI3MDoyODogKCAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSsgey4uLn0/KSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjcxOjE6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMT0gJ2ZvbnQnICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd7JyAob3RoZXJsdl80PSAnZXh0ZW5kcycgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKyB7Li4ufT8pICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjcxOjE6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMT0gJ2ZvbnQnICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd7JyAob3RoZXJsdl80PSAnZXh0ZW5kcycgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKyB7Li4ufT8pICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjczOjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSsgey4uLn0/KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNzM6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMT0gJ2ZvbnQnICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd7JyAob3RoZXJsdl80PSAnZXh0ZW5kcycgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKyB7Li4ufT8pICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI3NDoyOiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMT0gJ2ZvbnQnICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd7JyAob3RoZXJsdl80PSAnZXh0ZW5kcycgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKyB7Li4ufT8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjc3OjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ib2xkXzlfMD0gJ2JvbGQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKSApICkrIHsuLi59PykKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI3ODozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSsgey4uLn0/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyNzg6MzogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9ib2xkXzlfMD0gJ2JvbGQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKSApICkrCisgICAgICAgICAgICBpbnQgY250MTk9MDsKKyAgICAgICAgICAgIGxvb3AxOToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTk9NTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE5XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTk9NDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE5XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTk9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIwNToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExOV8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE5PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDY6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTlfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOT0yOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjA3OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE5XzUgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTk9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE5XzYgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTk9MzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE5XzcgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTk9NDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyODA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMT0gJ2ZvbnQnICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzM9ICd7JyAob3RoZXJsdl80PSAnZXh0ZW5kcycgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApPyAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8gKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI4MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI4MTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlRm9udCIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI4MTo5OTogKCAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTI4Mjo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDApOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyODU6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg1Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xPSAnZm9udCcgKCAobHZfbmFtZV8yXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICk/IChvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKSApPyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVGb250IiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyODU6MTY6IChvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg1OjE4OiBvdGhlcmx2XzE9ICdmb250JyAoIChsdl9uYW1lXzJfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8gKG90aGVybHZfNj0gJ2ZhbWlseScgKCAobHZfZmFtaWx5XzdfMD0gcnVsZUZvbnRGYW1pbHkgKSApICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzOCxGT0xMT1dfMzhfaW5fcnVsZUZvbnQyNTE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEZvbnRLZXl3b3JkXzBfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjg5OjE6ICggKGx2X25hbWVfMl8wPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyOTA6MTogKGx2X25hbWVfMl8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEyOTA6MTogKGx2X25hbWVfMl8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMjkxOjM6IGx2X25hbWVfMl8wPSBSVUxFX0lECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfbmFtZV8yXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUZvbnQyNTMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIklEIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlRm9udDI1NDkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMTE6MTogKG90aGVybHZfND0gJ2V4dGVuZHMnICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMxMTozOiBvdGhlcmx2XzQ9ICdleHRlbmRzJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMzksRk9MTE9XXzM5X2luX3J1bGVGb250MjU2Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMF8zXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMxNToxOiAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzE2OjE6IChvdGhlcmx2XzU9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMTY6MTogKG90aGVybHZfNT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzE3OjM6IG90aGVybHZfNT0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUZvbnQyNTgyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRFeHRlbmRzRm9udENyb3NzUmVmZXJlbmNlXzBfM18xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMyODo0OiAob3RoZXJsdl82PSAnZmFtaWx5JyAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgYWx0MTc9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDE3KSB7CisgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMyODo2OiBvdGhlcmx2XzY9ICdmYW1pbHknICggKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDQwLEZPTExPV180MF9pbl9ydWxlRm9udDI1OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldEZhbWlseUtleXdvcmRfMF80XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTMzMjoxOiAoIChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzMzM6MTogKGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5ICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzMzOjE6IChsdl9mYW1pbHlfN18wPSBydWxlRm9udEZhbWlseSApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzM0OjM6IGx2X2ZhbWlseV83XzA9IHJ1bGVGb250RmFtaWx5CisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRGYW1pbHlGb250RmFtaWx5UGFyc2VyUnVsZUNhbGxfMF80XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRm9udEZhbWlseV9pbl9ydWxlRm9udDI2MTgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X2ZhbWlseV83XzA9cnVsZUZvbnRGYW1pbHkoKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCQkJImZhbWlseSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZmFtaWx5XzdfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAkJIkZvbnRGYW1pbHkiKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzU3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzU3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM1ODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMSkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNTg6OTk6ICggKHsuLi59PyA9PiAoIChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzU5OjY6ICh7Li4ufT8gPT4gKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDEpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNjI6NjogKHsuLi59PyA9PiAoIChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM2Mjo3OiB7Li4ufT8gPT4gKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM2MjoxNjogKCAobHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzYzOjE6IChsdl9zdHlsZV84XzA9IHJ1bGVGb250U3R5bGVFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNjM6MTogKGx2X3N0eWxlXzhfMD0gcnVsZUZvbnRTdHlsZUVudW0gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzNjQ6MzogbHZfc3R5bGVfOF8wPSBydWxlRm9udFN0eWxlRW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFN0eWxlRm9udFN0eWxlRW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZvbnRTdHlsZUVudW1faW5fcnVsZUZvbnQyNjk2KTsKKyAgICAgICAgICAgIAkgICAgbHZfc3R5bGVfOF8wPXJ1bGVGb250U3R5bGVFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJzdHlsZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3N0eWxlXzhfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJGb250U3R5bGVFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzg3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzg3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM4ODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2JvbGRfOV8wPSAnYm9sZCcgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzODg6OTk6ICggKHsuLi59PyA9PiAoIChsdl9ib2xkXzlfMD0gJ2JvbGQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzg5OjY6ICh7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOTI6NjogKHsuLi59PyA9PiAoIChsdl9ib2xkXzlfMD0gJ2JvbGQnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM5Mjo3OiB7Li4ufT8gPT4gKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTM5MjoxNjogKCAobHZfYm9sZF85XzA9ICdib2xkJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxMzkzOjE6IChsdl9ib2xkXzlfMD0gJ2JvbGQnICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOTM6MTogKGx2X2JvbGRfOV8wPSAnYm9sZCcgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjEzOTQ6MzogbHZfYm9sZF85XzA9ICdib2xkJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2JvbGRfOV8wPShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfNDFfaW5fcnVsZUZvbnQyNzY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9ib2xkXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0Qm9sZEJvbGRLZXl3b3JkXzJfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgImJvbGQiLCB0cnVlLCAiYm9sZCIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA0IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxNTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKG90aGVybHZfMTA9ICdzaXplJyAoIChsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKSApICk/IG90aGVybHZfMTM9ICd9JyApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpLCAzKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSwgMykiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MTU6OTk6ICggKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE2OjY6ICh7Li4ufT8gPT4gKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCksIDMpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MTk6NjogKHsuLi59PyA9PiAoIChvdGhlcmx2XzEwPSAnc2l6ZScgKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKSApPyBvdGhlcmx2XzEzPSAnfScgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOTo3OiB7Li4ufT8gPT4gKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOToxNjogKCAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE5OjE3OiAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8gb3RoZXJsdl8xMz0gJ30nCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDE5OjE3OiAob3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDE4PTI7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSA0MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgYWx0MTg9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQxOToxOTogb3RoZXJsdl8xMD0gJ3NpemUnICggKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3NpemV1bml0XzEyXzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsNDIsRk9MTE9XXzQyX2luX3J1bGVGb250Mjg0OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFNpemVLZXl3b3JkXzNfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MjM6MTogKCAobHZfc2l6ZXZhbHVlXzExXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MjQ6MTogKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0MjQ6MTogKGx2X3NpemV2YWx1ZV8xMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQyNTozOiBsdl9zaXpldmFsdWVfMTFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRTaXpldmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVGb250Mjg3MCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgbHZfc2l6ZXZhbHVlXzExXzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZvbnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAkJCSJzaXpldmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAJCWx2X3NpemV2YWx1ZV8xMV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0NDE6MjogKCAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ0MjoxOiAobHZfc2l6ZXVuaXRfMTJfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDQyOjE6IChsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ0MzozOiBsdl9zaXpldW5pdF8xMl8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFNpemV1bml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18wXzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZUZvbnQyODkxKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBsdl9zaXpldW5pdF8xMl8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAJCQkic2l6ZXVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAJCWx2X3NpemV1bml0XzEyXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZUZvbnQyOTA1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDE5ID49IDEgKSBicmVhayBsb29wMTk7CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDE5LCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDE5Kys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRGb250QWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXAoKSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUZvbnQiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5MZWF2ZShncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cCgpKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwKCkpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlRm9udCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVGb250RmFtaWx5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ4NjoxOiBlbnRyeVJ1bGVGb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVGb250RmFtaWx5PSBydWxlRm9udEZhbWlseSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUZvbnRGYW1pbHkgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ4NzoyOiAoaXZfcnVsZUZvbnRGYW1pbHk9IHJ1bGVGb250RmFtaWx5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE0ODg6MjogaXZfcnVsZUZvbnRGYW1pbHk9IHJ1bGVGb250RmFtaWx5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZvbnRGYW1pbHlfaW5fZW50cnlSdWxlRm9udEZhbWlseTI5ODcpOworICAgICAgICAgICAgaXZfcnVsZUZvbnRGYW1pbHk9cnVsZUZvbnRGYW1pbHkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVGb250RmFtaWx5OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUZvbnRGYW1pbHkyOTk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUZvbnRGYW1pbHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUZvbnRGYW1pbHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk1OjE6IHJ1bGVGb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseSB8IHRoaXNfQ3VzdG9tRm9udEZhbWlseV8xPSBydWxlQ3VzdG9tRm9udEZhbWlseSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRm9udEZhbWlseSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19DdXN0b21Gb250RmFtaWx5XzEgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk4OjI4OiAoICh0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseSB8IHRoaXNfQ3VzdG9tRm9udEZhbWlseV8xPSBydWxlQ3VzdG9tRm9udEZhbWlseSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTQ5OToxOiAodGhpc19CdWlsZEluRm9udEZhbWlseV8wPSBydWxlQnVpbGRJbkZvbnRGYW1pbHkgfCB0aGlzX0N1c3RvbUZvbnRGYW1pbHlfMT0gcnVsZUN1c3RvbUZvbnRGYW1pbHkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNDk5OjE6ICh0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseSB8IHRoaXNfQ3VzdG9tRm9udEZhbWlseV8xPSBydWxlQ3VzdG9tRm9udEZhbWlseSApCisgICAgICAgICAgICBpbnQgYWx0MjA9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSAyMDg6CisgICAgICAgICAgICBjYXNlIDIwOToKKyAgICAgICAgICAgIGNhc2UgMjEwOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDIwPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDIwLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTAwOjU6IHRoaXNfQnVpbGRJbkZvbnRGYW1pbHlfMD0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRCdWlsZEluRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQnVpbGRJbkZvbnRGYW1pbHlfaW5fcnVsZUZvbnRGYW1pbHkzMDQ0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19CdWlsZEluRm9udEZhbWlseV8wPXJ1bGVCdWlsZEluRm9udEZhbWlseSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX0J1aWxkSW5Gb250RmFtaWx5XzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTEwOjU6IHRoaXNfQ3VzdG9tRm9udEZhbWlseV8xPSBydWxlQ3VzdG9tRm9udEZhbWlseQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ3VzdG9tRm9udEZhbWlseV9pbl9ydWxlRm9udEZhbWlseTMwNzEpOworICAgICAgICAgICAgICAgICAgICB0aGlzX0N1c3RvbUZvbnRGYW1pbHlfMT1ydWxlQ3VzdG9tRm9udEZhbWlseSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX0N1c3RvbUZvbnRGYW1pbHlfMTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUZvbnRGYW1pbHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQnVpbGRJbkZvbnRGYW1pbHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTI2OjE6IGVudHJ5UnVsZUJ1aWxkSW5Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVCdWlsZEluRm9udEZhbWlseT0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQnVpbGRJbkZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUJ1aWxkSW5Gb250RmFtaWx5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mjc6MjogKGl2X3J1bGVCdWlsZEluRm9udEZhbWlseT0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mjg6MjogaXZfcnVsZUJ1aWxkSW5Gb250RmFtaWx5PSBydWxlQnVpbGRJbkZvbnRGYW1pbHkgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRCdWlsZEluRm9udEZhbWlseVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJ1aWxkSW5Gb250RmFtaWx5X2luX2VudHJ5UnVsZUJ1aWxkSW5Gb250RmFtaWx5MzEwNik7CisgICAgICAgICAgICBpdl9ydWxlQnVpbGRJbkZvbnRGYW1pbHk9cnVsZUJ1aWxkSW5Gb250RmFtaWx5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQnVpbGRJbkZvbnRGYW1pbHk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQnVpbGRJbkZvbnRGYW1pbHkzMTE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUJ1aWxkSW5Gb250RmFtaWx5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVCdWlsZEluRm9udEZhbWlseSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1MzU6MTogcnVsZUJ1aWxkSW5Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKGx2X2N1c3RvbV8wXzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseUVudW0gKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQnVpbGRJbkZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfY3VzdG9tXzBfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mzg6Mjg6ICggKCAobHZfY3VzdG9tXzBfMD0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTM5OjE6ICggKGx2X2N1c3RvbV8wXzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseUVudW0gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Mzk6MTogKCAobHZfY3VzdG9tXzBfMD0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU0MDoxOiAobHZfY3VzdG9tXzBfMD0gcnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1NDA6MTogKGx2X2N1c3RvbV8wXzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTQxOjM6IGx2X2N1c3RvbV8wXzA9IHJ1bGVCdWlsZEluRm9udEZhbWlseUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRCdWlsZEluRm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbUJ1aWxkSW5Gb250RmFtaWx5RW51bUVudW1SdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVCdWlsZEluRm9udEZhbWlseUVudW1faW5fcnVsZUJ1aWxkSW5Gb250RmFtaWx5MzE2MSk7CisgICAgICAgICAgICBsdl9jdXN0b21fMF8wPXJ1bGVCdWlsZEluRm9udEZhbWlseUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJjdXN0b20iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfY3VzdG9tXzBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiQnVpbGRJbkZvbnRGYW1pbHlFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVCdWlsZEluRm9udEZhbWlseSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDdXN0b21Gb250RmFtaWx5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU2NToxOiBlbnRyeVJ1bGVDdXN0b21Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVDdXN0b21Gb250RmFtaWx5PSBydWxlQ3VzdG9tRm9udEZhbWlseSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUN1c3RvbUZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUN1c3RvbUZvbnRGYW1pbHkgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU2NjoyOiAoaXZfcnVsZUN1c3RvbUZvbnRGYW1pbHk9IHJ1bGVDdXN0b21Gb250RmFtaWx5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Njc6MjogaXZfcnVsZUN1c3RvbUZvbnRGYW1pbHk9IHJ1bGVDdXN0b21Gb250RmFtaWx5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUN1c3RvbUZvbnRGYW1pbHlfaW5fZW50cnlSdWxlQ3VzdG9tRm9udEZhbWlseTMxOTYpOworICAgICAgICAgICAgaXZfcnVsZUN1c3RvbUZvbnRGYW1pbHk9cnVsZUN1c3RvbUZvbnRGYW1pbHkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDdXN0b21Gb250RmFtaWx5OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUN1c3RvbUZvbnRGYW1pbHkzMjA2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUN1c3RvbUZvbnRGYW1pbHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUN1c3RvbUZvbnRGYW1pbHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTc0OjE6IHJ1bGVDdXN0b21Gb250RmFtaWx5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKGx2X2N1c3RvbV8wXzA9IFJVTEVfU1RSSU5HICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUN1c3RvbUZvbnRGYW1pbHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIGx2X2N1c3RvbV8wXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1Nzc6Mjg6ICggKCAobHZfY3VzdG9tXzBfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3ODoxOiAoIChsdl9jdXN0b21fMF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3ODoxOiAoIChsdl9jdXN0b21fMF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTU3OToxOiAobHZfY3VzdG9tXzBfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNTc5OjE6IChsdl9jdXN0b21fMF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE1ODA6MzogbHZfY3VzdG9tXzBfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X2N1c3RvbV8wXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlQ3VzdG9tRm9udEZhbWlseTMyNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X2N1c3RvbV8wXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEN1c3RvbUZvbnRGYW1pbHlSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJjdXN0b20iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfY3VzdG9tXzBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ3VzdG9tRm9udEZhbWlseSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVCb3JkZXJTdHlsZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MDQ6MTogZW50cnlSdWxlQm9yZGVyU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUJvcmRlclN0eWxlPSBydWxlQm9yZGVyU3R5bGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVCb3JkZXJTdHlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQm9yZGVyU3R5bGUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYwNToyOiAoaXZfcnVsZUJvcmRlclN0eWxlPSBydWxlQm9yZGVyU3R5bGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYwNjoyOiBpdl9ydWxlQm9yZGVyU3R5bGU9IHJ1bGVCb3JkZXJTdHlsZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQm9yZGVyU3R5bGVfaW5fZW50cnlSdWxlQm9yZGVyU3R5bGUzMjg3KTsKKyAgICAgICAgICAgIGl2X3J1bGVCb3JkZXJTdHlsZT1ydWxlQm9yZGVyU3R5bGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVCb3JkZXJTdHlsZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVCb3JkZXJTdHlsZTMyOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQm9yZGVyU3R5bGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUJvcmRlclN0eWxlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxMzoxOiBydWxlQm9yZGVyU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoIChsdl90eXBlXzBfMD0gcnVsZUJvcmRlclR5cGVFbnVtICkgKSAoIChsdl93aWR0aHZhbHVlXzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl93aWR0aHVuaXRfMl8wPSBydWxlVW5pdEVudW0gKSApICggKG90aGVybHZfMz0gUlVMRV9JRCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUJvcmRlclN0eWxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl90eXBlXzBfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl93aWR0aHZhbHVlXzFfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl93aWR0aHVuaXRfMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxNjoyODogKCAoICggKGx2X3R5cGVfMF8wPSBydWxlQm9yZGVyVHlwZUVudW0gKSApICggKGx2X3dpZHRodmFsdWVfMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3dpZHRodW5pdF8yXzA9IHJ1bGVVbml0RW51bSApICkgKCAob3RoZXJsdl8zPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxNzoxOiAoICggKGx2X3R5cGVfMF8wPSBydWxlQm9yZGVyVHlwZUVudW0gKSApICggKGx2X3dpZHRodmFsdWVfMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3dpZHRodW5pdF8yXzA9IHJ1bGVVbml0RW51bSApICkgKCAob3RoZXJsdl8zPSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MTc6MTogKCAoIChsdl90eXBlXzBfMD0gcnVsZUJvcmRlclR5cGVFbnVtICkgKSAoIChsdl93aWR0aHZhbHVlXzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl93aWR0aHVuaXRfMl8wPSBydWxlVW5pdEVudW0gKSApICggKG90aGVybHZfMz0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjE3OjI6ICggKGx2X3R5cGVfMF8wPSBydWxlQm9yZGVyVHlwZUVudW0gKSApICggKGx2X3dpZHRodmFsdWVfMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3dpZHRodW5pdF8yXzA9IHJ1bGVVbml0RW51bSApICkgKCAob3RoZXJsdl8zPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjE3OjI6ICggKGx2X3R5cGVfMF8wPSBydWxlQm9yZGVyVHlwZUVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MTg6MTogKGx2X3R5cGVfMF8wPSBydWxlQm9yZGVyVHlwZUVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjE4OjE6IChsdl90eXBlXzBfMD0gcnVsZUJvcmRlclR5cGVFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYxOTozOiBsdl90eXBlXzBfMD0gcnVsZUJvcmRlclR5cGVFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRUeXBlQm9yZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVCb3JkZXJUeXBlRW51bV9pbl9ydWxlQm9yZGVyU3R5bGUzMzQzKTsKKyAgICAgICAgICAgIGx2X3R5cGVfMF8wPXJ1bGVCb3JkZXJUeXBlRW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdHlwZV8wXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIkJvcmRlclR5cGVFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjM1OjI6ICggKGx2X3dpZHRodmFsdWVfMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2MzY6MTogKGx2X3dpZHRodmFsdWVfMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjM2OjE6IChsdl93aWR0aHZhbHVlXzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTYzNzozOiBsdl93aWR0aHZhbHVlXzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRXaWR0aHZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVCb3JkZXJTdHlsZTMzNjQpOworICAgICAgICAgICAgbHZfd2lkdGh2YWx1ZV8xXzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkid2lkdGh2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl93aWR0aHZhbHVlXzFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2NTM6MjogKCAobHZfd2lkdGh1bml0XzJfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjU0OjE6IChsdl93aWR0aHVuaXRfMl8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjU0OjE6IChsdl93aWR0aHVuaXRfMl8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjU1OjM6IGx2X3dpZHRodW5pdF8yXzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlQWNjZXNzKCkuZ2V0V2lkdGh1bml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbml0RW51bV9pbl9ydWxlQm9yZGVyU3R5bGUzMzg1KTsKKyAgICAgICAgICAgIGx2X3dpZHRodW5pdF8yXzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkid2lkdGh1bml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3dpZHRodW5pdF8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlVuaXRFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNjcxOjI6ICggKG90aGVybHZfMz0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY3MjoxOiAob3RoZXJsdl8zPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY3MjoxOiAob3RoZXJsdl8zPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY3MzozOiBvdGhlcmx2XzM9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUJvcmRlclN0eWxlMzQwNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVCb3JkZXJTdHlsZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVTdHlsZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE2OTI6MTogZW50cnlSdWxlU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVN0eWxlPSBydWxlU3R5bGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVTdHlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlU3R5bGUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY5MzoyOiAoaXZfcnVsZVN0eWxlPSBydWxlU3R5bGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTY5NDoyOiBpdl9ydWxlU3R5bGU9IHJ1bGVTdHlsZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlU3R5bGVfaW5fZW50cnlSdWxlU3R5bGUzNDQxKTsKKyAgICAgICAgICAgIGl2X3J1bGVTdHlsZT1ydWxlU3R5bGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVTdHlsZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVTdHlsZTM0NTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlU3R5bGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVN0eWxlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcwMToxOiBydWxlU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ3N0eWxlJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgKG90aGVybHZfMz0gJ2V4dGVuZHMnICggKG90aGVybHZfND0gUlVMRV9JRCApICkgKT8gKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKSApICggKGx2X21lZGlhc3R5bGVzXzUwXzA9IHJ1bGVNZWRpYVN0eWxlICkgKSogb3RoZXJsdl81MT0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVTdHlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X25hbWVfMV8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzc9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl84PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEzPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE2PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTg9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzIyPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMjQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI5PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM4PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNDE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80ND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ3PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNTE9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl90ZXh0YWxpZ25fMTdfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9ib3JkZXJUb3BfMTlfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9ib3JkZXJCb3R0b21fMjFfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9ib3JkZXJMZWZ0XzIzXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfYm9yZGVyUmlnaHRfMjVfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9wYWRkaW5nVG9wVW5pdF8yOF8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X21hcmdpblRvcFZhbHVlXzM5XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfbWFyZ2luVG9wVW5pdF80MF8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfbWFyZ2luQm90dG9tVW5pdF80M18wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X21hcmdpbkxlZnRVbml0XzQ2XzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X21hcmdpblJpZ2h0VW5pdF80OV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X21lZGlhc3R5bGVzXzUwXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzA0OjI4OiAoIChvdGhlcmx2XzA9ICdzdHlsZScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIChvdGhlcmx2XzM9ICdleHRlbmRzJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKiApICkgKSAoIChsdl9tZWRpYXN0eWxlc181MF8wPSBydWxlTWVkaWFTdHlsZSApICkqIG90aGVybHZfNTE9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcwNToxOiAob3RoZXJsdl8wPSAnc3R5bGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAob3RoZXJsdl8zPSAnZXh0ZW5kcycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNj0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMj0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Nz0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKSApICkgKCAobHZfbWVkaWFzdHlsZXNfNTBfMD0gcnVsZU1lZGlhU3R5bGUgKSApKiBvdGhlcmx2XzUxPSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzA1OjE6IChvdGhlcmx2XzA9ICdzdHlsZScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIChvdGhlcmx2XzM9ICdleHRlbmRzJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKiApICkgKSAoIChsdl9tZWRpYXN0eWxlc181MF8wPSBydWxlTWVkaWFTdHlsZSApICkqIG90aGVybHZfNTE9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MDU6Mzogb3RoZXJsdl8wPSAnc3R5bGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAob3RoZXJsdl8zPSAnZXh0ZW5kcycgKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKSApPyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNj0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMj0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Nz0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKSApICkgKCAobHZfbWVkaWFzdHlsZXNfNTBfMD0gcnVsZU1lZGlhU3R5bGUgKSApKiBvdGhlcmx2XzUxPSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzQzX2luX3J1bGVTdHlsZTM0ODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0U3R5bGVLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcwOToxOiAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTcxMDoxOiAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzEwOjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MTE6MzogbHZfbmFtZV8xXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X25hbWVfMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVTdHlsZTM1MDUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIklEIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVTdHlsZTM1MjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzMxOjE6IChvdGhlcmx2XzM9ICdleHRlbmRzJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MjE9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTczMTozOiBvdGhlcmx2XzM9ICdleHRlbmRzJyAoIChvdGhlcmx2XzQ9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwzOSxGT0xMT1dfMzlfaW5fcnVsZVN0eWxlMzUzNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfM18wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MzU6MTogKCAob3RoZXJsdl80PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3MzY6MTogKG90aGVybHZfND0gUlVMRV9JRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzM2OjE6IChvdGhlcmx2XzQ9IFJVTEVfSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Mzc6Mzogb3RoZXJsdl80PSBSVUxFX0lECisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlU3R5bGUzNTU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRFeHRlbmRzU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NDg6NDogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NTA6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc1MDoxOiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzUxOjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NTQ6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNj0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMj0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Nz0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU1OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU1OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDIzOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMz0xODsKKyAgICAgICAgICAgICAgICBpbnQgTEEyM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIExBMjNfMCA9PTQ0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyM18wID09MzggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzXzAgPT00NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTQ3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyM18wID09NDggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzPTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzXzAgPT00OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTUwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyM18wID09NTEgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzPTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzXzAgPT01MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA4KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9OTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTUzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz0xMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTU0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzXzAgPT01NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzPTEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyM18wID09NTYgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz0xMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTU3ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9MTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTIzXzAgPT01OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzPTE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyM18wID09NTkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz0xNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjNfMCA9PTYwICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9MTc7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc1Nzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU4OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAwKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDApIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU4OjEwMjogKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzU5OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAwKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzYyOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzYyOjc6IHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NjI6MTY6IChvdGhlcmx2XzY9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3NjI6MTg6IG90aGVybHZfNj0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVTdHlsZTM2MTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEZvcm1hdHRlcktleXdvcmRfNF8wXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc2NjoxOiAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc2NzoxOiAob3RoZXJsdl83PSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3Njc6MTogKG90aGVybHZfNz0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc2ODozOiBvdGhlcmx2Xzc9IFJVTEVfSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVTdHlsZTM2MzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEZvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV80XzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzg2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODY6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2ZvbnQnICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3ODc6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzg3OjEwMjogKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc4ODo2OiAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdmb250JyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3OTE6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzkxOjc6IHsuLi59PyA9PiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzkxOjE2OiAob3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTc5MToxODogb3RoZXJsdl84PSAnZm9udCcgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMzgsRk9MTE9XXzM4X2luX3J1bGVTdHlsZTM3MDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEZvbnRLZXl3b3JkXzRfMV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3OTU6MTogKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3OTY6MTogKG90aGVybHZfOT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxNzk2OjE6IChvdGhlcmx2Xzk9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE3OTc6Mzogb3RoZXJsdl85PSBSVUxFX0lECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlU3R5bGUzNzIzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRGb250Rm9udENyb3NzUmVmZXJlbmNlXzRfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MTU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODE1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MTY6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDIpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MTY6MTAyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MTc6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjA6NjogKHsuLi59PyA9PiAob3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjA6Nzogey4uLn0/ID0+IChvdGhlcmx2XzEwPSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKT8gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgyMDoxNjogKG90aGVybHZfMTA9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEyPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApPyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTgyMDoxODogb3RoZXJsdl8xMD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsNDUsRk9MTE9XXzQ1X2luX3J1bGVTdHlsZTM3OTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCYWNrZ3JvdW5kY29sb3JLZXl3b3JkXzRfMl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjQ6MTogKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODI1OjE6IChvdGhlcmx2XzExPSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjU6MTogKG90aGVybHZfMTE9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4MjY6Mzogb3RoZXJsdl8xMT0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBvdGhlcmx2XzExPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVTdHlsZTM4MTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCYWNrZ3JvdW5kY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfMl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4Mzc6MjogKG90aGVybHZfMTI9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICk/CisgICAgICAgICAgICAJICAgIGludCBhbHQyMj0yOworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGNhc2UgNDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGFsdDIyPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQyMikgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4Mzc6NDogb3RoZXJsdl8xMj0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsNDYsRk9MTE9XXzQ2X2luX3J1bGVTdHlsZTM4MjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEyLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRlS2V5d29yZF80XzJfMl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NDE6MTogKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NDI6MTogKG90aGVybHZfMTM9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NDI6MTogKG90aGVybHZfMTM9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg0MzozOiBvdGhlcmx2XzEzPSBSVUxFX0lECisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVTdHlsZTM4NDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUNvbG9yQ3Jvc3NSZWZlcmVuY2VfNF8yXzJfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODYyOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDMpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMykiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjI6MTAyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg2Mzo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAzKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODY2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjY6Nzogey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzE1PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODY2OjE2OiAob3RoZXJsdl8xND0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NjY6MTg6IG90aGVybHZfMTQ9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTU9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xND0oVG9rZW4pbWF0Y2goaW5wdXQsNDcsRk9MTE9XXzQ3X2luX3J1bGVTdHlsZTM5MTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRUZXh0Y29sb3JLZXl3b3JkXzRfM18wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NzA6MTogKCAob3RoZXJsdl8xNT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODcxOjE6IChvdGhlcmx2XzE1PSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NzE6MTogKG90aGVybHZfMTU9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4NzI6Mzogb3RoZXJsdl8xNT0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBvdGhlcmx2XzE1PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVTdHlsZTM5MzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRUZXh0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfM18xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDUgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OTA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5MTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDQpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OTE6MTAyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODkyOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTg5NTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OTU6Nzogey4uLn0/ID0+IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OTU6MTY6IChvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxODk1OjE4OiBvdGhlcmx2XzE2PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xNj0oVG9rZW4pbWF0Y2goaW5wdXQsNDgsRk9MTE9XXzQ4X2luX3J1bGVTdHlsZTQwMDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTYsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzRfNF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE4OTk6MTogKCAobHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MDA6MTogKGx2X3RleHRhbGlnbl8xN18wPSBydWxlVGV4dEFsaWduRW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTAwOjE6IChsdl90ZXh0YWxpZ25fMTdfMD0gcnVsZVRleHRBbGlnbkVudW0gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5MDE6MzogbHZfdGV4dGFsaWduXzE3XzA9IHJ1bGVUZXh0QWxpZ25FbnVtCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfNF80XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVGV4dEFsaWduRW51bV9pbl9ydWxlU3R5bGU0MDIzKTsKKyAgICAgICAgICAgIAkgICAgbHZfdGV4dGFsaWduXzE3XzA9cnVsZVRleHRBbGlnbkVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJ0ZXh0YWxpZ24iLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl90ZXh0YWxpZ25fMTdfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA2IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkyNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI1OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA1KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDUpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI1OjEwMjogKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA1KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI5OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTI5Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Mjk6MTY6IChvdGhlcmx2XzE4PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Mjk6MTg6IG90aGVybHZfMTg9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMTg9KFRva2VuKW1hdGNoKGlucHV0LDQ5LEZPTExPV180OV9pbl9ydWxlU3R5bGU0MDkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE4LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wS2V5d29yZF80XzVfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTMzOjE6ICggKGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTkzNDoxOiAobHZfYm9yZGVyVG9wXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTM0OjE6IChsdl9ib3JkZXJUb3BfMTlfMD0gcnVsZUJvcmRlclN0eWxlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTM1OjM6IGx2X2JvcmRlclRvcF8xOV8wPSBydWxlQm9yZGVyU3R5bGUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzVfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVCb3JkZXJTdHlsZV9pbl9ydWxlU3R5bGU0MTEyKTsKKyAgICAgICAgICAgIAkgICAgbHZfYm9yZGVyVG9wXzE5XzA9cnVsZUJvcmRlclN0eWxlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiYm9yZGVyVG9wIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfYm9yZGVyVG9wXzE5XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDcgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NTg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTU4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NTk6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NTk6MTAyOiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NjA6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDYpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NjM6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5NjM6Nzogey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk2MzoxNjogKG90aGVybHZfMjA9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk2MzoxODogb3RoZXJsdl8yMD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yMD0oVG9rZW4pbWF0Y2goaW5wdXQsNTAsRk9MTE9XXzUwX2luX3J1bGVTdHlsZTQxODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjAsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJCb3R0b21LZXl3b3JkXzRfNl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Njc6MTogKCAobHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTY4OjE6IChsdl9ib3JkZXJCb3R0b21fMjFfMD0gcnVsZUJvcmRlclN0eWxlICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Njg6MTogKGx2X2JvcmRlckJvdHRvbV8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5Njk6MzogbHZfYm9yZGVyQm90dG9tXzIxXzA9IHJ1bGVCb3JkZXJTdHlsZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzRfNl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJvcmRlclN0eWxlX2luX3J1bGVTdHlsZTQyMDEpOworICAgICAgICAgICAgCSAgICBsdl9ib3JkZXJCb3R0b21fMjFfMD1ydWxlQm9yZGVyU3R5bGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJib3JkZXJCb3R0b20iLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9ib3JkZXJCb3R0b21fMjFfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJCb3JkZXJTdHlsZSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgOCA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5Mjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5Mjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5OTM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgNykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA3KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5MzoxMDI6ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoxOTk0OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDcpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5OTc6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5Nzo3OiB7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjE5OTc6MTY6IChvdGhlcmx2XzIyPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MTk5NzoxODogb3RoZXJsdl8yMj0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzIyPShUb2tlbiltYXRjaChpbnB1dCw1MSxGT0xMT1dfNTFfaW5fcnVsZVN0eWxlNDI2OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlckxlZnRLZXl3b3JkXzRfN18wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMDE6MTogKCAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAwMjoxOiAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAwMjoxOiAobHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMDM6MzogbHZfYm9yZGVyTGVmdF8yM18wPSBydWxlQm9yZGVyU3R5bGUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyTGVmdEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF83XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQm9yZGVyU3R5bGVfaW5fcnVsZVN0eWxlNDI5MCk7CisgICAgICAgICAgICAJICAgIGx2X2JvcmRlckxlZnRfMjNfMD1ydWxlQm9yZGVyU3R5bGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJib3JkZXJMZWZ0IiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfYm9yZGVyTGVmdF8yM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkJvcmRlclN0eWxlIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA5IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDI2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMjY6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMjc6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA4KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDgpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDI3OjEwMjogKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAyODo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDgpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzE6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDMxOjc6IHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDMxOjE2OiAob3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjAzMToxODogb3RoZXJsdl8yND0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMjQ9KFRva2VuKW1hdGNoKGlucHV0LDUyLEZPTExPV181Ml9pbl9ydWxlU3R5bGU0MzU4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI0LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyUmlnaHRLZXl3b3JkXzRfOF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzU6MTogKCAobHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzY6MTogKGx2X2JvcmRlclJpZ2h0XzI1XzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDM2OjE6IChsdl9ib3JkZXJSaWdodF8yNV8wPSBydWxlQm9yZGVyU3R5bGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwMzc6MzogbHZfYm9yZGVyUmlnaHRfMjVfMD0gcnVsZUJvcmRlclN0eWxlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldEJvcmRlclJpZ2h0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzhfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVCb3JkZXJTdHlsZV9pbl9ydWxlU3R5bGU0Mzc5KTsKKyAgICAgICAgICAgIAkgICAgbHZfYm9yZGVyUmlnaHRfMjVfMD1ydWxlQm9yZGVyU3R5bGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJib3JkZXJSaWdodCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2JvcmRlclJpZ2h0XzI1XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDEwIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDYwOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA2MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNj0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDYxOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA5KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDkpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDYxOjEwMjogKCAoey4uLn0/ID0+IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDYyOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCA5KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDY1OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDY1Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8yNj0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNjU6MTY6IChvdGhlcmx2XzI2PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNjU6MTg6IG90aGVybHZfMjY9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMjY9KFRva2VuKW1hdGNoKGlucHV0LDUzLEZPTExPV181M19pbl9ydWxlU3R5bGU0NDQ3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzI2LCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1RvcEtleXdvcmRfNF85XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA2OToxOiAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIwNzA6MTogKGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA3MDoxOiAobHZfcGFkZGluZ1RvcFZhbHVlXzI3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA3MTozOiBsdl9wYWRkaW5nVG9wVmFsdWVfMjdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF85XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZVN0eWxlNDQ2OCk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZGRpbmdUb3BWYWx1ZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdUb3BWYWx1ZV8yN18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDg3OjI6ICggKGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDg4OjE6IChsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjA4ODoxOiAobHZfcGFkZGluZ1RvcFVuaXRfMjhfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMDg5OjM6IGx2X3BhZGRpbmdUb3BVbml0XzI4XzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfOV8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTQ0ODkpOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nVG9wVW5pdF8yOF8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZGRpbmdUb3BVbml0IiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGFkZGluZ1RvcFVuaXRfMjhfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMTI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTEyOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMTM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEwKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExMzoxMDM6ICggKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExNDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTApOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMTc6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMTc6Nzogey4uLn0/ID0+IChvdGhlcmx2XzI5PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExNzoxNjogKG90aGVybHZfMjk9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjExNzoxODogb3RoZXJsdl8yOT0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yOT0oVG9rZW4pbWF0Y2goaW5wdXQsNTQsRk9MTE9XXzU0X2luX3J1bGVTdHlsZTQ1NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjksIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nQm90dG9tS2V5d29yZF80XzEwXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEyMToxOiAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxMjI6MTogKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8zMF8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEyMjoxOiAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzMwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEyMzozOiBsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVTdHlsZTQ1NzgpOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nQm90dG9tVmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nQm90dG9tVmFsdWVfMzBfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjEzOToyOiAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE0MDoxOiAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMzFfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNDA6MTogKGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE0MTozOiBsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEwXzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZVN0eWxlNDU5OSk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdCb3R0b21Vbml0XzMxXzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicGFkZGluZ0JvdHRvbVVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nQm90dG9tVW5pdF8zMV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuaXRFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2NDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMj0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIxNjQ6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2NTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTEpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTEpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTY1OjEwMzogKCAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTY2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2OTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE2OTo3OiB7Li4ufT8gPT4gKG90aGVybHZfMzI9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTY5OjE2OiAob3RoZXJsdl8zMj0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTY5OjE4OiBvdGhlcmx2XzMyPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzMyPShUb2tlbiltYXRjaChpbnB1dCw1NSxGT0xMT1dfNTVfaW5fcnVsZVN0eWxlNDY2Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zMiwgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0S2V5d29yZF80XzExXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE3MzoxOiAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTc0OjE6IChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTc0OjE6IChsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE3NTozOiBsdl9wYWRkaW5nTGVmdFZhbHVlXzMzXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nTGVmdFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzExXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZVN0eWxlNDY4OCk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzNfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nTGVmdFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGFkZGluZ0xlZnRWYWx1ZV8zM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTkxOjI6ICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjE5MjoxOiAobHZfcGFkZGluZ0xlZnRVbml0XzM0XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTkyOjE6IChsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMTkzOjM6IGx2X3BhZGRpbmdMZWZ0VW5pdF8zNF8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ0xlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMV8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTQ3MDkpOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nTGVmdFVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nTGVmdFVuaXRfMzRfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMTY6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjE2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMTc6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEyKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIxNzoxMDM6ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIxODo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMjE6NjogKHsuLi59PyA9PiAob3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyMjE6Nzogey4uLn0/ID0+IChvdGhlcmx2XzM1PSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIyMToxNjogKG90aGVybHZfMzU9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIyMToxODogb3RoZXJsdl8zNT0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zN18wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8zNT0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVTdHlsZTQ3NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMzUsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRLZXl3b3JkXzRfMTJfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI1OjE6ICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI2OjE6IChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjIyNjoxOiAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjI3OjM6IGx2X3BhZGRpbmdSaWdodFZhbHVlXzM2XzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVTdHlsZTQ3OTgpOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNl8wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZGRpbmdSaWdodFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzZfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI0MzoyOiAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjQ0OjE6IChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjQ0OjE6IChsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI0NTozOiBsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMl8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTQ4MTkpOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nUmlnaHRVbml0XzM3XzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicGFkZGluZ1JpZ2h0VW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdSaWdodFVuaXRfMzdfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTQgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNjg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjY4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNjk6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEzKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDEzKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI2OToxMDM6ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI3MDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTMpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNzM6NjogKHsuLi59PyA9PiAob3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIyNzM6Nzogey4uLn0/ID0+IChvdGhlcmx2XzM4PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI3MzoxNjogKG90aGVybHZfMzg9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfNDBfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI3MzoxODogb3RoZXJsdl8zOD0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF80MF8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8zOD0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVTdHlsZTQ4ODcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMzgsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BLZXl3b3JkXzRfMTNfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjc3OjE6ICggKGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjc4OjE6IChsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI3ODoxOiAobHZfbWFyZ2luVG9wVmFsdWVfMzlfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjc5OjM6IGx2X21hcmdpblRvcFZhbHVlXzM5XzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xM18xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVTdHlsZTQ5MDgpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Ub3BWYWx1ZV8zOV8wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpblRvcFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luVG9wVmFsdWVfMzlfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI5NToyOiAoIChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjk2OjE6IChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMjk2OjE6IChsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjI5NzozOiBsdl9tYXJnaW5Ub3BVbml0XzQwXzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Ub3BVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xM18yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTQ5MjkpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Ub3BVbml0XzQwXzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luVG9wVW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X21hcmdpblRvcFVuaXRfNDBfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTUgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjA6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzIwOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjE6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE0KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE0KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMyMToxMDM6ICggKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMyMjo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTQpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjU6NjogKHsuLi59PyA9PiAob3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzMjU6Nzogey4uLn0/ID0+IChvdGhlcmx2XzQxPSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMyNToxNjogKG90aGVybHZfNDE9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMyNToxODogb3RoZXJsdl80MT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80M18wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl80MT0oVG9rZW4pbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzU4X2luX3J1bGVTdHlsZTQ5OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNDEsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21LZXl3b3JkXzRfMTRfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzI5OjE6ICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzMwOjE6IChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjMzMDoxOiAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzMxOjM6IGx2X21hcmdpbkJvdHRvbVZhbHVlXzQyXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVTdHlsZTUwMTgpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Cb3R0b21WYWx1ZV80Ml8wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpbkJvdHRvbVZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luQm90dG9tVmFsdWVfNDJfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0NzoyOiAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzQ4OjE6IChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzQ4OjE6IChsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM0OTozOiBsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNF8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTUwMzkpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Cb3R0b21Vbml0XzQzXzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luQm90dG9tVW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X21hcmdpbkJvdHRvbVVuaXRfNDNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTYgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNzI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyMzcyOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNzM6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE1KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCksIDE1KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3MzoxMDM6ICggKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3NDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTUpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNzc6NjogKHsuLi59PyA9PiAob3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzNzc6Nzogey4uLn0/ID0+IChvdGhlcmx2XzQ0PSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3NzoxNjogKG90aGVybHZfNDQ9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM3NzoxODogb3RoZXJsdl80ND0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl80ND0oVG9rZW4pbWF0Y2goaW5wdXQsNTksRk9MTE9XXzU5X2luX3J1bGVTdHlsZTUxMDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNDQsIGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5MZWZ0S2V5d29yZF80XzE1XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM4MToxOiAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjIzODI6MTogKGx2X21hcmdpbkxlZnRWYWx1ZV80NV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM4MjoxOiAobHZfbWFyZ2luTGVmdFZhbHVlXzQ1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM4MzozOiBsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpbkxlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVTdHlsZTUxMjgpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtYXJnaW5MZWZ0VmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXJnaW5MZWZ0VmFsdWVfNDVfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjM5OToyOiAoIChsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQwMDoxOiAobHZfbWFyZ2luTGVmdFVuaXRfNDZfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0MDA6MTogKGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQwMTozOiBsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzE1XzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZVN0eWxlNTE0OSk7CisgICAgICAgICAgICAJICAgIGx2X21hcmdpbkxlZnRVbml0XzQ2XzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luTGVmdFVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXJnaW5MZWZ0VW5pdF80Nl8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuaXRFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxNyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQyNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Nz0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0MjQ6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQyNTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTYpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzQoKSwgMTYpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI1OjEwMzogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpLCAxNik7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQyOTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQyOTo3OiB7Li4ufT8gPT4gKG90aGVybHZfNDc9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI5OjE2OiAob3RoZXJsdl80Nz0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDI5OjE4OiBvdGhlcmx2XzQ3PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ3PShUb2tlbiltYXRjaChpbnB1dCw2MCxGT0xMT1dfNjBfaW5fcnVsZVN0eWxlNTIxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80NywgZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0S2V5d29yZF80XzE2XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQzMzoxOiAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDM0OjE6IChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDM0OjE6IChsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQzNTozOiBsdl9tYXJnaW5SaWdodFZhbHVlXzQ4XzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5SaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE2XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZVN0eWxlNTIzOCk7CisgICAgICAgICAgICAJICAgIGx2X21hcmdpblJpZ2h0VmFsdWVfNDhfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtYXJnaW5SaWdodFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luUmlnaHRWYWx1ZV80OF8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDUxOjI6ICggKGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ1MjoxOiAobHZfbWFyZ2luUmlnaHRVbml0XzQ5XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDUyOjE6IChsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNDUzOjM6IGx2X21hcmdpblJpZ2h0VW5pdF80OV8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNl8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVTdHlsZTUyNTkpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5SaWdodFVuaXRfNDlfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtYXJnaW5SaWdodFVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXJnaW5SaWdodFVuaXRfNDlfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfNCgpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF80KCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ4MzoyOiAoIChsdl9tZWRpYXN0eWxlc181MF8wPSBydWxlTWVkaWFTdHlsZSApICkqCisgICAgICAgICAgICBsb29wMjQ6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ4NDoxOiAobHZfbWVkaWFzdHlsZXNfNTBfMD0gcnVsZU1lZGlhU3R5bGUgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjQ4NDoxOiAobHZfbWVkaWFzdHlsZXNfNTBfMD0gcnVsZU1lZGlhU3R5bGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI0ODU6MzogbHZfbWVkaWFzdHlsZXNfNTBfMD0gcnVsZU1lZGlhU3R5bGUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0TWVkaWFzdHlsZXNNZWRpYVN0eWxlUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVNZWRpYVN0eWxlX2luX3J1bGVTdHlsZTUzMjEpOworICAgICAgICAgICAgCSAgICBsdl9tZWRpYXN0eWxlc181MF8wPXJ1bGVNZWRpYVN0eWxlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0U3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWVkaWFzdHlsZXMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tZWRpYXN0eWxlc181MF8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIk1lZGlhU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDI0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzUxPShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZVN0eWxlNTMzNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUxLCBncmFtbWFyQWNjZXNzLmdldFN0eWxlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVN0eWxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU1lZGlhU3R5bGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTEzOjE6IGVudHJ5UnVsZU1lZGlhU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZU1lZGlhU3R5bGU9IHJ1bGVNZWRpYVN0eWxlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlTWVkaWFTdHlsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlTWVkaWFTdHlsZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTE0OjI6IChpdl9ydWxlTWVkaWFTdHlsZT0gcnVsZU1lZGlhU3R5bGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUxNToyOiBpdl9ydWxlTWVkaWFTdHlsZT0gcnVsZU1lZGlhU3R5bGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlTWVkaWFTdHlsZV9pbl9lbnRyeVJ1bGVNZWRpYVN0eWxlNTM3MCk7CisgICAgICAgICAgICBpdl9ydWxlTWVkaWFTdHlsZT1ydWxlTWVkaWFTdHlsZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU1lZGlhU3R5bGU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlTWVkaWFTdHlsZTUzODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlTWVkaWFTdHlsZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTWVkaWFTdHlsZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MjI6MTogcnVsZU1lZGlhU3R5bGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ21lZGlhJyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKSApICkgb3RoZXJsdl80OD0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVNZWRpYVN0eWxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzc9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl84PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEwPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzEzPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xNj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE4PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMjA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI0PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMjc9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzMzPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zOT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQyPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNDU9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80OD1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3RleHRhbGlnbl8xNV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2JvcmRlclRvcF8xN18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2JvcmRlckJvdHRvbV8xOV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2JvcmRlckxlZnRfMjFfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9ib3JkZXJSaWdodF8yM18wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X3BhZGRpbmdUb3BVbml0XzI2XzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfcGFkZGluZ0xlZnRVbml0XzMyXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbWFyZ2luVG9wVmFsdWVfMzdfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9tYXJnaW5Ub3BVbml0XzM4XzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMCA9IG51bGw7CisKKyAgICAgICAgRW51bWVyYXRvciBsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbWFyZ2luTGVmdFZhbHVlXzQzXzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfbWFyZ2luTGVmdFVuaXRfNDRfMCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfbWFyZ2luUmlnaHRVbml0XzQ3XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTI1OjI4OiAoIChvdGhlcmx2XzA9ICdtZWRpYScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfNDg9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjUyNjoxOiAob3RoZXJsdl8wPSAnbWVkaWEnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMD0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE3XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMzPSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM5PSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQyPSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ1PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzQ4PSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTI2OjE6IChvdGhlcmx2XzA9ICdtZWRpYScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKSApIG90aGVybHZfNDg9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MjY6Mzogb3RoZXJsdl8wPSAnbWVkaWEnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMD0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE3XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMzPSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM5PSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQyPSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ1PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKSApKiApICkgKSBvdGhlcmx2XzQ4PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVNZWRpYVN0eWxlNTQxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1lZGlhS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1MzA6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTMxOjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTMxOjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTMyOjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVNZWRpYVN0eWxlNTQzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1lZGlhTWVkaWFDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVNZWRpYVN0eWxlNTQ0OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU0NzoxOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1NDk6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1NDk6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1NTA6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuZW50ZXIoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU1MzoyOiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTU0OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU1NDozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApICkqCisgICAgICAgICAgICBsb29wMjY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI2PTE4OworICAgICAgICAgICAgICAgIGludCBMQTI2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggTEEyNl8wID09NDQgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjZfMCA9PTM4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI2PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT00NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyNj0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyNl8wID09NDcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjZfMCA9PTQ4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI2PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT00OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyNj02OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyNl8wID09NTAgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMjZfMCA9PTUxICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI2PTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01MiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDgpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyNj05OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEEyNl8wID09NTMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA5KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01NCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01NSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDExKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01NyAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01OCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT01OSAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTI2XzAgPT02MCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjY9MTc7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTU2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU1Njo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTU3OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTU3OjEwNzogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTU4OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfND0gJ2Zvcm1hdHRlcicgKCAob3RoZXJsdl81PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDApOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1NjE6NjogKHsuLi59PyA9PiAob3RoZXJsdl80PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1NjE6Nzogey4uLn0/ID0+IChvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTYxOjE2OiAob3RoZXJsdl80PSAnZm9ybWF0dGVyJyAoIChvdGhlcmx2XzU9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTYxOjE4OiBvdGhlcmx2XzQ9ICdmb3JtYXR0ZXInICggKG90aGVybHZfNT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDQ0LEZPTExPV180NF9pbl9ydWxlTWVkaWFTdHlsZTU1MDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Rm9ybWF0dGVyS2V5d29yZF8zXzBfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTY1OjE6ICggKG90aGVybHZfNT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTY2OjE6IChvdGhlcmx2XzU9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU2NjoxOiAob3RoZXJsdl81PSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTY3OjM6IG90aGVybHZfNT0gUlVMRV9JRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlTWVkaWFTdHlsZTU1MjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Rm9ybWF0U29tZUZvcm1hdENyb3NzUmVmZXJlbmNlXzNfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU4NTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTg1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTg2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNj0gJ2ZvbnQnICggKG90aGVybHZfNz0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjU4NjoxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1ODc6NjogKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1OTA6NjogKHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTkwOjc6IHsuLi59PyA9PiAob3RoZXJsdl82PSAnZm9udCcgKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1OTA6MTY6IChvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTkwOjE4OiBvdGhlcmx2XzY9ICdmb250JyAoIChvdGhlcmx2Xzc9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwzOCxGT0xMT1dfMzhfaW5fcnVsZU1lZGlhU3R5bGU1NTk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEZvbnRLZXl3b3JkXzNfMV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1OTQ6MTogKCAob3RoZXJsdl83PSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1OTU6MTogKG90aGVybHZfNz0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNTk1OjE6IChvdGhlcmx2Xzc9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI1OTY6Mzogb3RoZXJsdl83PSBSVUxFX0lECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl83PShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVNZWRpYVN0eWxlNTYxNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRGb250Rm9udENyb3NzUmVmZXJlbmNlXzNfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYxNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjE0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjE1OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfOD0gJ2JhY2tncm91bmRjb2xvcicgKCAob3RoZXJsdl85PSBSVUxFX0lEICkgKSAob3RoZXJsdl8xMD0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKT8gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAyKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYxNToxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2MTY6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2MTk6NjogKHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjE5Ojc6IHsuLi59PyA9PiAob3RoZXJsdl84PSAnYmFja2dyb3VuZGNvbG9yJyAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApIChvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKSApPyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2MTk6MTY6IChvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjE5OjE4OiBvdGhlcmx2Xzg9ICdiYWNrZ3JvdW5kY29sb3InICggKG90aGVybHZfOT0gUlVMRV9JRCApICkgKG90aGVybHZfMTA9ICdhbHRlcm5hdGUnICggKG90aGVybHZfMTE9IFJVTEVfSUQgKSApICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCw0NSxGT0xMT1dfNDVfaW5fcnVsZU1lZGlhU3R5bGU1NjgzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJhY2tncm91bmRjb2xvcktleXdvcmRfM18yXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYyMzoxOiAoIChvdGhlcmx2Xzk9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYyNDoxOiAob3RoZXJsdl85PSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2MjQ6MTogKG90aGVybHZfOT0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYyNTozOiBvdGhlcmx2Xzk9IFJVTEVfSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBvdGhlcmx2Xzk9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZU1lZGlhU3R5bGU1NzAzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJhY2tncm91bmRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18yXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYzNjoyOiAob3RoZXJsdl8xMD0gJ2FsdGVybmF0ZScgKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDI1PTI7CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgYWx0MjU9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDI1KSB7CisgICAgICAgICAgICAJICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjYzNjo0OiBvdGhlcmx2XzEwPSAnYWx0ZXJuYXRlJyAoIChvdGhlcmx2XzExPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBvdGhlcmx2XzEwPShUb2tlbiltYXRjaChpbnB1dCw0NixGT0xMT1dfNDZfaW5fcnVsZU1lZGlhU3R5bGU1NzE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRlS2V5d29yZF8zXzJfMl8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2NDA6MTogKCAob3RoZXJsdl8xMT0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2NDE6MTogKG90aGVybHZfMTE9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2NDE6MTogKG90aGVybHZfMTE9IFJVTEVfSUQgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY0MjozOiBvdGhlcmx2XzExPSBSVUxFX0lECisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIG90aGVybHZfMTE9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZU1lZGlhU3R5bGU1NzM2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18yXzJfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNCA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY2MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY2MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2NjE6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAzKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY2MToxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjYyOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMyk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY2NTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzEyPSAndGV4dGNvbG9yJyAoIChvdGhlcmx2XzEzPSBSVUxFX0lEICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjY1Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjY1OjE2OiAob3RoZXJsdl8xMj0gJ3RleHRjb2xvcicgKCAob3RoZXJsdl8xMz0gUlVMRV9JRCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2NjU6MTg6IG90aGVybHZfMTI9ICd0ZXh0Y29sb3InICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMj0oVG9rZW4pbWF0Y2goaW5wdXQsNDcsRk9MTE9XXzQ3X2luX3J1bGVNZWRpYVN0eWxlNTgwNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yS2V5d29yZF8zXzNfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjY5OjE6ICggKG90aGVybHZfMTM9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY3MDoxOiAob3RoZXJsdl8xMz0gUlVMRV9JRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjcwOjE6IChvdGhlcmx2XzEzPSBSVUxFX0lEICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjcxOjM6IG90aGVybHZfMTM9IFJVTEVfSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBvdGhlcmx2XzEzPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVNZWRpYVN0eWxlNTgyNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzNfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDUgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2ODk6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY4OTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY5MDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE0PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNCkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2OTA6MTA3OiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjkxOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA0KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjk0OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY5NDo3OiB7Li4ufT8gPT4gKG90aGVybHZfMTQ9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNjk0OjE2OiAob3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY5NDoxODogb3RoZXJsdl8xND0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMTQ9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlTWVkaWFTdHlsZTU4OTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTQsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFRleHRhbGlnbktleXdvcmRfM180XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY5ODoxOiAoIChsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjY5OToxOiAobHZfdGV4dGFsaWduXzE1XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI2OTk6MTogKGx2X3RleHRhbGlnbl8xNV8wPSBydWxlVGV4dEFsaWduRW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcwMDozOiBsdl90ZXh0YWxpZ25fMTVfMD0gcnVsZVRleHRBbGlnbkVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzNfNF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRleHRBbGlnbkVudW1faW5fcnVsZU1lZGlhU3R5bGU1OTE1KTsKKyAgICAgICAgICAgIAkgICAgbHZfdGV4dGFsaWduXzE1XzA9cnVsZVRleHRBbGlnbkVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInRleHRhbGlnbiIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3RleHRhbGlnbl8xNV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlRleHRBbGlnbkVudW0iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyMzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3MjM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyNDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE3XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyNDoxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyNTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzE2PSAnYm9yZGVyLXRvcCcgKCAobHZfYm9yZGVyVG9wXzE3XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA1KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzI4OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzI4Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyODoxNjogKG90aGVybHZfMTY9ICdib3JkZXItdG9wJyAoIChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjcyODoxODogb3RoZXJsdl8xNj0gJ2JvcmRlci10b3AnICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xNj0oVG9rZW4pbWF0Y2goaW5wdXQsNDksRk9MTE9XXzQ5X2luX3J1bGVNZWRpYVN0eWxlNTk4Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xNiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyVG9wS2V5d29yZF8zXzVfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzMyOjE6ICggKGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjczMzoxOiAobHZfYm9yZGVyVG9wXzE3XzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzMzOjE6IChsdl9ib3JkZXJUb3BfMTdfMD0gcnVsZUJvcmRlclN0eWxlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzM0OjM6IGx2X2JvcmRlclRvcF8xN18wPSBydWxlQm9yZGVyU3R5bGUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJUb3BCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfNV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJvcmRlclN0eWxlX2luX3J1bGVNZWRpYVN0eWxlNjAwNCk7CisgICAgICAgICAgICAJICAgIGx2X2JvcmRlclRvcF8xN18wPXJ1bGVCb3JkZXJTdHlsZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiYm9yZGVyVG9wIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfYm9yZGVyVG9wXzE3XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc1Nzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3NTc6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc1ODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA2KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA2KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc1ODoxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc1OTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzE4PSAnYm9yZGVyLWJvdHRvbScgKCAobHZfYm9yZGVyQm90dG9tXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA2KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzYyOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzYyOjc6IHsuLi59PyA9PiAob3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc2MjoxNjogKG90aGVybHZfMTg9ICdib3JkZXItYm90dG9tJyAoIChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc2MjoxODogb3RoZXJsdl8xOD0gJ2JvcmRlci1ib3R0b20nICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xOD0oVG9rZW4pbWF0Y2goaW5wdXQsNTAsRk9MTE9XXzUwX2luX3J1bGVNZWRpYVN0eWxlNjA3Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xOCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyQm90dG9tS2V5d29yZF8zXzZfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzY2OjE6ICggKGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc2NzoxOiAobHZfYm9yZGVyQm90dG9tXzE5XzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzY3OjE6IChsdl9ib3JkZXJCb3R0b21fMTlfMD0gcnVsZUJvcmRlclN0eWxlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzY4OjM6IGx2X2JvcmRlckJvdHRvbV8xOV8wPSBydWxlQm9yZGVyU3R5bGUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfNl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJvcmRlclN0eWxlX2luX3J1bGVNZWRpYVN0eWxlNjA5Myk7CisgICAgICAgICAgICAJICAgIGx2X2JvcmRlckJvdHRvbV8xOV8wPXJ1bGVCb3JkZXJTdHlsZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiYm9yZGVyQm90dG9tIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfYm9yZGVyQm90dG9tXzE5XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgOCA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc5MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc5MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3OTI6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA3KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA3KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc5MjoxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzkzOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgNyk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjc5Njo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzIwPSAnYm9yZGVyLWxlZnQnICggKGx2X2JvcmRlckxlZnRfMjFfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzk2Ojc6IHsuLi59PyA9PiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyNzk2OjE2OiAob3RoZXJsdl8yMD0gJ2JvcmRlci1sZWZ0JyAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI3OTY6MTg6IG90aGVybHZfMjA9ICdib3JkZXItbGVmdCcgKCAobHZfYm9yZGVyTGVmdF8yMV8wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yMD0oVG9rZW4pbWF0Y2goaW5wdXQsNTEsRk9MTE9XXzUxX2luX3J1bGVNZWRpYVN0eWxlNjE2MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyTGVmdEtleXdvcmRfM183XzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjgwMDoxOiAoIChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODAxOjE6IChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODAxOjE6IChsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjgwMjozOiBsdl9ib3JkZXJMZWZ0XzIxXzA9IHJ1bGVCb3JkZXJTdHlsZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldEJvcmRlckxlZnRCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfN18xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJvcmRlclN0eWxlX2luX3J1bGVNZWRpYVN0eWxlNjE4Mik7CisgICAgICAgICAgICAJICAgIGx2X2JvcmRlckxlZnRfMjFfMD1ydWxlQm9yZGVyU3R5bGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImJvcmRlckxlZnQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9ib3JkZXJMZWZ0XzIxXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgOSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjgyNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODI1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODI2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjI9ICdib3JkZXItcmlnaHQnICggKGx2X2JvcmRlclJpZ2h0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA4KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCA4KSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjgyNjoxMDc6ICggKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Mjc6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDgpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4MzA6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODMwOjc6IHsuLi59PyA9PiAob3RoZXJsdl8yMj0gJ2JvcmRlci1yaWdodCcgKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4MzA6MTY6IChvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODMwOjE4OiBvdGhlcmx2XzIyPSAnYm9yZGVyLXJpZ2h0JyAoIChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8yMj0oVG9rZW4pbWF0Y2goaW5wdXQsNTIsRk9MTE9XXzUyX2luX3J1bGVNZWRpYVN0eWxlNjI1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyUmlnaHRLZXl3b3JkXzNfOF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4MzQ6MTogKCAobHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4MzU6MTogKGx2X2JvcmRlclJpZ2h0XzIzXzA9IHJ1bGVCb3JkZXJTdHlsZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODM1OjE6IChsdl9ib3JkZXJSaWdodF8yM18wPSBydWxlQm9yZGVyU3R5bGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4MzY6MzogbHZfYm9yZGVyUmlnaHRfMjNfMD0gcnVsZUJvcmRlclN0eWxlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0Qm9yZGVyUmlnaHRCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfOF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUJvcmRlclN0eWxlX2luX3J1bGVNZWRpYVN0eWxlNjI3MSk7CisgICAgICAgICAgICAJICAgIGx2X2JvcmRlclJpZ2h0XzIzXzA9cnVsZUJvcmRlclN0eWxlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJib3JkZXJSaWdodCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2JvcmRlclJpZ2h0XzIzXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQm9yZGVyU3R5bGUiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTAgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NTk6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODU5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NjA6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgOSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgOSkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NjA6MTA3OiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NjE6NjogKHsuLi59PyA9PiAob3RoZXJsdl8yND0gJ3BhZGRpbmctdG9wJyAoIChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgOSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg2NDo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzI0PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg2NDo3OiB7Li4ufT8gPT4gKG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NjQ6MTY6IChvdGhlcmx2XzI0PSAncGFkZGluZy10b3AnICggKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NjQ6MTg6IG90aGVybHZfMjQ9ICdwYWRkaW5nLXRvcCcgKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMjQ9KFRva2VuKW1hdGNoKGlucHV0LDUzLEZPTExPV181M19pbl9ydWxlTWVkaWFTdHlsZTYzMzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjQsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BLZXl3b3JkXzNfOV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Njg6MTogKCAobHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyODY5OjE6IChsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4Njk6MTogKGx2X3BhZGRpbmdUb3BWYWx1ZV8yNV8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4NzA6MzogbHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdUb3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM185XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZU1lZGlhU3R5bGU2MzYwKTsKKyAgICAgICAgICAgIAkgICAgbHZfcGFkZGluZ1RvcFZhbHVlXzI1XzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nVG9wVmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nVG9wVmFsdWVfMjVfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg4NjoyOiAoIChsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg4NzoxOiAobHZfcGFkZGluZ1RvcFVuaXRfMjZfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI4ODc6MTogKGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjg4ODozOiBsdl9wYWRkaW5nVG9wVW5pdF8yNl8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfOV8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVNZWRpYVN0eWxlNjM4MSk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdUb3BVbml0XzI2XzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nVG9wVW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdUb3BVbml0XzI2XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5pdEVudW0iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5MTE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTExOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5MTI6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkxMjoxMDg6ICggKHsuLi59PyA9PiAob3RoZXJsdl8yNz0gJ3BhZGRpbmctYm90dG9tJyAoIChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkxMzo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkxNjo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkxNjo3OiB7Li4ufT8gPT4gKG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5MTY6MTY6IChvdGhlcmx2XzI3PSAncGFkZGluZy1ib3R0b20nICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5MTY6MTg6IG90aGVybHZfMjc9ICdwYWRkaW5nLWJvdHRvbScgKCAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMjc9KFRva2VuKW1hdGNoKGlucHV0LDU0LEZPTExPV181NF9pbl9ydWxlTWVkaWFTdHlsZTY0NDkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjcsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21LZXl3b3JkXzNfMTBfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTIwOjE6ICggKGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkyMToxOiAobHZfcGFkZGluZ0JvdHRvbVZhbHVlXzI4XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTIxOjE6IChsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTIyOjM6IGx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wPSBydWxlVW5zaWduZWROdW1iZXIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nQm90dG9tVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbnNpZ25lZE51bWJlcl9pbl9ydWxlTWVkaWFTdHlsZTY0NzApOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nQm90dG9tVmFsdWVfMjhfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZGRpbmdCb3R0b21WYWx1ZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdCb3R0b21WYWx1ZV8yOF8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTM4OjI6ICggKGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTM5OjE6IChsdl9wYWRkaW5nQm90dG9tVW5pdF8yOV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MjkzOToxOiAobHZfcGFkZGluZ0JvdHRvbVVuaXRfMjlfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTQwOjM6IGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdCb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xMF8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVNZWRpYVN0eWxlNjQ5MSk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nQm90dG9tVW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdCb3R0b21Vbml0XzI5XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5pdEVudW0iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTIgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5NjM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTYzOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5NjQ6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTEpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDExKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk2NDoxMDg6ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMD0gJ3BhZGRpbmctbGVmdCcgKCAobHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk2NTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk2ODo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk2ODo3OiB7Li4ufT8gPT4gKG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5Njg6MTY6IChvdGhlcmx2XzMwPSAncGFkZGluZy1sZWZ0JyAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjI5Njg6MTg6IG90aGVybHZfMzA9ICdwYWRkaW5nLWxlZnQnICggKGx2X3BhZGRpbmdMZWZ0VmFsdWVfMzFfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMzA9KFRva2VuKW1hdGNoKGlucHV0LDU1LEZPTExPV181NV9pbl9ydWxlTWVkaWFTdHlsZTY1NTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0S2V5d29yZF8zXzExXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk3MjoxOiAoIChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTczOjE6IChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTczOjE6IChsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk3NDozOiBsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFBhZGRpbmdMZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbnNpZ25lZE51bWJlcl9pbl9ydWxlTWVkaWFTdHlsZTY1ODApOworICAgICAgICAgICAgCSAgICBsdl9wYWRkaW5nTGVmdFZhbHVlXzMxXzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nTGVmdFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcGFkZGluZ0xlZnRWYWx1ZV8zMV8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTkwOjI6ICggKGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mjk5MToxOiAobHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTkxOjE6IChsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzoyOTkyOjM6IGx2X3BhZGRpbmdMZWZ0VW5pdF8zMl8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzExXzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZU1lZGlhU3R5bGU2NjAxKTsKKyAgICAgICAgICAgIAkgICAgbHZfcGFkZGluZ0xlZnRVbml0XzMyXzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nTGVmdFVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nTGVmdFVuaXRfMzJfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxMyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAxNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwMTU6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAxNjo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzMzPSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMikgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTIpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDE2OjEwODogKCAoey4uLn0/ID0+IChvdGhlcmx2XzMzPSAncGFkZGluZy1yaWdodCcgKCAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDE3OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEyKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDIwOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDIwOjc6IHsuLi59PyA9PiAob3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAyMDoxNjogKG90aGVybHZfMzM9ICdwYWRkaW5nLXJpZ2h0JyAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAyMDoxODogb3RoZXJsdl8zMz0gJ3BhZGRpbmctcmlnaHQnICggKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8zMz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVNZWRpYVN0eWxlNjY2OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zMywgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UGFkZGluZ1JpZ2h0S2V5d29yZF8zXzEyXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAyNDoxOiAoIChsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAyNToxOiAobHZfcGFkZGluZ1JpZ2h0VmFsdWVfMzRfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwMjU6MTogKGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzAyNjozOiBsdl9wYWRkaW5nUmlnaHRWYWx1ZV8zNF8wPSBydWxlVW5zaWduZWROdW1iZXIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVNZWRpYVN0eWxlNjY5MCk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzA9cnVsZVVuc2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWRkaW5nUmlnaHRWYWx1ZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhZGRpbmdSaWdodFZhbHVlXzM0XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNDI6MjogKCAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA0MzoxOiAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA0MzoxOiAobHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNDQ6MzogbHZfcGFkZGluZ1JpZ2h0VW5pdF8zNV8wPSBydWxlVW5pdEVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRQYWRkaW5nUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xMl8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuaXRFbnVtX2luX3J1bGVNZWRpYVN0eWxlNjcxMSk7CisgICAgICAgICAgICAJICAgIGx2X3BhZGRpbmdSaWdodFVuaXRfMzVfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInBhZGRpbmdSaWdodFVuaXQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9wYWRkaW5nUmlnaHRVbml0XzM1XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5pdEVudW0iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTQgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNjc6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDY3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNjg6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTMpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDEzKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA2ODoxMDg6ICggKHsuLi59PyA9PiAob3RoZXJsdl8zNj0gJ21hcmdpbi10b3AnICggKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luVG9wVW5pdF8zOF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA2OTo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxMyk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA3Mjo2OiAoey4uLn0/ID0+IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzA3Mjo3OiB7Li4ufT8gPT4gKG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNzI6MTY6IChvdGhlcmx2XzM2PSAnbWFyZ2luLXRvcCcgKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Ub3BVbml0XzM4XzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNzI6MTg6IG90aGVybHZfMzY9ICdtYXJnaW4tdG9wJyAoIChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG90aGVybHZfMzY9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV181N19pbl9ydWxlTWVkaWFTdHlsZTY3NzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMzYsIGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblRvcEtleXdvcmRfM18xM18wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNzY6MTogKCAobHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNzc6MTogKGx2X21hcmdpblRvcFZhbHVlXzM3XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDc3OjE6IChsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwNzg6MzogbHZfbWFyZ2luVG9wVmFsdWVfMzdfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTNfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbnNpZ25lZE51bWJlcl9pbl9ydWxlTWVkaWFTdHlsZTY4MDApOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luVG9wVmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXJnaW5Ub3BWYWx1ZV8zN18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuc2lnbmVkTnVtYmVyIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDk0OjI6ICggKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwOTU6MTogKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMwOTU6MTogKGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMDk2OjM6IGx2X21hcmdpblRvcFVuaXRfMzhfMD0gcnVsZVVuaXRFbnVtCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTNfMl8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbml0RW51bV9pbl9ydWxlTWVkaWFTdHlsZTY4MjEpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5Ub3BVbml0XzM4XzA9cnVsZVVuaXRFbnVtKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtYXJnaW5Ub3BVbml0IiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luVG9wVW5pdF8zOF8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuaXRFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDE1IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTE5OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzM5PSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzExOTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTIwOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE0KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNCkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMjA6MTA4OiAoICh7Li4ufT8gPT4gKG90aGVybHZfMzk9ICdtYXJnaW4tYm90dG9tJyAoIChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMjE6NjogKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTQpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMjQ6NjogKHsuLi59PyA9PiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxMjQ6Nzogey4uLn0/ID0+IChvdGhlcmx2XzM5PSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlTWVkaWFTdHlsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTI0OjE2OiAob3RoZXJsdl8zOT0gJ21hcmdpbi1ib3R0b20nICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTI0OjE4OiBvdGhlcmx2XzM5PSAnbWFyZ2luLWJvdHRvbScgKCAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzM5PShUb2tlbiltYXRjaChpbnB1dCw1OCxGT0xMT1dfNThfaW5fcnVsZU1lZGlhU3R5bGU2ODg5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzM5LCBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRNYXJnaW5Cb3R0b21LZXl3b3JkXzNfMTRfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTI4OjE6ICggKGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTI5OjE6IChsdl9tYXJnaW5Cb3R0b21WYWx1ZV80MF8wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzEyOToxOiAobHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTMwOjM6IGx2X21hcmdpbkJvdHRvbVZhbHVlXzQwXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE0XzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5zaWduZWROdW1iZXJfaW5fcnVsZU1lZGlhU3R5bGU2OTEwKTsKKyAgICAgICAgICAgIAkgICAgbHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpbkJvdHRvbVZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luQm90dG9tVmFsdWVfNDBfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbnNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE0NjoyOiAoIChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTQ3OjE6IChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTQ3OjE6IChsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE0ODozOiBsdl9tYXJnaW5Cb3R0b21Vbml0XzQxXzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpbkJvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzE0XzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZU1lZGlhU3R5bGU2OTMxKTsKKyAgICAgICAgICAgIAkgICAgbHZfbWFyZ2luQm90dG9tVW5pdF80MV8wPXJ1bGVVbml0RW51bSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luQm90dG9tVW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X21hcmdpbkJvdHRvbVVuaXRfNDFfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxNiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE3MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxNzE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE3Mjo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQyPSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTUpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTcyOjEwODogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQyPSAnbWFyZ2luLWxlZnQnICggKGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpbkxlZnRVbml0XzQ0XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTczOjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE1KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTc2OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTc2Ojc6IHsuLi59PyA9PiAob3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE3NjoxNjogKG90aGVybHZfNDI9ICdtYXJnaW4tbGVmdCcgKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzE3NjoxODogb3RoZXJsdl80Mj0gJ21hcmdpbi1sZWZ0JyAoIChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl80Mj0oVG9rZW4pbWF0Y2goaW5wdXQsNTksRk9MTE9XXzU5X2luX3J1bGVNZWRpYVN0eWxlNjk5OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80MiwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdEtleXdvcmRfM18xNV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxODA6MTogKCAobHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTgxOjE6IChsdl9tYXJnaW5MZWZ0VmFsdWVfNDNfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxODE6MTogKGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPSBydWxlVW5zaWduZWROdW1iZXIgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxODI6MzogbHZfbWFyZ2luTGVmdFZhbHVlXzQzXzA9IHJ1bGVVbnNpZ25lZE51bWJlcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpbkxlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xNV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVNZWRpYVN0eWxlNzAyMCk7CisgICAgICAgICAgICAJICAgIGx2X21hcmdpbkxlZnRWYWx1ZV80M18wPXJ1bGVVbnNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWFyZ2luTGVmdFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luTGVmdFZhbHVlXzQzXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxOTg6MjogKCAobHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMxOTk6MTogKGx2X21hcmdpbkxlZnRVbml0XzQ0XzA9IHJ1bGVVbml0RW51bSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMTk5OjE6IChsdl9tYXJnaW5MZWZ0VW5pdF80NF8wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyMDA6MzogbHZfbWFyZ2luTGVmdFVuaXRfNDRfMD0gcnVsZVVuaXRFbnVtCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzE1XzJfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVW5pdEVudW1faW5fcnVsZU1lZGlhU3R5bGU3MDQxKTsKKyAgICAgICAgICAgIAkgICAgbHZfbWFyZ2luTGVmdFVuaXRfNDRfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpbkxlZnRVbml0IiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWFyZ2luTGVmdFVuaXRfNDRfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJVbml0RW51bSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxNyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzIyMzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyMjM6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzIyNDo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ1PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMygpLCAxNikgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVNZWRpYVN0eWxlIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSwgMTYpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjI0OjEwODogKCAoey4uLn0/ID0+IChvdGhlcmx2XzQ1PSAnbWFyZ2luLXJpZ2h0JyAoIChsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzA9IHJ1bGVVbnNpZ25lZE51bWJlciApICkgKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjI1OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCksIDE2KTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjI4OjY6ICh7Li4ufT8gPT4gKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjI4Ojc6IHsuLi59PyA9PiAob3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZU1lZGlhU3R5bGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzIyODoxNjogKG90aGVybHZfNDU9ICdtYXJnaW4tcmlnaHQnICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKSAoIChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzIyODoxODogb3RoZXJsdl80NT0gJ21hcmdpbi1yaWdodCcgKCAobHZfbWFyZ2luUmlnaHRWYWx1ZV80Nl8wPSBydWxlVW5zaWduZWROdW1iZXIgKSApICggKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl80NT0oVG9rZW4pbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzYwX2luX3J1bGVNZWRpYVN0eWxlNzEwOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80NSwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luUmlnaHRLZXl3b3JkXzNfMTZfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjMyOjE6ICggKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyMzM6MTogKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyMzM6MTogKGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjM0OjM6IGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD0gcnVsZVVuc2lnbmVkTnVtYmVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0TWFyZ2luUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xNl8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVuc2lnbmVkTnVtYmVyX2luX3J1bGVNZWRpYVN0eWxlNzEzMCk7CisgICAgICAgICAgICAJICAgIGx2X21hcmdpblJpZ2h0VmFsdWVfNDZfMD1ydWxlVW5zaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpblJpZ2h0VmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXJnaW5SaWdodFZhbHVlXzQ2XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiVW5zaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyNTA6MjogKCAobHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjUxOjE6IChsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD0gcnVsZVVuaXRFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyNTE6MTogKGx2X21hcmdpblJpZ2h0VW5pdF80N18wPSBydWxlVW5pdEVudW0gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyNTI6MzogbHZfbWFyZ2luUmlnaHRVbml0XzQ3XzA9IHJ1bGVVbml0RW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldE1hcmdpblJpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTZfMl8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVbml0RW51bV9pbl9ydWxlTWVkaWFTdHlsZTcxNTEpOworICAgICAgICAgICAgCSAgICBsdl9tYXJnaW5SaWdodFVuaXRfNDdfMD1ydWxlVW5pdEVudW0oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1hcmdpblJpZ2h0VW5pdCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X21hcmdpblJpZ2h0VW5pdF80N18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlVuaXRFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0TWVkaWFTdHlsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzMoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8zKCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfNDg9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlTWVkaWFTdHlsZTcyMDQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80OCwgZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVN0eWxlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU1lZGlhU3R5bGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlU29tZUZvcm1hdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyOTQ6MTogZW50cnlSdWxlU29tZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlU29tZUZvcm1hdD0gcnVsZVNvbWVGb3JtYXQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVTb21lRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVTb21lRm9ybWF0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMyOTU6MjogKGl2X3J1bGVTb21lRm9ybWF0PSBydWxlU29tZUZvcm1hdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMjk2OjI6IGl2X3J1bGVTb21lRm9ybWF0PSBydWxlU29tZUZvcm1hdCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVTb21lRm9ybWF0X2luX2VudHJ5UnVsZVNvbWVGb3JtYXQ3MjQwKTsKKyAgICAgICAgICAgIGl2X3J1bGVTb21lRm9ybWF0PXJ1bGVTb21lRm9ybWF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlU29tZUZvcm1hdDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVTb21lRm9ybWF0NzI1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVTb21lRm9ybWF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVTb21lRm9ybWF0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMwMzoxOiBydWxlU29tZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19Vb21vRm9ybWF0XzA9IHJ1bGVVb21vRm9ybWF0IHwgdGhpc19OdW1iZXJGb3JtYXRfMT0gcnVsZU51bWJlckZvcm1hdCB8IHRoaXNfQ3VycmVuY3lGb3JtYXRfMj0gcnVsZUN1cnJlbmN5Rm9ybWF0IHwgdGhpc19EYXRlRm9ybWF0XzM9IHJ1bGVEYXRlRm9ybWF0IHwgdGhpc19EYXRlVGltZUZvcm1hdF80PSBydWxlRGF0ZVRpbWVGb3JtYXQgfCB0aGlzX1RpbWVGb3JtYXRfNT0gcnVsZVRpbWVGb3JtYXQgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVNvbWVGb3JtYXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Vb21vRm9ybWF0XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19OdW1iZXJGb3JtYXRfMSA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX0N1cnJlbmN5Rm9ybWF0XzIgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19EYXRlRm9ybWF0XzMgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19EYXRlVGltZUZvcm1hdF80ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfVGltZUZvcm1hdF81ID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMwNjoyODogKCAodGhpc19Vb21vRm9ybWF0XzA9IHJ1bGVVb21vRm9ybWF0IHwgdGhpc19OdW1iZXJGb3JtYXRfMT0gcnVsZU51bWJlckZvcm1hdCB8IHRoaXNfQ3VycmVuY3lGb3JtYXRfMj0gcnVsZUN1cnJlbmN5Rm9ybWF0IHwgdGhpc19EYXRlRm9ybWF0XzM9IHJ1bGVEYXRlRm9ybWF0IHwgdGhpc19EYXRlVGltZUZvcm1hdF80PSBydWxlRGF0ZVRpbWVGb3JtYXQgfCB0aGlzX1RpbWVGb3JtYXRfNT0gcnVsZVRpbWVGb3JtYXQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzMDc6MTogKHRoaXNfVW9tb0Zvcm1hdF8wPSBydWxlVW9tb0Zvcm1hdCB8IHRoaXNfTnVtYmVyRm9ybWF0XzE9IHJ1bGVOdW1iZXJGb3JtYXQgfCB0aGlzX0N1cnJlbmN5Rm9ybWF0XzI9IHJ1bGVDdXJyZW5jeUZvcm1hdCB8IHRoaXNfRGF0ZUZvcm1hdF8zPSBydWxlRGF0ZUZvcm1hdCB8IHRoaXNfRGF0ZVRpbWVGb3JtYXRfND0gcnVsZURhdGVUaW1lRm9ybWF0IHwgdGhpc19UaW1lRm9ybWF0XzU9IHJ1bGVUaW1lRm9ybWF0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMwNzoxOiAodGhpc19Vb21vRm9ybWF0XzA9IHJ1bGVVb21vRm9ybWF0IHwgdGhpc19OdW1iZXJGb3JtYXRfMT0gcnVsZU51bWJlckZvcm1hdCB8IHRoaXNfQ3VycmVuY3lGb3JtYXRfMj0gcnVsZUN1cnJlbmN5Rm9ybWF0IHwgdGhpc19EYXRlRm9ybWF0XzM9IHJ1bGVEYXRlRm9ybWF0IHwgdGhpc19EYXRlVGltZUZvcm1hdF80PSBydWxlRGF0ZVRpbWVGb3JtYXQgfCB0aGlzX1RpbWVGb3JtYXRfNT0gcnVsZVRpbWVGb3JtYXQgKQorICAgICAgICAgICAgaW50IGFsdDI3PTY7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI3PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mjc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyNz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI3PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mjc9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyNz02OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyNywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyNykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMwODo1OiB0aGlzX1VvbW9Gb3JtYXRfMD0gcnVsZVVvbW9Gb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldFVvbW9Gb3JtYXRQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVVvbW9Gb3JtYXRfaW5fcnVsZVNvbWVGb3JtYXQ3Mjk3KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19Vb21vRm9ybWF0XzA9cnVsZVVvbW9Gb3JtYXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Vb21vRm9ybWF0XzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzE4OjU6IHRoaXNfTnVtYmVyRm9ybWF0XzE9IHJ1bGVOdW1iZXJGb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldE51bWJlckZvcm1hdFBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlTnVtYmVyRm9ybWF0X2luX3J1bGVTb21lRm9ybWF0NzMyNCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfTnVtYmVyRm9ybWF0XzE9cnVsZU51bWJlckZvcm1hdCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX051bWJlckZvcm1hdF8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMyODo1OiB0aGlzX0N1cnJlbmN5Rm9ybWF0XzI9IHJ1bGVDdXJyZW5jeUZvcm1hdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0Q3VycmVuY3lGb3JtYXRQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUN1cnJlbmN5Rm9ybWF0X2luX3J1bGVTb21lRm9ybWF0NzM1MSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ3VycmVuY3lGb3JtYXRfMj1ydWxlQ3VycmVuY3lGb3JtYXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DdXJyZW5jeUZvcm1hdF8yOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzMzODo1OiB0aGlzX0RhdGVGb3JtYXRfMz0gcnVsZURhdGVGb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdEFjY2VzcygpLmdldERhdGVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZURhdGVGb3JtYXRfaW5fcnVsZVNvbWVGb3JtYXQ3Mzc4KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19EYXRlRm9ybWF0XzM9cnVsZURhdGVGb3JtYXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19EYXRlRm9ybWF0XzM7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzQ4OjU6IHRoaXNfRGF0ZVRpbWVGb3JtYXRfND0gcnVsZURhdGVUaW1lRm9ybWF0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlVGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzQoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRGF0ZVRpbWVGb3JtYXRfaW5fcnVsZVNvbWVGb3JtYXQ3NDA1KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19EYXRlVGltZUZvcm1hdF80PXJ1bGVEYXRlVGltZUZvcm1hdCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX0RhdGVUaW1lRm9ybWF0XzQ7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzU4OjU6IHRoaXNfVGltZUZvcm1hdF81PSBydWxlVGltZUZvcm1hdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0VGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzUoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVGltZUZvcm1hdF9pbl9ydWxlU29tZUZvcm1hdDc0MzIpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1RpbWVGb3JtYXRfNT1ydWxlVGltZUZvcm1hdCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1RpbWVGb3JtYXRfNTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVNvbWVGb3JtYXQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVW9tb0Zvcm1hdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzNzQ6MTogZW50cnlSdWxlVW9tb0Zvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlVW9tb0Zvcm1hdD0gcnVsZVVvbW9Gb3JtYXQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVVb21vRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVVb21vRm9ybWF0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzNzU6MjogKGl2X3J1bGVVb21vRm9ybWF0PSBydWxlVW9tb0Zvcm1hdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzc2OjI6IGl2X3J1bGVVb21vRm9ybWF0PSBydWxlVW9tb0Zvcm1hdCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVVb21vRm9ybWF0X2luX2VudHJ5UnVsZVVvbW9Gb3JtYXQ3NDY3KTsKKyAgICAgICAgICAgIGl2X3J1bGVVb21vRm9ybWF0PXJ1bGVVb21vRm9ybWF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlVW9tb0Zvcm1hdDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVVb21vRm9ybWF0NzQ3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVVb21vRm9ybWF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVVb21vRm9ybWF0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM4MzoxOiBydWxlVW9tb0Zvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAndW9tbycgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X3BhdHRlcm5fNl8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl83PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOF8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl85PSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVVvbW9Gb3JtYXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9uYW1lXzFfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIGx2X3VpX3BhdHRlcm5fNF8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBsdl9yZXBvcnRfcGF0dGVybl82XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl83PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3RleHRhbGlnbl84XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzg2OjI4OiAoIChvdGhlcmx2XzA9ICd1b21vJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfcGF0dGVybl82XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzc9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl84XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2Xzk9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM4NzoxOiAob3RoZXJsdl8wPSAndW9tbycgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X3BhdHRlcm5fNl8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl83PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOF8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl85PSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzg3OjE6IChvdGhlcmx2XzA9ICd1b21vJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfcGF0dGVybl82XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzc9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl84XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2Xzk9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzODc6Mzogb3RoZXJsdl8wPSAndW9tbycgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X3BhdHRlcm5fNl8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl83PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOF8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl85PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzYxX2luX3J1bGVVb21vRm9ybWF0NzUxNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFVvbW9LZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM5MToxOiAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzM5MjoxOiAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozMzkyOjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjMzOTM6MzogbHZfbmFtZV8xXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X25hbWVfMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVVb21vRm9ybWF0NzUzMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfbmFtZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIklEIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVVb21vRm9ybWF0NzU0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzYyX2luX3J1bGVVb21vRm9ybWF0NzU2MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFVpS2V5d29yZF8zKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM0MTc6MTogKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDE4OjE6IChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDE4OjE6IChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDE5OjM6IGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORworICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfdWlfcGF0dGVybl80XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlVW9tb0Zvcm1hdDc1NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X3VpX3BhdHRlcm5fNF8wLCBncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkidWlfcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl91aV9wYXR0ZXJuXzRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfNT0oVG9rZW4pbWF0Y2goaW5wdXQsNjMsRk9MTE9XXzYzX2luX3J1bGVVb21vRm9ybWF0NzU5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfNSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDM5OjE6ICggKGx2X3JlcG9ydF9wYXR0ZXJuXzZfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM0NDA6MTogKGx2X3JlcG9ydF9wYXR0ZXJuXzZfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDQwOjE6IChsdl9yZXBvcnRfcGF0dGVybl82XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ0MTozOiBsdl9yZXBvcnRfcGF0dGVybl82XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl9yZXBvcnRfcGF0dGVybl82XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlVW9tb0Zvcm1hdDc2MTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzZfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl82XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2Xzc9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlVW9tb0Zvcm1hdDc2MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzcoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ2MToxOiAoIChsdl90ZXh0YWxpZ25fOF8wPSBydWxlVGV4dEFsaWduRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ2MjoxOiAobHZfdGV4dGFsaWduXzhfMD0gcnVsZVRleHRBbGlnbkVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNDYyOjE6IChsdl90ZXh0YWxpZ25fOF8wPSBydWxlVGV4dEFsaWduRW51bSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM0NjM6MzogbHZfdGV4dGFsaWduXzhfMD0gcnVsZVRleHRBbGlnbkVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0VGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF84XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRleHRBbGlnbkVudW1faW5fcnVsZVVvbW9Gb3JtYXQ3NjQ5KTsKKyAgICAgICAgICAgIGx2X3RleHRhbGlnbl84XzA9cnVsZVRleHRBbGlnbkVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInRleHRhbGlnbiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl90ZXh0YWxpZ25fOF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZVVvbW9Gb3JtYXQ3NjYxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzkoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVVvbW9Gb3JtYXQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlTnVtYmVyRm9ybWF0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ5MToxOiBlbnRyeVJ1bGVOdW1iZXJGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZU51bWJlckZvcm1hdD0gcnVsZU51bWJlckZvcm1hdCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZU51bWJlckZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlTnVtYmVyRm9ybWF0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM0OTI6MjogKGl2X3J1bGVOdW1iZXJGb3JtYXQ9IHJ1bGVOdW1iZXJGb3JtYXQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzQ5MzoyOiBpdl9ydWxlTnVtYmVyRm9ybWF0PSBydWxlTnVtYmVyRm9ybWF0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlTnVtYmVyRm9ybWF0X2luX2VudHJ5UnVsZU51bWJlckZvcm1hdDc2OTcpOworICAgICAgICAgICAgaXZfcnVsZU51bWJlckZvcm1hdD1ydWxlTnVtYmVyRm9ybWF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlTnVtYmVyRm9ybWF0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU51bWJlckZvcm1hdDc3MDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlTnVtYmVyRm9ybWF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVOdW1iZXJGb3JtYXQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTAwOjE6IHJ1bGVOdW1iZXJGb3JtYXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ251bWJlcicgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZU51bWJlckZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVOdW1iZXJGb3JtYXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9uYW1lXzFfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIGx2X3VpX3BhdHRlcm5fNF8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBsdl9yZXBvcnRfcGF0dGVybl83XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl84PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTA9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdG9yIGx2X3RleHRhbGlnbl85XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTAzOjI4OiAoIChvdGhlcmx2XzA9ICdudW1iZXInICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gKSApICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfOD0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApIG90aGVybHZfMTA9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzUwNDoxOiAob3RoZXJsdl8wPSAnbnVtYmVyJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtICkgKSAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzg9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2XzEwPSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTA0OjE6IChvdGhlcmx2XzA9ICdudW1iZXInICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gKSApICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfOD0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApIG90aGVybHZfMTA9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1MDQ6Mzogb3RoZXJsdl8wPSAnbnVtYmVyJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtICkgKSAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzg9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2XzEwPSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNjQsRk9MTE9XXzY0X2luX3J1bGVOdW1iZXJGb3JtYXQ3NzQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXROdW1iZXJLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzUwODoxOiAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzUwOToxOiAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTA5OjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1MTA6MzogbHZfbmFtZV8xXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X25hbWVfMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVOdW1iZXJGb3JtYXQ3NzYxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl9uYW1lXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIklEIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVOdW1iZXJGb3JtYXQ3Nzc4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDYyLEZPTExPV182Ml9pbl9ydWxlTnVtYmVyRm9ybWF0Nzc5MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0VWlLZXl3b3JkXzMoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzUzNDoxOiAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1MzU6MTogKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1MzU6MTogKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1MzY6MzogbHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl91aV9wYXR0ZXJuXzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVOdW1iZXJGb3JtYXQ3ODA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl91aV9wYXR0ZXJuXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJ1aV9wYXR0ZXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3VpX3BhdHRlcm5fNF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNjNfaW5fcnVsZU51bWJlckZvcm1hdDc4MjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfNSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTU2OjE6ICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1NTc6MTogKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTU3OjE6IChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzU1ODozOiBsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X2NhdGVnb3J5TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtX2luX3J1bGVOdW1iZXJGb3JtYXQ3ODQ1KTsKKyAgICAgICAgICAgIGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZU51bWJlckZvcm1hdENhdGVnb3J5RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJyZXBvcnRfY2F0ZWdvcnkiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcmVwb3J0X2NhdGVnb3J5XzZfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTc0OjI6ICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1NzU6MTogKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTc1OjE6IChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzU3NjozOiBsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl9yZXBvcnRfcGF0dGVybl83XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlTnVtYmVyRm9ybWF0Nzg2Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfcmVwb3J0X3BhdHRlcm5fN18wLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl83XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlTnVtYmVyRm9ybWF0Nzg3OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0VGV4dGFsaWduS2V5d29yZF84KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1OTY6MTogKCAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM1OTc6MTogKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzU5NzoxOiAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNTk4OjM6IGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0VGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF85XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRleHRBbGlnbkVudW1faW5fcnVsZU51bWJlckZvcm1hdDc5MDApOworICAgICAgICAgICAgbHZfdGV4dGFsaWduXzlfMD1ydWxlVGV4dEFsaWduRW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJ0ZXh0YWxpZ24iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdGV4dGFsaWduXzlfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVGV4dEFsaWduRW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMTA9KFRva2VuKW1hdGNoKGlucHV0LDE4LEZPTExPV18xOF9pbl9ydWxlTnVtYmVyRm9ybWF0NzkxMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlTnVtYmVyRm9ybWF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUN1cnJlbmN5Rm9ybWF0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzYyNjoxOiBlbnRyeVJ1bGVDdXJyZW5jeUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ3VycmVuY3lGb3JtYXQ9IHJ1bGVDdXJyZW5jeUZvcm1hdCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUN1cnJlbmN5Rm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDdXJyZW5jeUZvcm1hdCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjI3OjI6IChpdl9ydWxlQ3VycmVuY3lGb3JtYXQ9IHJ1bGVDdXJyZW5jeUZvcm1hdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjI4OjI6IGl2X3J1bGVDdXJyZW5jeUZvcm1hdD0gcnVsZUN1cnJlbmN5Rm9ybWF0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDdXJyZW5jeUZvcm1hdF9pbl9lbnRyeVJ1bGVDdXJyZW5jeUZvcm1hdDc5NDgpOworICAgICAgICAgICAgaXZfcnVsZUN1cnJlbmN5Rm9ybWF0PXJ1bGVDdXJyZW5jeUZvcm1hdCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUN1cnJlbmN5Rm9ybWF0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUN1cnJlbmN5Rm9ybWF0Nzk1OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDdXJyZW5jeUZvcm1hdCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ3VycmVuY3lGb3JtYXQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjM1OjE6IHJ1bGVDdXJyZW5jeUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnY3VycmVuY3knICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDdXJyZW5jeUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X25hbWVfMV8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfdWlfcGF0dGVybl80XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMD1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3JlcG9ydF9jYXRlZ29yeV82XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfdGV4dGFsaWduXzlfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM2Mzg6Mjg6ICggKG90aGVybHZfMD0gJ2N1cnJlbmN5JyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0gKSApICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfOD0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApIG90aGVybHZfMTA9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzYzOToxOiAob3RoZXJsdl8wPSAnY3VycmVuY3knICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzYzOToxOiAob3RoZXJsdl8wPSAnY3VycmVuY3knICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzYzOTozOiBvdGhlcmx2XzA9ICdjdXJyZW5jeScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtICkgKSAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzg9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2XzEwPSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNjUsRk9MTE9XXzY1X2luX3J1bGVDdXJyZW5jeUZvcm1hdDc5OTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0Q3VycmVuY3lLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY0MzoxOiAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY0NDoxOiAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjQ0OjE6IChsdl9uYW1lXzFfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM2NDU6MzogbHZfbmFtZV8xXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X25hbWVfMV8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVDdXJyZW5jeUZvcm1hdDgwMTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIklEIik7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVDdXJyZW5jeUZvcm1hdDgwMjkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw2MixGT0xMT1dfNjJfaW5fcnVsZUN1cnJlbmN5Rm9ybWF0ODA0MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjY5OjE6ICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY3MDoxOiAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY3MDoxOiAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY3MTozOiBsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X3VpX3BhdHRlcm5fNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZUN1cnJlbmN5Rm9ybWF0ODA1OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfdWlfcGF0dGVybl80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInVpX3BhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDYzLEZPTExPV182M19pbl9ydWxlQ3VycmVuY3lGb3JtYXQ4MDc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydEtleXdvcmRfNSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNjkxOjE6ICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY5MjoxOiAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY5MjoxOiAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzY5MzozOiBsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1faW5fcnVsZUN1cnJlbmN5Rm9ybWF0ODA5Nik7CisgICAgICAgICAgICBsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPXJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInJlcG9ydF9jYXRlZ29yeSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzcwOToyOiAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzEwOjE6IChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzcxMDoxOiAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3MTE6MzogbHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORworICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfcmVwb3J0X3BhdHRlcm5fN18wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZUN1cnJlbmN5Rm9ybWF0ODExMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJbmV3TGVhZk5vZGUobHZfcmVwb3J0X3BhdHRlcm5fN18wLCBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicmVwb3J0X3BhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcmVwb3J0X3BhdHRlcm5fN18wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCw0OCxGT0xMT1dfNDhfaW5fcnVsZUN1cnJlbmN5Rm9ybWF0ODEzMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzczMToxOiAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzczMjoxOiAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzMyOjE6IChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3MzM6MzogbHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUZXh0QWxpZ25FbnVtX2luX3J1bGVDdXJyZW5jeUZvcm1hdDgxNTEpOworICAgICAgICAgICAgbHZfdGV4dGFsaWduXzlfMD1ydWxlVGV4dEFsaWduRW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInRleHRhbGlnbiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl90ZXh0YWxpZ25fOV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTgsRk9MTE9XXzE4X2luX3J1bGVDdXJyZW5jeUZvcm1hdDgxNjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMCwgZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ3VycmVuY3lGb3JtYXQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRGF0ZUZvcm1hdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NjE6MTogZW50cnlSdWxlRGF0ZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlRGF0ZUZvcm1hdD0gcnVsZURhdGVGb3JtYXQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVEYXRlRm9ybWF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVEYXRlRm9ybWF0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NjI6MjogKGl2X3J1bGVEYXRlRm9ybWF0PSBydWxlRGF0ZUZvcm1hdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzYzOjI6IGl2X3J1bGVEYXRlRm9ybWF0PSBydWxlRGF0ZUZvcm1hdCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVEYXRlRm9ybWF0X2luX2VudHJ5UnVsZURhdGVGb3JtYXQ4MTk5KTsKKyAgICAgICAgICAgIGl2X3J1bGVEYXRlRm9ybWF0PXJ1bGVEYXRlRm9ybWF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlRGF0ZUZvcm1hdDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVEYXRlRm9ybWF0ODIwOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVEYXRlRm9ybWF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVEYXRlRm9ybWF0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc3MDoxOiBydWxlRGF0ZUZvcm1hdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnZGF0ZScgKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snIG90aGVybHZfMz0gJ3VpJyAoIChsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfNT0gJ3JlcG9ydCcgKCAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0gKSApICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApIG90aGVybHZfOD0gJ3RleHRhbGlnbicgKCAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKSApIG90aGVybHZfMTA9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlRGF0ZUZvcm1hdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X25hbWVfMV8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfdWlfcGF0dGVybl80XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMD1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3JlcG9ydF9jYXRlZ29yeV82XzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfdGV4dGFsaWduXzlfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NzM6Mjg6ICggKG90aGVybHZfMD0gJ2RhdGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtICkgKSAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzg9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2XzEwPSAnfScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3NzQ6MTogKG90aGVybHZfMD0gJ2RhdGUnICggKGx2X25hbWVfMV8wPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyBvdGhlcmx2XzM9ICd1aScgKCAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2XzU9ICdyZXBvcnQnICggKGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9IHJ1bGVEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtICkgKSAoIChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkgKSBvdGhlcmx2Xzg9ICd0ZXh0YWxpZ24nICggKGx2X3RleHRhbGlnbl85XzA9IHJ1bGVUZXh0QWxpZ25FbnVtICkgKSBvdGhlcmx2XzEwPSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzc0OjE6IChvdGhlcmx2XzA9ICdkYXRlJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc3NDozOiBvdGhlcmx2XzA9ICdkYXRlJyAoIChsdl9uYW1lXzFfMD0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgb3RoZXJsdl8zPSAndWknICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl81PSAncmVwb3J0JyAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bSApICkgKCAobHZfcmVwb3J0X3BhdHRlcm5fN18wPSBSVUxFX1NUUklORyApICkgb3RoZXJsdl84PSAndGV4dGFsaWduJyAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkgb3RoZXJsdl8xMD0gJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDY2LEZPTExPV182Nl9pbl9ydWxlRGF0ZUZvcm1hdDgyNDYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXREYXRlS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3Nzg6MTogKCAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM3Nzk6MTogKGx2X25hbWVfMV8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzc3OToxOiAobHZfbmFtZV8xXzA9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozNzgwOjM6IGx2X25hbWVfMV8wPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl9uYW1lXzFfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlRGF0ZUZvcm1hdDgyNjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X25hbWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJJRCIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlRGF0ZUZvcm1hdDgyODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDYyLEZPTExPV182Ml9pbl9ydWxlRGF0ZUZvcm1hdDgyOTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRVaUtleXdvcmRfMygpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODA0OjE6ICggKGx2X3VpX3BhdHRlcm5fNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzgwNToxOiAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzgwNToxOiAobHZfdWlfcGF0dGVybl80XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzgwNjozOiBsdl91aV9wYXR0ZXJuXzRfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X3VpX3BhdHRlcm5fNF8wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZURhdGVGb3JtYXQ4MzA5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl91aV9wYXR0ZXJuXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0VWlfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wKCkpOyAKKyAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZUZvcm1hdFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInVpX3BhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfdWlfcGF0dGVybl80XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDYzLEZPTExPV182M19pbl9ydWxlRGF0ZUZvcm1hdDgzMjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRLZXl3b3JkXzUoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzgyNjoxOiAoIChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6MzgyNzoxOiAobHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODI3OjE6IChsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wPSBydWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4Mjg6MzogbHZfcmVwb3J0X2NhdGVnb3J5XzZfMD0gcnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X2NhdGVnb3J5RGF0ZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW1faW5fcnVsZURhdGVGb3JtYXQ4MzQ3KTsKKyAgICAgICAgICAgIGx2X3JlcG9ydF9jYXRlZ29yeV82XzA9cnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInJlcG9ydF9jYXRlZ29yeSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZXBvcnRfY2F0ZWdvcnlfNl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODQ0OjI6ICggKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4NDU6MTogKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODQ1OjE6IChsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzg0NjozOiBsdl9yZXBvcnRfcGF0dGVybl83XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl9yZXBvcnRfcGF0dGVybl83XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlRGF0ZUZvcm1hdDgzNjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X3JlcG9ydF9wYXR0ZXJuXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpKTsgCisgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJyZXBvcnRfcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZXBvcnRfcGF0dGVybl83XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNUUklORyIpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2Xzg9KFRva2VuKW1hdGNoKGlucHV0LDQ4LEZPTExPV180OF9pbl9ydWxlRGF0ZUZvcm1hdDgzODEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzg2NjoxOiAoIChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsUmVwb3J0RFNMLmc6Mzg2NzoxOiAobHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxSZXBvcnREU0wuZzozODY3OjE6IChsdl90ZXh0YWxpZ25fOV8wPSBydWxlVGV4dEFsaWduRW51bSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFJlcG9ydERTTC5nOjM4Njg6MzogbHZfdGV4dGFsaWduXzlfMD0gcnVsZVRleHRBbGlnbkVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0VGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF85XzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRleHRBbGlnbkVudW1faW5fcnVsZURhdGVGb3JtYXQ4NDAyKTsKKyAgICAgICAgICAgIGx2X3RleHRhbGlnbl85XzA9cnVsZVRleHRBbGlnbkVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInRleHRhbGlnbiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl90ZXh0YWxpZ25fOV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJUZXh0QWxpZ25FbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvc2VyaWFsaXplci9SZXBvcnREU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zZXJpYWxpemVyL1JlcG9ydERTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNjVlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvc2VyaWFsaXplci9SZXBvcnREU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhCkBAIC0wLDAgKzEsMjc0OSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNlcmlhbGl6ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxJbXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLk9TQlBUeXBlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQXV0b1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQm9yZGVyU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1c3RvbUZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBGb290ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRm9udHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkQ2VsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkUm93OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk51bWJlckZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRGV0YWlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VGb290ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZVRlbXBsYXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU29tZUZvcm1hdHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVCaW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUNlbGxDb2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZURhdGVEYXlMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVJY29uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTnVtYmVySW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVOdW1iZXJMb29rdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVB1cmVBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVN0cmluZ0xvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRleHRDb2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVRyZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGl0bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW9tb0Zvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJ2aWNlcy5SZXBvcnREU0xHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1Gb3JtYWxQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUlubmVyVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtTG93ZXJCb3VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVVwcGVyQm91bmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuVHlwZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYWNjZXB0b3IuSVNlbWFudGljU2VxdWVuY2VBY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFjY2VwdG9yLlNlcXVlbmNlRmVlZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuZGlhZ25vc3RpYy5JU2VtYW50aWNTZXF1ZW5jZXJEaWFnbm9zdGljUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5kaWFnbm9zdGljLklTZXJpYWxpemF0aW9uRGlhZ25vc3RpYy5BY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5HZW5lcmljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklTZW1hbnRpY05vZGVQcm92aWRlci5JTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVNlbWFudGljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklUcmFuc2llbnRWYWx1ZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVRyYW5zaWVudFZhbHVlU2VydmljZS5WYWx1ZVRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQmFzaWNGb3JMb29wRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQmluYXJ5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCbG9ja0V4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEJvb2xlYW5MaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXNlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2FzdGVkRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2F0Y2hDbGF1c2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENsb3N1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENvbnN0cnVjdG9yQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YRG9XaGlsZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEZlYXR1cmVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhGb3JMb29wRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YSWZFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhJbnN0YW5jZU9mRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTGlzdExpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWE1lbWJlckZlYXR1cmVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhOdWxsTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTnVtYmVyTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YUG9zdGZpeE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YUmV0dXJuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU2V0TGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3RyaW5nTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3dpdGNoRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3luY2hyb25pemVkRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVGhyb3dFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUeXBlTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVW5hcnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFdoaWxlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuc2VyaWFsaXplci5YYmFzZVdpdGhBbm5vdGF0aW9uc1NlbWFudGljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy54QW5ub3RhdGlvbnMuWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlhGdW5jdGlvblR5cGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlhJbXBvcnRTZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlUGFja2FnZTsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMU2VtYW50aWNTZXF1ZW5jZXIgZXh0ZW5kcyBYYmFzZVdpdGhBbm5vdGF0aW9uc1NlbWFudGljU2VxdWVuY2VyIHsKKworCUBJbmplY3QKKwlwcml2YXRlIFJlcG9ydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXF1ZW5jZShFT2JqZWN0IGNvbnRleHQsIEVPYmplY3Qgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBSZXBvcnREU0xQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQVVUT19URVhUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRBdXRvVGV4dFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0F1dG9UZXh0KGNvbnRleHQsIChBdXRvVGV4dCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CT1JERVJfU1RZTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEJvcmRlclN0eWxlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0JvcmRlclN0eWxlKGNvbnRleHQsIChCb3JkZXJTdHlsZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5CVUlMRF9JTl9GT05UX0ZBTUlMWToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0QnVpbGRJbkZvbnRGYW1pbHlSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Rm9udEZhbWlseVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9CdWlsZEluRm9udEZhbWlseShjb250ZXh0LCAoQnVpbGRJbkZvbnRGYW1pbHkpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuQ09MT1I6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENvbG9yUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NvbG9yKGNvbnRleHQsIChDb2xvcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DT0xPUlM6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENvbG9yc1J1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Db2xvcnMoY29udGV4dCwgKENvbG9ycykgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5DVVJSRU5DWV9GT1JNQVQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQ3VycmVuY3lGb3JtYXQoY29udGV4dCwgKEN1cnJlbmN5Rm9ybWF0KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkNVU1RPTV9GT05UX0ZBTUlMWToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRGb250RmFtaWx5UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0N1c3RvbUZvbnRGYW1pbHkoY29udGV4dCwgKEN1c3RvbUZvbnRGYW1pbHkpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9EYXRhbWFydFRhYmxlKGNvbnRleHQsIChEYXRhbWFydFRhYmxlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0RFVEFJTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9EYXRhbWFydFRhYmxlRGV0YWlsKGNvbnRleHQsIChEYXRhbWFydFRhYmxlRGV0YWlsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEFNQVJUX1RBQkxFX0dST1VQOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRGF0YW1hcnRUYWJsZUdyb3VwKGNvbnRleHQsIChEYXRhbWFydFRhYmxlR3JvdXApIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfRk9PVEVSOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyKGNvbnRleHQsIChEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfR1JPVVBfSEVBREVSOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyKGNvbnRleHQsIChEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuREFUQU1BUlRfVEFCTEVfUFJPUEVSVFk6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eShjb250ZXh0LCAoRGF0YW1hcnRUYWJsZVByb3BlcnR5KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLkRBVEVfRk9STUFUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFNvbWVGb3JtYXRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRGF0ZUZvcm1hdChjb250ZXh0LCAoRGF0ZUZvcm1hdCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5EQVRFX1RJTUVfRk9STUFUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0RhdGVUaW1lRm9ybWF0KGNvbnRleHQsIChEYXRlVGltZUZvcm1hdCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5GT05UOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRGb250UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0ZvbnQoY29udGV4dCwgKEZvbnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuRk9OVFM6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEZvbnRzUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0ZvbnRzKGNvbnRleHQsIChGb250cykgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEdyaWRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfR3JpZChjb250ZXh0LCAoR3JpZCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5HUklEX0NFTEw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENvbnRhaW5lclJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRHcmlkQ2VsbFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9HcmlkQ2VsbChjb250ZXh0LCAoR3JpZENlbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuR1JJRF9ST1c6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEdyaWRSb3dSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfR3JpZFJvdyhjb250ZXh0LCAoR3JpZFJvdykgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5JTUFHRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRJbWFnZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9JbWFnZShjb250ZXh0LCAoSW1hZ2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTEFCRUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0TGFiZWxSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfTGFiZWwoY29udGV4dCwgKExhYmVsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLk1FRElBOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRNZWRpYVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9NZWRpYShjb250ZXh0LCAoTWVkaWEpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuTUVESUFfU1RZTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldE1lZGlhU3R5bGVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfTWVkaWFTdHlsZShjb250ZXh0LCAoTWVkaWFTdHlsZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5NRURJQVM6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldE1lZGlhc1J1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9NZWRpYXMoY29udGV4dCwgKE1lZGlhcykgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5OVU1CRVJfRk9STUFUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9OdW1iZXJGb3JtYXQoY29udGV4dCwgKE51bWJlckZvcm1hdCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0RFVEFJTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q29udGFpbmVyUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBhZ2VEZXRhaWxSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGFnZURldGFpbChjb250ZXh0LCAoUGFnZURldGFpbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0ZPT1RFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q29udGFpbmVyUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBhZ2VGb290ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGFnZUZvb3Rlcihjb250ZXh0LCAoUGFnZUZvb3Rlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX0hFQURFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q29udGFpbmVyUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBhZ2VIZWFkZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGFnZUhlYWRlcihjb250ZXh0LCAoUGFnZUhlYWRlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5QQUdFX1RFTVBMQVRFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRQYWdlVGVtcGxhdGVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGFnZVRlbXBsYXRlKGNvbnRleHQsIChQYWdlVGVtcGxhdGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUEFHRV9URU1QTEFURVM6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFBhZ2VUZW1wbGF0ZXNSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUGFnZVRlbXBsYXRlcyhjb250ZXh0LCAoUGFnZVRlbXBsYXRlcykgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJlcG9ydFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9SZXBvcnQoY29udGV4dCwgKFJlcG9ydCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfREVTSUdOX0ZJTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnREZXNpZ25GaWxlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JlcG9ydERlc2lnbkZpbGUoY29udGV4dCwgKFJlcG9ydERlc2lnbkZpbGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuUkVQT1JUX0RFU0lHTl9URU1QTEFURToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJlcG9ydERlc2lnblRlbXBsYXRlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JlcG9ydERlc2lnblRlbXBsYXRlKGNvbnRleHQsIChSZXBvcnREZXNpZ25UZW1wbGF0ZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfTU9ERUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJlcG9ydE1vZGVsUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JlcG9ydE1vZGVsKGNvbnRleHQsIChSZXBvcnRNb2RlbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5SRVBPUlRfUEFDS0FHRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0UGFja2FnZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9SZXBvcnRQYWNrYWdlKGNvbnRleHQsIChSZXBvcnRQYWNrYWdlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNPTUVfRk9STUFUUzoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdHNSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfU29tZUZvcm1hdHMoY29udGV4dCwgKFNvbWVGb3JtYXRzKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlNUWUxFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9TdHlsZShjb250ZXh0LCAoU3R5bGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1RZTEVTOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRTdHlsZXNSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfU3R5bGVzKGNvbnRleHQsIChTdHlsZXMpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1VCX1NVQl9USVRMRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RWxlbWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRTdWJTdWJUaXRsZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9TdWJTdWJUaXRsZShjb250ZXh0LCAoU3ViU3ViVGl0bGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuU1VCX1RJVExFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFN1YlRpdGxlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1N1YlRpdGxlKGNvbnRleHQsIChTdWJUaXRsZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9BR0dSRUdBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVBZ2dyZWdhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZUFnZ3JlZ2F0aW9uKGNvbnRleHQsIChUYWJsZUFnZ3JlZ2F0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0JJTkFSWV9BR0dSRUdBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCYXNlQWdncmVnYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKGNvbnRleHQsIChUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0NFTExfQ09MT1I6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlQ2VsbENvbG9yUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlQ2VsbENvbG9yKGNvbnRleHQsIChUYWJsZUNlbGxDb2xvcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9EQVRFX0RBWV9JTlRFUlZBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJbnRlcnZhbFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZURhdGVEYXlJbnRlcnZhbChjb250ZXh0LCAoVGFibGVEYXRlRGF5SW50ZXJ2YWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfREFURV9EQVlfTE9PS1VQOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVMb29rdXBSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfVGFibGVEYXRlRGF5TG9va3VwKGNvbnRleHQsIChUYWJsZURhdGVEYXlMb29rdXApIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfRk9STUFUVEVSOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUZvcm1hdHRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZUZvcm1hdHRlcihjb250ZXh0LCAoVGFibGVGb3JtYXR0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfSUNPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVJY29uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlUmFuZ2VFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlSWNvbihjb250ZXh0LCAoVGFibGVJY29uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX0lNQUdFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUltYWdlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlSW1hZ2UoY29udGV4dCwgKFRhYmxlSW1hZ2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfTVVMVElQTEVfQUdHUkVHQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZU11bHRpcGxlQWdncmVnYXRpb24oY29udGV4dCwgKFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9OVU1CRVJfSU5URVJWQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlSW50ZXJ2YWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZU51bWJlckludGVydmFsKGNvbnRleHQsIChUYWJsZU51bWJlckludGVydmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX05VTUJFUl9MT09LVVA6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlTG9va3VwUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlTnVtYmVyTG9va3VwKGNvbnRleHQsIChUYWJsZU51bWJlckxvb2t1cCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9QUk9QRVJUWToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVZhbHVlRWxlbWVudFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZVByb3BlcnR5KGNvbnRleHQsIChUYWJsZVByb3BlcnR5KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1BVUkVfQUdHUkVHQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlUHVyZUFnZ3JlZ2F0aW9uKGNvbnRleHQsIChUYWJsZVB1cmVBZ2dyZWdhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5UQUJMRV9TVFJJTkdfTE9PS1VQOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUxvb2t1cFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVN0cmluZ0xvb2t1cFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZVN0cmluZ0xvb2t1cChjb250ZXh0LCAoVGFibGVTdHJpbmdMb29rdXApIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVEVYVF9DT0xPUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVSYW5nZUVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfVGFibGVUZXh0Q29sb3IoY29udGV4dCwgKFRhYmxlVGV4dENvbG9yKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlRBQkxFX1RSRU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVJhbmdlRWxlbWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZVRyZW5kUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RhYmxlVHJlbmQoY29udGV4dCwgKFRhYmxlVHJlbmQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVEFCTEVfVU5BUllfQUdHUkVHQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9UYWJsZVVuYXJ5QWdncmVnYXRpb24oY29udGV4dCwgKFRhYmxlVW5hcnlBZ2dyZWdhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5URVhUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRFbGVtZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFRleHRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfVGV4dChjb250ZXh0LCAoVGV4dCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgUmVwb3J0RFNMUGFja2FnZS5USU1FX0ZPUk1BVDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0U29tZUZvcm1hdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1RpbWVGb3JtYXQoY29udGV4dCwgKFRpbWVGb3JtYXQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFJlcG9ydERTTFBhY2thZ2UuVElUTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0VGl0bGVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfVGl0bGUoY29udGV4dCwgKFRpdGxlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBSZXBvcnREU0xQYWNrYWdlLlVPTU9fRk9STUFUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRTb21lRm9ybWF0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfVW9tb0Zvcm1hdChjb250ZXh0LCAoVW9tb0Zvcm1hdCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IE9TQlBUeXBlc1BhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgT1NCUFR5cGVzUGFja2FnZS5MSU1QT1JUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSZXBvcnRJbXBvcnRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUmVwb3J0SW1wb3J0KGNvbnRleHQsIChMSW1wb3J0KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gVHlwZXNQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fRk9STUFMX1BBUkFNRVRFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9GdWxsSnZtRm9ybWFsUGFyYW1ldGVyKGNvbnRleHQsIChKdm1Gb3JtYWxQYXJhbWV0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1Gb3JtYWxQYXJhbWV0ZXIoY29udGV4dCwgKEp2bUZvcm1hbFBhcmFtZXRlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9HRU5FUklDX0FSUkFZX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVR5cGVSZWZlcmVuY2UoY29udGV4dCwgKEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fSU5ORVJfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtSW5uZXJUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0xPV0VSX0JPVU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtTG93ZXJCb3VuZEFuZGVkKGNvbnRleHQsIChKdm1Mb3dlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bUxvd2VyQm91bmQoY29udGV4dCwgKEp2bUxvd2VyQm91bmQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fUEFSQU1FVEVSSVpFRF9UWVBFX1JFRkVSRU5DRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtSW5uZXJUeXBlUmVmZXJlbmNlT3V0ZXJBY3Rpb25fMV80XzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9UWVBFX1BBUkFNRVRFUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1UeXBlUGFyYW1ldGVyKGNvbnRleHQsIChKdm1UeXBlUGFyYW1ldGVyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1VQUEVSX0JPVU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtVXBwZXJCb3VuZEFuZGVkKGNvbnRleHQsIChKdm1VcHBlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVVwcGVyQm91bmQoY29udGV4dCwgKEp2bVVwcGVyQm91bmQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fV0lMRENBUkRfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWVsc2UgaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBYQW5ub3RhdGlvbnNQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFhBbm5vdGF0aW9uc1BhY2thZ2UuWEFOTk9UQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb24oY29udGV4dCwgKFhBbm5vdGF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYQW5ub3RhdGlvbnNQYWNrYWdlLlhBTk5PVEFUSU9OX0VMRU1FTlRfVkFMVUVfUEFJUjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcihjb250ZXh0LCAoWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWGJhc2VQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQVNTSUdOTUVOVDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBc3NpZ25tZW50X1hNZW1iZXJGZWF0dXJlQ2FsbChjb250ZXh0LCAoWEFzc2lnbm1lbnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQkFTSUNfRk9SX0xPT1BfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uKGNvbnRleHQsIChYQmFzaWNGb3JMb29wRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCSU5BUllfT1BFUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFkZGl0aXZlRXhwcmVzc2lvbl9YQW5kRXhwcmVzc2lvbl9YQXNzaWdubWVudF9YRXF1YWxpdHlFeHByZXNzaW9uX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fWE9yRXhwcmVzc2lvbl9YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fWFJlbGF0aW9uYWxFeHByZXNzaW9uKGNvbnRleHQsIChYQmluYXJ5T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJMT0NLX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hCbG9ja0V4cHJlc3Npb24oY29udGV4dCwgKFhCbG9ja0V4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hFeHByZXNzaW9uSW5DbG9zdXJlKGNvbnRleHQsIChYQmxvY2tFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJPT0xFQU5fTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQm9vbGVhbkxpdGVyYWwoY29udGV4dCwgKFhCb29sZWFuTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVNFX1BBUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2FzZVBhcnQoY29udGV4dCwgKFhDYXNlUGFydCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVNURURfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDYXN0ZWRFeHByZXNzaW9uKGNvbnRleHQsIChYQ2FzdGVkRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDQVRDSF9DTEFVU0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2F0Y2hDbGF1c2UoY29udGV4dCwgKFhDYXRjaENsYXVzZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDTE9TVVJFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENsb3N1cmUoY29udGV4dCwgKFhDbG9zdXJlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTaG9ydENsb3N1cmUoY29udGV4dCwgKFhDbG9zdXJlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWENPTlNUUlVDVE9SX0NBTEw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDb25zdHJ1Y3RvckNhbGwoY29udGV4dCwgKFhDb25zdHJ1Y3RvckNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRE9fV0hJTEVfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRG9XaGlsZUV4cHJlc3Npb24oY29udGV4dCwgKFhEb1doaWxlRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhGRUFUVVJFX0NBTEw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZlYXR1cmVDYWxsKGNvbnRleHQsIChYRmVhdHVyZUNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRk9SX0xPT1BfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRm9yTG9vcEV4cHJlc3Npb24oY29udGV4dCwgKFhGb3JMb29wRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhJRl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSWZFeHByZXNzaW9uKGNvbnRleHQsIChYSWZFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWElOU1RBTkNFX09GX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YUmVsYXRpb25hbEV4cHJlc3Npb24oY29udGV4dCwgKFhJbnN0YW5jZU9mRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhMSVNUX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9YTGlzdExpdGVyYWwoY29udGV4dCwgKFhMaXN0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEFubm90YXRpb25FbGVtZW50VmFsdWVfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YTGlzdExpdGVyYWwoY29udGV4dCwgKFhMaXN0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhNRU1CRVJfRkVBVFVSRV9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWE1lbWJlckZlYXR1cmVDYWxsKGNvbnRleHQsIChYTWVtYmVyRmVhdHVyZUNhbGwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTlVMTF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hOdWxsTGl0ZXJhbChjb250ZXh0LCAoWE51bGxMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWE5VTUJFUl9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWE51bWJlckxpdGVyYWwoY29udGV4dCwgKFhOdW1iZXJMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFBPU1RGSVhfT1BFUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFBvc3RmaXhPcGVyYXRpb24oY29udGV4dCwgKFhQb3N0Zml4T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFJFVFVSTl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFJldHVybkV4cHJlc3Npb24oY29udGV4dCwgKFhSZXR1cm5FeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFNFVF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTZXRMaXRlcmFsKGNvbnRleHQsIChYU2V0TGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTVFJJTkdfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTdHJpbmdMaXRlcmFsKGNvbnRleHQsIChYU3RyaW5nTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTV0lUQ0hfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTd2l0Y2hFeHByZXNzaW9uKGNvbnRleHQsIChYU3dpdGNoRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTWU5DSFJPTklaRURfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uKGNvbnRleHQsIChYU3luY2hyb25pemVkRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhUSFJPV19FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVGhyb3dFeHByZXNzaW9uKGNvbnRleHQsIChYVGhyb3dFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFRSWV9DQVRDSF9GSU5BTExZX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbihjb250ZXh0LCAoWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YVFlQRV9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hUeXBlTGl0ZXJhbChjb250ZXh0LCAoWFR5cGVMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFVOQVJZX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hVbmFyeU9wZXJhdGlvbihjb250ZXh0LCAoWFVuYXJ5T3BlcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFZBUklBQkxFX0RFQ0xBUkFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFZhcmlhYmxlRGVjbGFyYXRpb24oY29udGV4dCwgKFhWYXJpYWJsZURlY2xhcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFdISUxFX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hXaGlsZUV4cHJlc3Npb24oY29udGV4dCwgKFhXaGlsZUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWVsc2UgaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBYdHlwZVBhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhGVU5DVElPTl9UWVBFX1JFRjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRnVuY3Rpb25UeXBlUmVmKGNvbnRleHQsIChYRnVuY3Rpb25UeXBlUmVmKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYdHlwZVBhY2thZ2UuWElNUE9SVF9ERUNMQVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hJbXBvcnREZWNsYXJhdGlvbihjb250ZXh0LCAoWEltcG9ydERlY2xhcmF0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYdHlwZVBhY2thZ2UuWElNUE9SVF9TRUNUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSW1wb3J0U2VjdGlvbihjb250ZXh0LCAoWEltcG9ydFNlY3Rpb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQl9CisJCWlmIChlcnJvckFjY2VwdG9yICE9IG51bGwpIGVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVJbnZhbGlkQ29udGV4dE9yVHlwZURpYWdub3N0aWMoc2VtYW50aWNPYmplY3QsIGNvbnRleHQpKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHR5cGU9QXV0b1RleHRFbnVtIHN0eWxlPVtTdHlsZXxJRF0/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0F1dG9UZXh0KEVPYmplY3QgY29udGV4dCwgQXV0b1RleHQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICh0eXBlPUJvcmRlclR5cGVFbnVtIHdpZHRodmFsdWU9VW5zaWduZWROdW1iZXIgd2lkdGh1bml0PVVuaXRFbnVtIGNvbG9yPVtDb2xvcnxJRF0pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQm9yZGVyU3R5bGUoRU9iamVjdCBjb250ZXh0LCBCb3JkZXJTdHlsZSBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkJPUkRFUl9TVFlMRV9fVFlQRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkJPUkRFUl9TVFlMRV9fVFlQRSkpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQk9SREVSX1NUWUxFX19XSURUSFZBTFVFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQk9SREVSX1NUWUxFX19XSURUSFZBTFVFKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5CT1JERVJfU1RZTEVfX1dJRFRIVU5JVCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkJPUkRFUl9TVFlMRV9fV0lEVEhVTklUKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5CT1JERVJfU1RZTEVfX0NPTE9SKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQk9SREVSX1NUWUxFX19DT0xPUikpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRUeXBlQm9yZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCksIHNlbWFudGljT2JqZWN0LmdldFR5cGUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRCb3JkZXJTdHlsZUFjY2VzcygpLmdldFdpZHRodmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRXaWR0aHZhbHVlKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRXaWR0aHVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0V2lkdGh1bml0KCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Qm9yZGVyU3R5bGVBY2Nlc3MoKS5nZXRDb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldENvbG9yKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGN1c3RvbT1CdWlsZEluRm9udEZhbWlseUVudW0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9CdWlsZEluRm9udEZhbWlseShFT2JqZWN0IGNvbnRleHQsIEJ1aWxkSW5Gb250RmFtaWx5IHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQlVJTERfSU5fRk9OVF9GQU1JTFlfX0NVU1RPTSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkJVSUxEX0lOX0ZPTlRfRkFNSUxZX19DVVNUT00pKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldEJ1aWxkSW5Gb250RmFtaWx5QWNjZXNzKCkuZ2V0Q3VzdG9tQnVpbGRJbkZvbnRGYW1pbHlFbnVtRW51bVJ1bGVDYWxsXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0Q3VzdG9tKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9SUQgCisJICogICAgICAgICAoCisJICogICAgICAgICAgICAgY29sb3I9U1RSSU5HIHwgCisJICogICAgICAgICAgICAgKGJhc2Vjb2xvcj1bQ29sb3J8SURdIGRhcmtlbnNieT1JTlQpIHwgCisJICogICAgICAgICAgICAgKGJhc2Vjb2xvcj1bQ29sb3J8SURdIGxpZ2h0ZW5zYnk9SU5UKSB8IAorCSAqICAgICAgICAgICAgIChiYXNlY29sb3I9W0NvbG9yfElEXSB0cmFuc2Zvcm1zYnk9SU5UIHRhcmdldGNvbG9yPVtDb2xvcnxJRF0pCisJICogICAgICAgICApCisJICogICAgICkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Db2xvcihFT2JqZWN0IGNvbnRleHQsIENvbG9yIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoY29sb3JzKz1Db2xvciopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ29sb3JzKEVPYmplY3QgY29udGV4dCwgQ29sb3JzIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAobmFtZT1JRCB1aV9wYXR0ZXJuPVNUUklORyByZXBvcnRfY2F0ZWdvcnk9Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0N1cnJlbmN5Rm9ybWF0KEVPYmplY3QgY29udGV4dCwgQ3VycmVuY3lGb3JtYXQgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfQkFTRV9fTkFNRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19VSV9QQVRURVJOKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19URVhUQUxJR04pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5DVVJSRU5DWV9GT1JNQVRfX1JFUE9SVF9DQVRFR09SWSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNVUlJFTkNZX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCksIHNlbWFudGljT2JqZWN0LmdldE5hbWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRDdXJyZW5jeUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRVaV9wYXR0ZXJuKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0UmVwb3J0X2NhdGVnb3J5KCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wKCksIHNlbWFudGljT2JqZWN0LmdldFJlcG9ydF9wYXR0ZXJuKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRUZXh0YWxpZ24oKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgY3VzdG9tPVNUUklORworCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0N1c3RvbUZvbnRGYW1pbHkoRU9iamVjdCBjb250ZXh0LCBDdXN0b21Gb250RmFtaWx5IHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0ZPTlRfRkFNSUxZX19DVVNUT00pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5DVVNUT01fRk9OVF9GQU1JTFlfX0NVU1RPTSkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q3VzdG9tRm9udEZhbWlseUFjY2VzcygpLmdldEN1c3RvbVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRDdXN0b20oKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHN0eWxlPVtTdHlsZXxJRF0/IGNvbHVtbkZvcm1hdHRlcnMrPURhdGFtYXJ0VGFibGVQcm9wZXJ0eSopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfRGF0YW1hcnRUYWJsZURldGFpbChFT2JqZWN0IGNvbnRleHQsIERhdGFtYXJ0VGFibGVEZXRhaWwgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChzdHlsZT1bU3R5bGV8SURdPyByb3dzKz1HcmlkUm93KikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRhbWFydFRhYmxlR3JvdXBGb290ZXIoRU9iamVjdCBjb250ZXh0LCBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChzdHlsZT1bU3R5bGV8SURdPyByb3dzKz1HcmlkUm93KikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIoRU9iamVjdCBjb250ZXh0LCBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9SUQgCisJICogICAgICAgICBncm91cGluZ1JlZj1bRGF0YW1hcnRQcm9wZXJ0eXxJRF0gCisJICogICAgICAgICBoZWFkZXI9RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyPyAKKwkgKiAgICAgICAgIChkZXRhaWxoZWFkZXI/PSdkZXRhaWxoZWFkZXInIGhlYWRlcnN0eWxlPVtTdHlsZXxJRF0/KT8gCisJICogICAgICAgICAoZGV0YWlsZm9vdGVyPz0nZGV0YWlsZm9vdGVyJyBmb290ZXJzdHlsZT1bU3R5bGV8SURdPyk/IAorCSAqICAgICAgICAgZm9vdGVyPURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcj8KKwkgKiAgICAgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0RhdGFtYXJ0VGFibGVHcm91cChFT2JqZWN0IGNvbnRleHQsIERhdGFtYXJ0VGFibGVHcm91cCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgY29sdW1uPVRhYmxlVmFsdWVFbGVtZW50IAorCSAqICAgICAgICAgc3R5bGU9W1N0eWxlfElEXT8gCisJICogICAgICAgICAoaGFzSW1hZ2U/PSdpbWFnZScgaW1hZ2U9VGFibGVJbWFnZSk/IAorCSAqICAgICAgICAgKGhpZGVMYWJlbEludGVydmFsPz0naGlkZWxhYmVsJz8gaW50ZXJ2YWxzKz1UYWJsZUludGVydmFsKik/IAorCSAqICAgICAgICAgKGhpZGVMYWJlbExvb2t1cD89J2hpZGVsYWJlbCc/IGxvb2t1cHMrPVRhYmxlTG9va3VwKik/CisJICogICAgICkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRhbWFydFRhYmxlUHJvcGVydHkoRU9iamVjdCBjb250ZXh0LCBEYXRhbWFydFRhYmxlUHJvcGVydHkgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIHN0eWxlPVtTdHlsZXxJRF0/IAorCSAqICAgICAgICAgKGRldGFpbGhlYWRlcj89J2RldGFpbGhlYWRlcicgaGVhZGVyc3R5bGU9W1N0eWxlfElEXT8pPyAKKwkgKiAgICAgICAgIChkZXRhaWxmb290ZXI/PSdkZXRhaWxmb290ZXInIGZvb3RlcnN0eWxlPVtTdHlsZXxJRF0/KT8gCisJICogICAgICAgICBncm91cHMrPURhdGFtYXJ0VGFibGVHcm91cCogCisJICogICAgICAgICBkZXRhaWw9RGF0YW1hcnRUYWJsZURldGFpbAorCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfRGF0YW1hcnRUYWJsZShFT2JqZWN0IGNvbnRleHQsIERhdGFtYXJ0VGFibGUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChuYW1lPUlEIHVpX3BhdHRlcm49U1RSSU5HIHJlcG9ydF9jYXRlZ29yeT1EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRlRm9ybWF0KEVPYmplY3QgY29udGV4dCwgRGF0ZUZvcm1hdCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUX0JBU0VfX05BTUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19VSV9QQVRURVJOKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1RFWFRBTElHTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19URVhUQUxJR04pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLkRBVEVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5EQVRFX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0TmFtZSgpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0VWlfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZXBvcnRfY2F0ZWdvcnkoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZXBvcnRfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRUZXh0YWxpZ24oKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9SUQgdWlfcGF0dGVybj1TVFJJTkcgcmVwb3J0X2NhdGVnb3J5PURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9EYXRlVGltZUZvcm1hdChFT2JqZWN0IGNvbnRleHQsIERhdGVUaW1lRm9ybWF0IHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUX0JBU0VfX05BTUUpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfQkFTRV9fTkFNRSkpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTikpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1JFUE9SVF9QQVRURVJOKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1RFWFRBTElHTikpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFURV9USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuREFURV9USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCksIHNlbWFudGljT2JqZWN0LmdldE5hbWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXREYXRlVGltZUZvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRVaV9wYXR0ZXJuKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0UmVwb3J0X2NhdGVnb3J5KCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wKCksIHNlbWFudGljT2JqZWN0LmdldFJlcG9ydF9wYXR0ZXJuKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRUZXh0YWxpZ24oKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgbmFtZT1JRCAKKwkgKiAgICAgICAgIGV4dGVuZHM9W0ZvbnR8SURdPyAKKwkgKiAgICAgICAgIGZhbWlseT1Gb250RmFtaWx5PyAKKwkgKiAgICAgICAgIHN0eWxlPUZvbnRTdHlsZUVudW0/IAorCSAqICAgICAgICAgYm9sZD89J2JvbGQnPyAKKwkgKiAgICAgICAgIChzaXpldmFsdWU9VW5zaWduZWROdW1iZXIgc2l6ZXVuaXQ9VW5pdEVudW0pPworCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfRm9udChFT2JqZWN0IGNvbnRleHQsIEZvbnQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChmb250cys9Rm9udCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfRm9udHMoRU9iamVjdCBjb250ZXh0LCBGb250cyBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9SUQ/IGNvbHVtbnNwYW49SU5UPyBlbGVtZW50cys9RWxlbWVudCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfR3JpZENlbGwoRU9iamVjdCBjb250ZXh0LCBHcmlkQ2VsbCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9SUQ/IHN0eWxlPVtTdHlsZXxJRF0/IGNlbGxzKz1HcmlkQ2VsbCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfR3JpZFJvdyhFT2JqZWN0IGNvbnRleHQsIEdyaWRSb3cgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChuYW1lPUlEPyByb3dzKz1HcmlkUm93KikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9HcmlkKEVPYmplY3QgY29udGV4dCwgR3JpZCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHNpemU9SW1hZ2VTaXplRW51bSBzY2FsZT1VbnNpZ25lZE51bWJlcj8gc291cmNlVHlwZT1JbWFnZVNvdXJjZUVudW0gZmlsZW5hbWU9U1RSSU5HKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0ltYWdlKEVPYmplY3QgY29udGV4dCwgSW1hZ2Ugc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICh0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyBzdHlsZT1bU3R5bGV8SURdPykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9MYWJlbChFT2JqZWN0IGNvbnRleHQsIExhYmVsIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoCisJICogICAgICAgICBtZWRpYT1bTWVkaWF8SURdIAorCSAqICAgICAgICAgZm9ybWF0PVtTb21lRm9ybWF0fElEXT8gCisJICogICAgICAgICBmb250PVtGb250fElEXT8gCisJICogICAgICAgICAoYmFja2dyb3VuZGNvbG9yPVtDb2xvcnxJRF0gYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3J8SURdPyk/IAorCSAqICAgICAgICAgdGV4dGNvbG9yPVtDb2xvcnxJRF0/IAorCSAqICAgICAgICAgdGV4dGFsaWduPVRleHRBbGlnbkVudW0/IAorCSAqICAgICAgICAgYm9yZGVyVG9wPUJvcmRlclN0eWxlPyAKKwkgKiAgICAgICAgIGJvcmRlckJvdHRvbT1Cb3JkZXJTdHlsZT8gCisJICogICAgICAgICBib3JkZXJMZWZ0PUJvcmRlclN0eWxlPyAKKwkgKiAgICAgICAgIGJvcmRlclJpZ2h0PUJvcmRlclN0eWxlPyAKKwkgKiAgICAgICAgIChwYWRkaW5nVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPyAKKwkgKiAgICAgICAgIChwYWRkaW5nQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0JvdHRvbVVuaXQ9VW5pdEVudW0pPyAKKwkgKiAgICAgICAgIChwYWRkaW5nTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdMZWZ0VW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKHBhZGRpbmdSaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdSaWdodFVuaXQ9VW5pdEVudW0pPyAKKwkgKiAgICAgICAgIChtYXJnaW5Ub3BWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Ub3BVbml0PVVuaXRFbnVtKT8gCisJICogICAgICAgICAobWFyZ2luQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luQm90dG9tVW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5MZWZ0VW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKG1hcmdpblJpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtKT8KKwkgKiAgICAgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX01lZGlhU3R5bGUoRU9iamVjdCBjb250ZXh0LCBNZWRpYVN0eWxlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICBuYW1lPUlECisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfTWVkaWEoRU9iamVjdCBjb250ZXh0LCBNZWRpYSBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUX0JBU0VfX05BTUUpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldE1lZGlhQWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0TmFtZSgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAobWVkaWFzKz1NZWRpYSopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfTWVkaWFzKEVPYmplY3QgY29udGV4dCwgTWVkaWFzIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAobmFtZT1JRCB1aV9wYXR0ZXJuPVNUUklORyByZXBvcnRfY2F0ZWdvcnk9TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9OdW1iZXJGb3JtYXQoRU9iamVjdCBjb250ZXh0LCBOdW1iZXJGb3JtYXQgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5SRVBPUlRfQkFTRV9fTkFNRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVUlfUEFUVEVSTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19VSV9QQVRURVJOKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fUkVQT1JUX1BBVFRFUk4pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19URVhUQUxJR04pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5TT01FX0ZPUk1BVF9fVEVYVEFMSUdOKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5OVU1CRVJfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5OVU1CRVJfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCksIHNlbWFudGljT2JqZWN0LmdldE5hbWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0VWlfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9jYXRlZ29yeU51bWJlckZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0UmVwb3J0X2NhdGVnb3J5KCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZXBvcnRfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCksIHNlbWFudGljT2JqZWN0LmdldFRleHRhbGlnbigpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZWxlbWVudHMrPUVsZW1lbnQqKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BhZ2VEZXRhaWwoRU9iamVjdCBjb250ZXh0LCBQYWdlRGV0YWlsIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoc2hvd09uTGFzdD89J3Nob3dPbkxhc3QnPyBoZWlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBoZWlnaHRVbml0PVVuaXRFbnVtIGVsZW1lbnRzKz1FbGVtZW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1BhZ2VGb290ZXIoRU9iamVjdCBjb250ZXh0LCBQYWdlRm9vdGVyIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoc2hvd09uRmlyc3Q/PSdzaG93T25GaXJzdCc/IGhlaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIGhlaWdodFVuaXQ9VW5pdEVudW0gZWxlbWVudHMrPUVsZW1lbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGFnZUhlYWRlcihFT2JqZWN0IGNvbnRleHQsIFBhZ2VIZWFkZXIgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9SUQgCisJICogICAgICAgICBzaXplPVBhZ2VTaXplRW51bSAKKwkgKiAgICAgICAgIG9yaWVudGF0aW9uPU9yaWVudGF0aW9uRW51bSAKKwkgKiAgICAgICAgIHRvcE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIAorCSAqICAgICAgICAgdG9wTWFyZ2luVW5pdD1Vbml0RW51bSAKKwkgKiAgICAgICAgIGxlZnRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciAKKwkgKiAgICAgICAgIGxlZnRNYXJnaW5Vbml0PVVuaXRFbnVtIAorCSAqICAgICAgICAgYm90dG9tTWFyZ2luVmFsdWU9VW5zaWduZWROdW1iZXIgCisJICogICAgICAgICBib3R0b21NYXJnaW5Vbml0PVVuaXRFbnVtIAorCSAqICAgICAgICAgcmlnaHRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciAKKwkgKiAgICAgICAgIHJpZ2h0TWFyZ2luVW5pdD1Vbml0RW51bSAKKwkgKiAgICAgICAgIGhlYWRlcj1QYWdlSGVhZGVyPyAKKwkgKiAgICAgICAgIGZvb3Rlcj1QYWdlRm9vdGVyPworCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUGFnZVRlbXBsYXRlKEVPYmplY3QgY29udGV4dCwgUGFnZVRlbXBsYXRlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAocGFnZXRlbXBsYXRlcys9UGFnZVRlbXBsYXRlKikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9QYWdlVGVtcGxhdGVzKEVPYmplY3QgY29udGV4dCwgUGFnZVRlbXBsYXRlcyBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgbmFtZT1TVFJJTkcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9SZXBvcnREZXNpZ25GaWxlKEVPYmplY3QgY29udGV4dCwgUmVwb3J0RGVzaWduRmlsZSBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9ERVNJR05fRklMRV9fTkFNRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9ERVNJR05fRklMRV9fTkFNRSkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVwb3J0RGVzaWduRmlsZUFjY2VzcygpLmdldE5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXROYW1lKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChkZXNjcmlwdGlvbj1TVFJJTkc/IGhlYWRlcj1QYWdlSGVhZGVyPyBkZXRhaWw9UGFnZURldGFpbCBmb290ZXI9UGFnZUZvb3Rlcj8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUmVwb3J0RGVzaWduVGVtcGxhdGUoRU9iamVjdCBjb250ZXh0LCBSZXBvcnREZXNpZ25UZW1wbGF0ZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgaW1wb3J0ZWROYW1lc3BhY2U9UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1JlcG9ydEltcG9ydChFT2JqZWN0IGNvbnRleHQsIExJbXBvcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFJlcG9ydEltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRJbXBvcnRlZE5hbWVzcGFjZSgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICBwY2tnKz1SZXBvcnRQYWNrYWdlKgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1JlcG9ydE1vZGVsKEVPYmplY3QgY29udGV4dCwgUmVwb3J0TW9kZWwgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9UXVhbGlmaWVkTmFtZSAKKwkgKiAgICAgICAgIGltcG9ydHMrPVJlcG9ydEltcG9ydCogCisJICogICAgICAgICAoCisJICogICAgICAgICAgICAgKGV4dGVybmFsQ3NzVVJJPVNUUklORyBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkc/KT8gCisJICogICAgICAgICAgICAgcGFnZXRlbXBsYXRlcz1QYWdlVGVtcGxhdGVzIAorCSAqICAgICAgICAgICAgIGZvcm1hdHRlcnM9U29tZUZvcm1hdHMgCisJICogICAgICAgICAgICAgY29sb3JzPUNvbG9ycyAKKwkgKiAgICAgICAgICAgICBmb250cz1Gb250cyAKKwkgKiAgICAgICAgICAgICBtZWRpYXM9TWVkaWFzIAorCSAqICAgICAgICAgICAgIHN0eWxlcz1TdHlsZXMKKwkgKiAgICAgICAgICk/IAorCSAqICAgICAgICAgcmVwb3J0cys9UmVwb3J0KgorCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUmVwb3J0UGFja2FnZShFT2JqZWN0IGNvbnRleHQsIFJlcG9ydFBhY2thZ2Ugc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9SUQgCisJICogICAgICAgICAoZGVzY3JpcHRpb24/PSdkZXNjcmliZWQgYnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gCisJICogICAgICAgICB0b29sYmFyPVtBY3Rpb25Ub29sYmFyfElEXT8gCisJICogICAgICAgICBkYXRhbWFydFJlZj1bRGF0YW1hcnREZWZpbml0aW9ufElEXSAKKwkgKiAgICAgICAgIHJlbmRlcmluZz1SZW5kZXJpbmdFbnVtIAorCSAqICAgICAgICAgKGV4dGVybmFsQ3NzVVJJPVNUUklORyBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkc/KT8gCisJICogICAgICAgICBwYWdlVGVtcGxhdGU9W1BhZ2VUZW1wbGF0ZXxJRF0gCisJICogICAgICAgICBtZWRpYT1bTWVkaWF8SURdIAorCSAqICAgICAgICAgZGVzaWduPVJlcG9ydERlc2lnbgorCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUmVwb3J0KEVPYmplY3QgY29udGV4dCwgUmVwb3J0IHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZm9ybWF0dGVycys9U29tZUZvcm1hdCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfU29tZUZvcm1hdHMoRU9iamVjdCBjb250ZXh0LCBTb21lRm9ybWF0cyBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgbmFtZT1JRCAKKwkgKiAgICAgICAgIGV4dGVuZHM9W1N0eWxlfElEXT8gCisJICogICAgICAgICBmb3JtYXQ9W1NvbWVGb3JtYXR8SURdPyAKKwkgKiAgICAgICAgIGZvbnQ9W0ZvbnR8SURdPyAKKwkgKiAgICAgICAgIChiYWNrZ3JvdW5kY29sb3I9W0NvbG9yfElEXSBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcnxJRF0/KT8gCisJICogICAgICAgICB0ZXh0Y29sb3I9W0NvbG9yfElEXT8gCisJICogICAgICAgICB0ZXh0YWxpZ249VGV4dEFsaWduRW51bT8gCisJICogICAgICAgICBib3JkZXJUb3A9Qm9yZGVyU3R5bGU/IAorCSAqICAgICAgICAgYm9yZGVyQm90dG9tPUJvcmRlclN0eWxlPyAKKwkgKiAgICAgICAgIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGU/IAorCSAqICAgICAgICAgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGU/IAorCSAqICAgICAgICAgKHBhZGRpbmdUb3BWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nVG9wVW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKHBhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nQm90dG9tVW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKHBhZGRpbmdMZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0xlZnRVbml0PVVuaXRFbnVtKT8gCisJICogICAgICAgICAocGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bSk/IAorCSAqICAgICAgICAgKG1hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblRvcFVuaXQ9VW5pdEVudW0pPyAKKwkgKiAgICAgICAgIChtYXJnaW5Cb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Cb3R0b21Vbml0PVVuaXRFbnVtKT8gCisJICogICAgICAgICAobWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gCisJICogICAgICAgICAobWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPyAKKwkgKiAgICAgICAgIG1lZGlhc3R5bGVzKz1NZWRpYVN0eWxlKgorCSAqICAgICApCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfU3R5bGUoRU9iamVjdCBjb250ZXh0LCBTdHlsZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHN0eWxlcys9U3R5bGUqKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1N0eWxlcyhFT2JqZWN0IGNvbnRleHQsIFN0eWxlcyBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HIHN0eWxlPVtTdHlsZXxJRF0/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1N1YlN1YlRpdGxlKEVPYmplY3QgY29udGV4dCwgU3ViU3ViVGl0bGUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICh0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyBzdHlsZT1bU3R5bGV8SURdPykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9TdWJUaXRsZShFT2JqZWN0IGNvbnRleHQsIFN1YlRpdGxlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoYWdncmVnYXRpb249VGFibGVCYXNlQWdncmVnYXRpb24gb25Hcm91cD1bRGF0YW1hcnRUYWJsZUdyb3VwfElEXT8gdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkc/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlQWdncmVnYXRpb24oRU9iamVjdCBjb250ZXh0LCBUYWJsZUFnZ3JlZ2F0aW9uIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoYWdncmVnYXRpb249QmluYXJ5QWdncmVnYXRpb25UeXBlRW51bSB2YWx1ZVJlZnMrPVtEYXRhbWFydFByb3BlcnR5fElEXSB2YWx1ZVJlZnMrPVtEYXRhbWFydFByb3BlcnR5fElEXSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKEVPYmplY3QgY29udGV4dCwgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbiBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgY29sb3I9W0NvbG9yfElEXQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlQ2VsbENvbG9yKEVPYmplY3QgY29udGV4dCwgVGFibGVDZWxsQ29sb3Igc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9DRUxMX0NPTE9SX19DT0xPUikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0NFTExfQ09MT1JfX0NPTE9SKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUNlbGxDb2xvckFjY2VzcygpLmdldENvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSwgc2VtYW50aWNPYmplY3QuZ2V0Q29sb3IoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGRhdGVJbnRlcnZhbFZhbHVlPVNpZ25lZE51bWJlciBkYXRlUmFuZ2U9VGFibGVSYW5nZUVsZW1lbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfVGFibGVEYXRlRGF5SW50ZXJ2YWwoRU9iamVjdCBjb250ZXh0LCBUYWJsZURhdGVEYXlJbnRlcnZhbCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX0lOVEVSVkFMX1ZBTFVFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfSU5URVJWQUxfVkFMVUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0RBVEVfREFZX0lOVEVSVkFMX19EQVRFX1JBTkdFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfREFURV9EQVlfSU5URVJWQUxfX0RBVEVfUkFOR0UpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUludGVydmFsQWNjZXNzKCkuZ2V0RGF0ZUludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0RGF0ZUludGVydmFsVmFsdWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlJbnRlcnZhbEFjY2VzcygpLmdldERhdGVSYW5nZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCksIHNlbWFudGljT2JqZWN0LmdldERhdGVSYW5nZSgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAobG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlRGF0ZURheUxvb2t1cChFT2JqZWN0IGNvbnRleHQsIFRhYmxlRGF0ZURheUxvb2t1cCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0RBVEVfREFZX0xPT0tVUF9fTE9PS1VQX1ZBTFVFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfREFURV9EQVlfTE9PS1VQX19MT09LVVBfVkFMVUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0RBVEVfREFZX0xPT0tVUF9fRElTQ1JFVEUpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9EQVRFX0RBWV9MT09LVVBfX0RJU0NSRVRFKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXRMb29rdXBWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRMb29rdXBWYWx1ZSgpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRhYmxlRGF0ZURheUxvb2t1cEFjY2VzcygpLmdldERpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0RGlzY3JldGUoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgZm9ybWF0PVNUUklORworCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlRm9ybWF0dGVyKEVPYmplY3QgY29udGV4dCwgVGFibGVGb3JtYXR0ZXIgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9GT1JNQVRURVJfX0ZPUk1BVCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0ZPUk1BVFRFUl9fRk9STUFUKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUZvcm1hdHRlckFjY2VzcygpLmdldEZvcm1hdFNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wKCksIHNlbWFudGljT2JqZWN0LmdldEZvcm1hdCgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICBpY29uPVNUUklORworCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlSWNvbihFT2JqZWN0IGNvbnRleHQsIFRhYmxlSWNvbiBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX0lDT05fX0lDT04pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9JQ09OX19JQ09OKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZUljb25BY2Nlc3MoKS5nZXRJY29uU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0SWNvbigpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoaW1hZ2VQYXRoUGF0dGVybj1TVFJJTkcgaGFzUGFyYW1ldGVyPz0nZHluYW1pYyc/IGhpZGVJbWFnZUxhYmVsPz0naGlkZWxhYmVsJz8gKHJlc2l6ZT89J3Jlc2l6ZScgcmVzaXplU3RyaW5nPVNUUklORyk/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlSW1hZ2UoRU9iamVjdCBjb250ZXh0LCBUYWJsZUltYWdlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoYWdncmVnYXRpb249TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIHZhbHVlUmVmcys9W0RhdGFtYXJ0UHJvcGVydHl8SURdKikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9UYWJsZU11bHRpcGxlQWdncmVnYXRpb24oRU9iamVjdCBjb250ZXh0LCBUYWJsZU11bHRpcGxlQWdncmVnYXRpb24gc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChudW1iZXJJbnRlcnZhbFZhbHVlPVNpZ25lZE51bWJlciBudW1iZXJSYW5nZT1UYWJsZVJhbmdlRWxlbWVudCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9UYWJsZU51bWJlckludGVydmFsKEVPYmplY3QgY29udGV4dCwgVGFibGVOdW1iZXJJbnRlcnZhbCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX0lOVEVSVkFMX1ZBTFVFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJJbnRlcnZhbFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCksIHNlbWFudGljT2JqZWN0LmdldE51bWJlckludGVydmFsVmFsdWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0TnVtYmVyUmFuZ2VUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCgpLCBzZW1hbnRpY09iamVjdC5nZXROdW1iZXJSYW5nZSgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAobG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlTnVtYmVyTG9va3VwKEVPYmplY3QgY29udGV4dCwgVGFibGVOdW1iZXJMb29rdXAgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9OVU1CRVJfTE9PS1VQX19MT09LVVBfVkFMVUUpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9OVU1CRVJfTE9PS1VQX19MT09LVVBfVkFMVUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX05VTUJFUl9MT09LVVBfX0RJU0NSRVRFKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfTlVNQkVSX0xPT0tVUF9fRElTQ1JFVEUpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRhYmxlTnVtYmVyTG9va3VwQWNjZXNzKCkuZ2V0TG9va3VwVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0TG9va3VwVmFsdWUoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldERpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0RGlzY3JldGUoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgdmFsdWVSZWY9W0RhdGFtYXJ0UHJvcGVydHl8SURdCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfVGFibGVQcm9wZXJ0eShFT2JqZWN0IGNvbnRleHQsIFRhYmxlUHJvcGVydHkgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9QUk9QRVJUWV9fVkFMVUVfUkVGKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfUFJPUEVSVFlfX1ZBTFVFX1JFRikpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFZhbHVlUmVmRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpLCBzZW1hbnRpY09iamVjdC5nZXRWYWx1ZVJlZigpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICBhZ2dyZWdhdGlvbj1QdXJlQWdncmVnYXRpb25UeXBlRW51bQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlUHVyZUFnZ3JlZ2F0aW9uKEVPYmplY3QgY29udGV4dCwgVGFibGVQdXJlQWdncmVnYXRpb24gc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChsb29rdXBWYWx1ZT1TVFJJTkcgZGlzY3JldGU9VGFibGVSYW5nZUVsZW1lbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfVGFibGVTdHJpbmdMb29rdXAoRU9iamVjdCBjb250ZXh0LCBUYWJsZVN0cmluZ0xvb2t1cCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX1NUUklOR19MT09LVVBfX0xPT0tVUF9WQUxVRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRBQkxFX1NUUklOR19MT09LVVBfX0xPT0tVUF9WQUxVRSkpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfU1RSSU5HX0xPT0tVUF9fRElTQ1JFVEUpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9TVFJJTkdfTE9PS1VQX19ESVNDUkVURSkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXRMb29rdXBWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wKCksIHNlbWFudGljT2JqZWN0LmdldExvb2t1cFZhbHVlKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVTdHJpbmdMb29rdXBBY2Nlc3MoKS5nZXREaXNjcmV0ZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCksIHNlbWFudGljT2JqZWN0LmdldERpc2NyZXRlKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGNvbG9yPVtDb2xvcnxJRF0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9UYWJsZVRleHRDb2xvcihFT2JqZWN0IGNvbnRleHQsIFRhYmxlVGV4dENvbG9yIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfVEVYVF9DT0xPUl9fQ09MT1IpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9URVhUX0NPTE9SX19DT0xPUikpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUZXh0Q29sb3JBY2Nlc3MoKS5nZXRDb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldENvbG9yKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGljb249VHJlbmRJY29uRW51bQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RhYmxlVHJlbmQoRU9iamVjdCBjb250ZXh0LCBUYWJsZVRyZW5kIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuVEFCTEVfVFJFTkRfX0lDT04pID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5UQUJMRV9UUkVORF9fSUNPTikpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VGFibGVUcmVuZEFjY2VzcygpLmdldEljb25UcmVuZEljb25FbnVtRW51bVJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRJY29uKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChhZ2dyZWdhdGlvbj1VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gdmFsdWVSZWZzKz1bRGF0YW1hcnRQcm9wZXJ0eXxJRF0pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfVGFibGVVbmFyeUFnZ3JlZ2F0aW9uKEVPYmplY3QgY29udGV4dCwgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAodGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgc3R5bGU9W1N0eWxlfElEXT8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfVGV4dChFT2JqZWN0IGNvbnRleHQsIFRleHQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChuYW1lPUlEIHVpX3BhdHRlcm49U1RSSU5HIHJlcG9ydF9jYXRlZ29yeT1UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9UaW1lRm9ybWF0KEVPYmplY3QgY29udGV4dCwgVGltZUZvcm1hdCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUX0JBU0VfX05BTUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19VSV9QQVRURVJOKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1RFWFRBTElHTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19URVhUQUxJR04pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlRJTUVfRk9STUFUX19SRVBPUlRfQ0FURUdPUlkpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgUmVwb3J0RFNMUGFja2FnZS5MaXRlcmFscy5USU1FX0ZPUk1BVF9fUkVQT1JUX0NBVEVHT1JZKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0TmFtZSgpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0VWlfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSZXBvcnRfY2F0ZWdvcnlUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZXBvcnRfY2F0ZWdvcnkoKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRUaW1lRm9ybWF0QWNjZXNzKCkuZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZXBvcnRfcGF0dGVybigpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRUZXh0YWxpZ24oKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HIHN0eWxlPVtTdHlsZXxJRF0/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1RpdGxlKEVPYmplY3QgY29udGV4dCwgVGl0bGUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChuYW1lPUlEIHVpX3BhdHRlcm49U1RSSU5HIHJlcG9ydF9wYXR0ZXJuPVNUUklORyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Vb21vRm9ybWF0KEVPYmplY3QgY29udGV4dCwgVW9tb0Zvcm1hdCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVF9CQVNFX19OQU1FKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUX0JBU0VfX05BTUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19VSV9QQVRURVJOKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1VJX1BBVFRFUk4pKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19SRVBPUlRfUEFUVEVSTikpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuU09NRV9GT1JNQVRfX1RFWFRBTElHTikgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBSZXBvcnREU0xQYWNrYWdlLkxpdGVyYWxzLlNPTUVfRk9STUFUX19URVhUQUxJR04pKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXROYW1lKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRVaV9wYXR0ZXJuKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0VW9tb0Zvcm1hdEFjY2VzcygpLmdldFJlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF82XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0UmVwb3J0X3BhdHRlcm4oKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRVb21vRm9ybWF0QWNjZXNzKCkuZ2V0VGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF84XzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0VGV4dGFsaWduKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zZXJpYWxpemVyL1JlcG9ydERTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zZXJpYWxpemVyL1JlcG9ydERTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGEzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3NlcmlhbGl6ZXIvUmVwb3J0RFNMU3ludGFjdGljU2VxdWVuY2VyLmphdmEKQEAgLTAsMCArMSw2MjMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJpYWxpemVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNlcnZpY2VzLlJlcG9ydERTTEdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuSUdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuUnVsZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubm9kZW1vZGVsLklOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuR3JhbW1hckFsaWFzLkFic3RyYWN0RWxlbWVudEFsaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuR3JhbW1hckFsaWFzLkFsdGVybmF0aXZlQWxpYXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5HcmFtbWFyQWxpYXMuR3JvdXBBbGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLkdyYW1tYXJBbGlhcy5Ub2tlbkFsaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuSVN5bnRhY3RpY1NlcXVlbmNlclBEQVByb3ZpZGVyLklTeW5OYXZpZ2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5JU3ludGFjdGljU2VxdWVuY2VyUERBUHJvdmlkZXIuSVN5blRyYW5zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuQWJzdHJhY3RTeW50YWN0aWNTZXF1ZW5jZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIFJlcG9ydERTTFN5bnRhY3RpY1NlcXVlbmNlciBleHRlbmRzIEFic3RyYWN0U3ludGFjdGljU2VxdWVuY2VyIHsKKworCXByb3RlY3RlZCBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVEZXRhaWxfQWxsS2V5d29yZF8zXzBfb3JfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzJfXzsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX2E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3BfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19hX187CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX187CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fcDsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19wOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX29yX19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19wX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19hX187CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fX19vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fXzsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19fYTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fcDsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3FfX3A7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fX19vcl9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fX19vcl9fX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fX29yX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fX29yX19fX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fX187CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX0ZvbnRfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV9hOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfcDsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcDsKKwkKKwlASW5qZWN0CisJcHJvdGVjdGVkIHZvaWQgaW5pdChJR3JhbW1hckFjY2VzcyBhY2Nlc3MpIHsKKwkJZ3JhbW1hckFjY2VzcyA9IChSZXBvcnREU0xHcmFtbWFyQWNjZXNzKSBhY2Nlc3M7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVEZXRhaWxfQWxsS2V5d29yZF8zXzBfb3JfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzJfXyA9IG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMigpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlRGV0YWlsQWNjZXNzKCkuZ2V0QWxsS2V5d29yZF8zXzAoKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fYSA9IG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hID0gbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9fX29yX19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19xX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19wX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX2FfXyA9IG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fID0gbmV3IEFsdGVybmF0aXZlQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSksIG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSkpKTsKKwkJbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2EgPSBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fcCA9IG5ldyBHcm91cEFsaWFzKHRydWUsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYSA9IG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19wID0gbmV3IEdyb3VwQWxpYXModHJ1ZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hID0gbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSkpKTsKKwkJbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hID0gbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX29yX19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19wX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19hX18gPSBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSkpKTsKKwkJbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fID0gbmV3IEFsdGVybmF0aXZlQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSkpLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSkpOworCQltYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYSA9IG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hID0gbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKTsKKwkJbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fX2EgPSBuZXcgQWx0ZXJuYXRpdmVBbGlhcyh0cnVlLCB0cnVlLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX3AgPSBuZXcgR3JvdXBBbGlhcyh0cnVlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpKTsKKwkJbWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3FfX3AgPSBuZXcgR3JvdXBBbGlhcyh0cnVlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fX19vcl9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fX19vcl9fX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fID0gbmV3IEFsdGVybmF0aXZlQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSkpKSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSkpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSkpKSwgbmV3IEFsdGVybmF0aXZlQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSkpKSk7CisJCW1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fX19fb3JfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fX19fb3JfX19fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fXyA9IG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEFsdGVybmF0aXZlQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpKSksIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSksIG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TG9va3Vwc0tleXdvcmRfMV8zXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRJbnRlcnZhbHNLZXl3b3JkXzFfMl8wKCkpKSkpLCBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBBbHRlcm5hdGl2ZUFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IEdyb3VwQWxpYXMoZmFsc2UsIGZhbHNlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKSksIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpLCBuZXcgR3JvdXBBbGlhcyh0cnVlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80KCkpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSwgbmV3IEdyb3VwQWxpYXModHJ1ZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMigpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpKSkpLCBuZXcgQWx0ZXJuYXRpdmVBbGlhcyhmYWxzZSwgZmFsc2UsIG5ldyBHcm91cEFsaWFzKGZhbHNlLCBmYWxzZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIoKSksIG5ldyBHcm91cEFsaWFzKHRydWUsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzQoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRMb29rdXBzS2V5d29yZF8xXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yKCkpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldERhdGFtYXJ0VGFibGVQcm9wZXJ0eUFjY2VzcygpLmdldEludGVydmFsc0tleXdvcmRfMV8yXzAoKSkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpKSkpKTsKKwkJbWF0Y2hfRm9udF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xX2EgPSBuZXcgVG9rZW5BbGlhcyh0cnVlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xKCkpOworCQltYXRjaF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfcCA9IG5ldyBUb2tlbkFsaWFzKHRydWUsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldEZvbnRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xKCkpOworCQltYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcSA9IG5ldyBHcm91cEFsaWFzKGZhbHNlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpKTsKKwkJbWF0Y2hfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xID0gbmV3IFRva2VuQWxpYXMoZmFsc2UsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMl8xKCkpOworCQltYXRjaF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xID0gbmV3IFRva2VuQWxpYXMoZmFsc2UsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzFfMSgpKTsKKwkJbWF0Y2hfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcSA9IG5ldyBHcm91cEFsaWFzKGZhbHNlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMigpKSk7CisJCW1hdGNoX1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcSA9IG5ldyBUb2tlbkFsaWFzKGZhbHNlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMigpKTsKKwkJbWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hID0gbmV3IFRva2VuQWxpYXModHJ1ZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzAoKSk7CisJCW1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcCA9IG5ldyBUb2tlbkFsaWFzKHRydWUsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMCgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRVbmFzc2lnbmVkUnVsZUNhbGxUb2tlbihFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBSdWxlQ2FsbCBydWxlQ2FsbCwgSU5vZGUgbm9kZSkgeworCQlpZihydWxlQ2FsbC5nZXRSdWxlKCkgPT0gZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKQorCQkJcmV0dXJuIGdldEFycmF5QnJhY2tldHNUb2tlbihzZW1hbnRpY09iamVjdCwgcnVsZUNhbGwsIG5vZGUpOworCQllbHNlIGlmKHJ1bGVDYWxsLmdldFJ1bGUoKSA9PSBncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKQorCQkJcmV0dXJuIGdldE9wU2luZ2xlQXNzaWduVG9rZW4oc2VtYW50aWNPYmplY3QsIHJ1bGVDYWxsLCBub2RlKTsKKwkJcmV0dXJuICIiOworCX0KKwkKKwkvKioKKwkgKiBBcnJheUJyYWNrZXRzIDoKKwkgKiAJJ1snICddJworCSAqIDsKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFycmF5QnJhY2tldHNUb2tlbihFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBSdWxlQ2FsbCBydWxlQ2FsbCwgSU5vZGUgbm9kZSkgeworCQlpZiAobm9kZSAhPSBudWxsKQorCQkJcmV0dXJuIGdldFRva2VuVGV4dChub2RlKTsKKwkJcmV0dXJuICJbXSI7CisJfQorCQorCS8qKgorCSAqIE9wU2luZ2xlQXNzaWduOgorCSAqIAknPScKKwkgKiA7CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRPcFNpbmdsZUFzc2lnblRva2VuKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBJTm9kZSBub2RlKSB7CisJCWlmIChub2RlICE9IG51bGwpCisJCQlyZXR1cm4gZ2V0VG9rZW5UZXh0KG5vZGUpOworCQlyZXR1cm4gIj0iOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBlbWl0VW5hc3NpZ25lZFRva2VucyhFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luVHJhbnNpdGlvbiB0cmFuc2l0aW9uLCBJTm9kZSBmcm9tTm9kZSwgSU5vZGUgdG9Ob2RlKSB7CisJCWlmICh0cmFuc2l0aW9uLmdldEFtYmlndW91c1N5bnRheGVzKCkuaXNFbXB0eSgpKSByZXR1cm47CisJCUxpc3Q8SU5vZGU+IHRyYW5zaXRpb25Ob2RlcyA9IGNvbGxlY3ROb2Rlcyhmcm9tTm9kZSwgdG9Ob2RlKTsKKwkJZm9yIChBYnN0cmFjdEVsZW1lbnRBbGlhcyBzeW50YXggOiB0cmFuc2l0aW9uLmdldEFtYmlndW91c1N5bnRheGVzKCkpIHsKKwkJCUxpc3Q8SU5vZGU+IHN5bnRheE5vZGVzID0gZ2V0Tm9kZXNGb3IodHJhbnNpdGlvbk5vZGVzLCBzeW50YXgpOworCQkJaWYobWF0Y2hfRGF0YW1hcnRUYWJsZURldGFpbF9BbGxLZXl3b3JkXzNfMF9vcl9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMl9fLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YW1hcnRUYWJsZURldGFpbF9BbGxLZXl3b3JkXzNfMF9vcl9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMl9fKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3BfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19hX18uZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3BfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19hX18oc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX18uZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fcC5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19wKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9fcC5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19wKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fb3JfX19fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19wX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3BfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX2FfXy5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fb3JfX19fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19wX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3BfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX2FfXyhzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19fYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX19hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19xX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19xX19wLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fcChzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3FfX3AuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fcChzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fX18uZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fX19fb3JfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fX19fb3JfX19fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX29yX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX19fXyhzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fX19fKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfYS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0ZvbnRfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV9hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfcC5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X0ZvbnRfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV9wKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcC5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcChzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgYWNjZXB0Tm9kZXMoZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJ2FsbCcgfCAoJ3snICd9JykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVEZXRhaWxfQWxsS2V5d29yZF8zXzBfb3JfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzJfXyhFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJ2ludGVydmFscycgJ3snICd9JyAoJ2xvb2t1cHMnICd7JyAnfScpKikqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fYShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJ2ludGVydmFscycgJ3snICd9JykqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoCisJICAgICAoJ2ludGVydmFscycgJ3snICgnfScgJ2ludGVydmFscycgJ3snKSopIHwgCisJICAgICAoCisJICAgICAgICAgKCdpbnRlcnZhbHMnICd7JyAoJ30nICdpbnRlcnZhbHMnICd7JykqICd9Jyk/IAorCSAgICAgICAgICgnbG9va3VwcycgJ3snICd9JykrIAorCSAgICAgICAgICdpbnRlcnZhbHMnIAorCSAgICAgICAgICd7JyAKKwkgICAgICAgICAoJ30nICdpbnRlcnZhbHMnICd7JykqIAorCSAgICAgICAgICgnfScgKCdsb29rdXBzJyAneycgJ30nKSsgJ2ludGVydmFscycgJ3snICgnfScgJ2ludGVydmFscycgJ3snKSopKgorCSAgICAgKQorCSApCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3BfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19hX18oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKAorCSAgICAgKAorCSAgICAgICAgICdpbnRlcnZhbHMnIAorCSAgICAgICAgICgneycgJ30nICdpbnRlcnZhbHMnKSogCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICd9JyAKKwkgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICd9JyAKKwkgICAgICAgICAoJ2xvb2t1cHMnICd7JyAnfScpKiAKKwkgICAgICAgICAoCisJICAgICAgICAgICAgICdpbnRlcnZhbHMnIAorCSAgICAgICAgICAgICAoJ3snICd9JyAnaW50ZXJ2YWxzJykqIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgJ2xvb2t1cHMnIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgKCdsb29rdXBzJyAneycgJ30nKSoKKwkgICAgICAgICApKiAKKwkgICAgICAgICAoJ2ludGVydmFscycgfCAoJ2ludGVydmFscycgKCd7JyAnfScgJ2ludGVydmFscycpKiAneycgJ30nICdpbnRlcnZhbHMnKSkKKwkgICAgICkgfCAKKwkgICAgICgnaW50ZXJ2YWxzJyB8ICgnaW50ZXJ2YWxzJyAoJ3snICd9JyAnaW50ZXJ2YWxzJykqICd7JyAnfScgJ2ludGVydmFscycpKQorCSApCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fX19vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX2FfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgneycgJ30nICgnbG9va3VwcycgJ3snICd9JykqICdpbnRlcnZhbHMnKSoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19hKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgneycgJ30nICgnbG9va3VwcycgJ3snICd9JykqICdpbnRlcnZhbHMnKSsKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fYV9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19wKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgneycgJ30nICgnaW50ZXJ2YWxzJyAneycgJ30nKSogJ2xvb2t1cHMnKSoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19hKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgneycgJ30nICgnaW50ZXJ2YWxzJyAneycgJ30nKSogJ2xvb2t1cHMnKSsKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX0xvb2t1cHNLZXl3b3JkXzFfM18wX19wKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgnbG9va3VwcycgJ3snICd9JyAoJ2ludGVydmFscycgJ3snICd9JykqKSoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgnbG9va3VwcycgJ3snICd9JykqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKAorCSAgICAgKCdsb29rdXBzJyAneycgKCd9JyAnbG9va3VwcycgJ3snKSopIHwgCisJICAgICAoCisJICAgICAgICAgKCdsb29rdXBzJyAneycgKCd9JyAnbG9va3VwcycgJ3snKSogJ30nKT8gCisJICAgICAgICAgKCdpbnRlcnZhbHMnICd7JyAnfScpKyAKKwkgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICgnfScgJ2xvb2t1cHMnICd7JykqIAorCSAgICAgICAgICgnfScgKCdpbnRlcnZhbHMnICd7JyAnfScpKyAnbG9va3VwcycgJ3snICgnfScgJ2xvb2t1cHMnICd7JykqKSoKKwkgICAgICkKKwkgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX19vcl9fX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19xX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3BfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fYV9fKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgKKwkgICAgICgKKwkgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgKCd7JyAnfScgJ2xvb2t1cHMnKSogCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICd9JyAKKwkgICAgICAgICAnaW50ZXJ2YWxzJyAKKwkgICAgICAgICAneycgCisJICAgICAgICAgJ30nIAorCSAgICAgICAgICgnaW50ZXJ2YWxzJyAneycgJ30nKSogCisJICAgICAgICAgKAorCSAgICAgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgICAgICgneycgJ30nICdsb29rdXBzJykqIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgJ2ludGVydmFscycgCisJICAgICAgICAgICAgICd7JyAKKwkgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAoJ2ludGVydmFscycgJ3snICd9JykqCisJICAgICAgICAgKSogCisJICAgICAgICAgKCdsb29rdXBzJyB8ICgnbG9va3VwcycgKCd7JyAnfScgJ2xvb2t1cHMnKSogJ3snICd9JyAnbG9va3VwcycpKQorCSAgICAgKSB8IAorCSAgICAgKCdsb29rdXBzJyB8ICgnbG9va3VwcycgKCd7JyAnfScgJ2xvb2t1cHMnKSogJ3snICd9JyAnbG9va3VwcycpKQorCSApCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9EYXRhbWFydFRhYmxlUHJvcGVydHlfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19hX19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fYV9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fX19fb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9vcl9fX0xvb2t1cHNLZXl3b3JkXzFfM18wX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0xvb2t1cHNLZXl3b3JkXzFfM18wX19hX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX18oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKCd9JyAoJ2xvb2t1cHMnICd7JyAnfScpKiAnaW50ZXJ2YWxzJyAneycpKgorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKCd9JyAoJ2ludGVydmFscycgJ3snICd9JykqICdsb29rdXBzJyAneycpKgorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKCgnaW50ZXJ2YWxzJyAneycgJ30nKSB8ICgnbG9va3VwcycgJ3snICd9JykpKgorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKAorCSAgICAgKCdpbnRlcnZhbHMnICd7JyAnfScpPyAKKwkgICAgICgKKwkgICAgICAgICAnaW50ZXJ2YWxzJyAKKwkgICAgICAgICAneycgCisJICAgICAgICAgJ30nIAorCSAgICAgICAgICdsb29rdXBzJyAKKwkgICAgICAgICAneycgCisJICAgICAgICAgJ30nCisJICAgICApPworCSApKworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fcV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM18yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9fcV9fcChFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoCisJICAgICAoJ2xvb2t1cHMnICd7JyAnfScpPyAKKwkgICAgICgKKwkgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICd9JyAKKwkgICAgICAgICAnaW50ZXJ2YWxzJyAKKwkgICAgICAgICAneycgCisJICAgICAgICAgJ30nCisJICAgICApPworCSApKworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX3FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX3FfX3AoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKAorCSAgICAgKAorCSAgICAgICAgICgKKwkgICAgICAgICAgICAgKCd9JyAnaW50ZXJ2YWxzJyAneycgKCd9JyAnaW50ZXJ2YWxzJyAneycpKikgfCAKKwkgICAgICAgICAgICAgKAorCSAgICAgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAgICAgJ2xvb2t1cHMnIAorCSAgICAgICAgICAgICAgICAgJ3snIAorCSAgICAgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAgICAgKCdsb29rdXBzJyAneycgJ30nKSogCisJICAgICAgICAgICAgICAgICAnaW50ZXJ2YWxzJyAKKwkgICAgICAgICAgICAgICAgICd7JyAKKwkgICAgICAgICAgICAgICAgICgnfScgJ2ludGVydmFscycgJ3snKSoKKwkgICAgICAgICAgICAgKQorCSAgICAgICAgICkgCisJICAgICAgICAgJ30nIAorCSAgICAgICAgICdsb29rdXBzJyAKKwkgICAgICAgICAneycgCisJICAgICAgICAgJ30nIAorCSAgICAgICAgICgnbG9va3VwcycgJ3snICd9JykqIAorCSAgICAgICAgICgKKwkgICAgICAgICAgICAgJ2ludGVydmFscycgCisJICAgICAgICAgICAgICd7JyAKKwkgICAgICAgICAgICAgKCd9JyAnaW50ZXJ2YWxzJyAneycpKiAKKwkgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgICAgICd7JyAKKwkgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAoJ2xvb2t1cHMnICd7JyAnfScpKgorCSAgICAgICAgICkqIAorCSAgICAgICAgICgnbG9va3VwcycgfCAoJ2ludGVydmFscycgJ3snICgnfScgJ2ludGVydmFscycgJ3snKSogJ30nICdsb29rdXBzJykpCisJICAgICApIHwgCisJICAgICAoCisJICAgICAgICAgKAorCSAgICAgICAgICAgICAoJ30nICdsb29rdXBzJykgfCAKKwkgICAgICAgICAgICAgKAorCSAgICAgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAgICAgJ2ludGVydmFscycgCisJICAgICAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICAgICAoJ30nICdpbnRlcnZhbHMnICd7JykqIAorCSAgICAgICAgICAgICAgICAgJ30nIAorCSAgICAgICAgICAgICAgICAgJ2xvb2t1cHMnCisJICAgICAgICAgICAgICkKKwkgICAgICAgICApIHwgCisJICAgICAgICAgKAorCSAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICdsb29rdXBzJyAKKwkgICAgICAgICAgICAgJ3snIAorCSAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICgnbG9va3VwcycgJ3snICd9JykqIAorCSAgICAgICAgICAgICAoJ2xvb2t1cHMnIHwgKCdpbnRlcnZhbHMnICd7JyAoJ30nICdpbnRlcnZhbHMnICd7JykqICd9JyAnbG9va3VwcycpKQorCSAgICAgICAgICkKKwkgICAgICkKKwkgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfRGF0YW1hcnRUYWJsZVByb3BlcnR5X19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfb3JfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9fX29yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0xvb2t1cHNLZXl3b3JkXzFfM18wX19fX19fX29yX19fX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX2FfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX19fX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X19hX19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX19hX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfX2FfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9vcl9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfX19fX18oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKAorCSAgICAgKAorCSAgICAgICAgICgKKwkgICAgICAgICAgICAgKCd9JyAnbG9va3VwcycgJ3snICgnfScgJ2xvb2t1cHMnICd7JykqKSB8IAorCSAgICAgICAgICAgICAoCisJICAgICAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICAgICAnaW50ZXJ2YWxzJyAKKwkgICAgICAgICAgICAgICAgICd7JyAKKwkgICAgICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgICAgICgnaW50ZXJ2YWxzJyAneycgJ30nKSogCisJICAgICAgICAgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICAgICAoJ30nICdsb29rdXBzJyAneycpKgorCSAgICAgICAgICAgICApCisJICAgICAgICAgKSAKKwkgICAgICAgICAnfScgCisJICAgICAgICAgJ2ludGVydmFscycgCisJICAgICAgICAgJ3snIAorCSAgICAgICAgICd9JyAKKwkgICAgICAgICAoJ2ludGVydmFscycgJ3snICd9JykqIAorCSAgICAgICAgICgKKwkgICAgICAgICAgICAgJ2xvb2t1cHMnIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICgnfScgJ2xvb2t1cHMnICd7JykqIAorCSAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICdpbnRlcnZhbHMnIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgKCdpbnRlcnZhbHMnICd7JyAnfScpKgorCSAgICAgICAgICkqIAorCSAgICAgICAgICgnaW50ZXJ2YWxzJyB8ICgnbG9va3VwcycgJ3snICgnfScgJ2xvb2t1cHMnICd7JykqICd9JyAnaW50ZXJ2YWxzJykpCisJICAgICApIHwgCisJICAgICAoCisJICAgICAgICAgKAorCSAgICAgICAgICAgICAoJ30nICdpbnRlcnZhbHMnKSB8IAorCSAgICAgICAgICAgICAoCisJICAgICAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICAgICAnbG9va3VwcycgCisJICAgICAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICAgICAoJ30nICdsb29rdXBzJyAneycpKiAKKwkgICAgICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgICAgICdpbnRlcnZhbHMnCisJICAgICAgICAgICAgICkKKwkgICAgICAgICApIHwgCisJICAgICAgICAgKAorCSAgICAgICAgICAgICAnfScgCisJICAgICAgICAgICAgICdpbnRlcnZhbHMnIAorCSAgICAgICAgICAgICAneycgCisJICAgICAgICAgICAgICd9JyAKKwkgICAgICAgICAgICAgKCdpbnRlcnZhbHMnICd7JyAnfScpKiAKKwkgICAgICAgICAgICAgKCdpbnRlcnZhbHMnIHwgKCdsb29rdXBzJyAneycgKCd9JyAnbG9va3VwcycgJ3snKSogJ30nICdpbnRlcnZhbHMnKSkKKwkgICAgICAgICApCisJICAgICApCisJICkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0RhdGFtYXJ0VGFibGVQcm9wZXJ0eV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX29yX19fTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fX19fb3JfX19fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX19fb3JfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfX19fX19fb3JfX19fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX19SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfTG9va3Vwc0tleXdvcmRfMV8zXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzJfX2FfX19vcl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9fX19fUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180X0ludGVydmFsc0tleXdvcmRfMV8yXzBfTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzJfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl80X19fSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX2FfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfMl9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzRfX19JbnRlcnZhbHNLZXl3b3JkXzFfMl8wX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzFfMl8yX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNF9fYV9fYV9fX0ludGVydmFsc0tleXdvcmRfMV8yXzBfb3JfX19Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNF9Mb29rdXBzS2V5d29yZF8xXzNfMF9MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMl9fYV9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzRfSW50ZXJ2YWxzS2V5d29yZF8xXzJfMF9fX19fXyhFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnfScqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfYShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnfScrCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9Gb250X1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfcChFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJygnICcpJyk/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnOyc/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJzsnPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAoJygnICcpJyk/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICc7Jz8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnKCcqCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJygnKworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvc2VydmljZXMvUmVwb3J0RFNMR3JhbW1hckFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zZXJ2aWNlcy9SZXBvcnREU0xHcmFtbWFyQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5Zjc4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvc2VydmljZXMvUmVwb3J0RFNMR3JhbW1hckFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsNzg4NiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNlcnZpY2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkdyYW1tYXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkFic3RyYWN0RWxlbWVudEZpbmRlci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuc2VydmljZXMuWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlhiYXNlR3JhbW1hckFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3M7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xHcmFtbWFyQWNjZXNzIGV4dGVuZHMgQWJzdHJhY3RHcmFtbWFyRWxlbWVudEZpbmRlciB7CisJCisJCisJcHVibGljIGNsYXNzIFJlcG9ydE1vZGVsRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJlcG9ydE1vZGVsIik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGNrZ0Fzc2lnbm1lbnQgPSAoQXNzaWdubWVudClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGNrZ1JlcG9ydFBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNQY2tnQXNzaWdubWVudC5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JlcG9ydE1vZGVsOgorCQkvLwlwY2tnKz1SZXBvcnRQYWNrYWdlKjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3Bja2crPVJlcG9ydFBhY2thZ2UqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBja2dBc3NpZ25tZW50KCkgeyByZXR1cm4gY1Bja2dBc3NpZ25tZW50OyB9CisKKwkJLy9SZXBvcnRQYWNrYWdlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQY2tnUmVwb3J0UGFja2FnZVBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjUGNrZ1JlcG9ydFBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJlcG9ydFBhY2thZ2VFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUmVwb3J0UGFja2FnZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1JlcG9ydFBhY2thZ2VBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWNrYWdlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY05hbWVBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ltcG9ydHNBc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRzUmVwb3J0SW1wb3J0UGFyc2VyUnVsZUNhbGxfNF8wID0gKFJ1bGVDYWxsKWNJbXBvcnRzQXNzaWdubWVudF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNSA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xheW91dERhdGFLZXl3b3JkXzVfMCA9IChLZXl3b3JkKWNHcm91cF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzEgPSAoS2V5d29yZCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzVfMiA9IChHcm91cCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXh0ZXJuYWxDc3NVUklLZXl3b3JkXzVfMl8wID0gKEtleXdvcmQpY0dyb3VwXzVfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXh0ZXJuYWxDc3NVUklBc3NpZ25tZW50XzVfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzVfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0V4dGVybmFsQ3NzVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzJfMV8wID0gKFJ1bGVDYWxsKWNFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfNV8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF81XzJfMiA9IChHcm91cCljR3JvdXBfNV8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGcm9tQnVuZGxlS2V5d29yZF81XzJfMl8wID0gKEtleXdvcmQpY0dyb3VwXzVfMl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfNV8yXzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF81XzJfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0V4dGVybmFsQ3NzVVJJQnVuZGxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzJfMl8xXzAgPSAoUnVsZUNhbGwpY0V4dGVybmFsQ3NzVVJJQnVuZGxlQXNzaWdubWVudF81XzJfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWdldGVtcGxhdGVzQXNzaWdubWVudF81XzMgPSAoQXNzaWdubWVudCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BhZ2V0ZW1wbGF0ZXNQYWdlVGVtcGxhdGVzUGFyc2VyUnVsZUNhbGxfNV8zXzAgPSAoUnVsZUNhbGwpY1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzVfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRm9ybWF0dGVyc0Fzc2lnbm1lbnRfNV80ID0gKEFzc2lnbm1lbnQpY0dyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb3JtYXR0ZXJzU29tZUZvcm1hdHNQYXJzZXJSdWxlQ2FsbF81XzRfMCA9IChSdWxlQ2FsbCljRm9ybWF0dGVyc0Fzc2lnbm1lbnRfNV80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb2xvcnNBc3NpZ25tZW50XzVfNSA9IChBc3NpZ25tZW50KWNHcm91cF81LmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ29sb3JzQ29sb3JzUGFyc2VyUnVsZUNhbGxfNV81XzAgPSAoUnVsZUNhbGwpY0NvbG9yc0Fzc2lnbm1lbnRfNV81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb250c0Fzc2lnbm1lbnRfNV82ID0gKEFzc2lnbm1lbnQpY0dyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb250c0ZvbnRzUGFyc2VyUnVsZUNhbGxfNV82XzAgPSAoUnVsZUNhbGwpY0ZvbnRzQXNzaWdubWVudF81XzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01lZGlhc0Fzc2lnbm1lbnRfNV83ID0gKEFzc2lnbm1lbnQpY0dyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNZWRpYXNNZWRpYXNQYXJzZXJSdWxlQ2FsbF81XzdfMCA9IChSdWxlQ2FsbCljTWVkaWFzQXNzaWdubWVudF81XzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlc0Fzc2lnbm1lbnRfNV84ID0gKEFzc2lnbm1lbnQpY0dyb3VwXzUuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTdHlsZXNTdHlsZXNQYXJzZXJSdWxlQ2FsbF81XzhfMCA9IChSdWxlQ2FsbCljU3R5bGVzQXNzaWdubWVudF81XzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzkgPSAoS2V5d29yZCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoOSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVwb3J0c0Fzc2lnbm1lbnRfNiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlcG9ydHNSZXBvcnRQYXJzZXJSdWxlQ2FsbF82XzAgPSAoUnVsZUNhbGwpY1JlcG9ydHNBc3NpZ25tZW50XzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJCisJCS8vUmVwb3J0UGFja2FnZToKKwkJLy8Je1JlcG9ydFBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgInsiIGltcG9ydHMrPVJlcG9ydEltcG9ydCogKCJsYXlvdXQtZGF0YSIgInsiICgiZXh0ZXJuYWxDc3NVUkkiCisJCS8vCWV4dGVybmFsQ3NzVVJJPVNUUklORyAoImZyb20gYnVuZGxlIiBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkcpPyk/IHBhZ2V0ZW1wbGF0ZXM9UGFnZVRlbXBsYXRlcworCQkvLwlmb3JtYXR0ZXJzPVNvbWVGb3JtYXRzIGNvbG9ycz1Db2xvcnMgZm9udHM9Rm9udHMgbWVkaWFzPU1lZGlhcyBzdHlsZXM9U3R5bGVzICJ9Iik/IHJlcG9ydHMrPVJlcG9ydCogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1JlcG9ydFBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgInsiIGltcG9ydHMrPVJlcG9ydEltcG9ydCogKCJsYXlvdXQtZGF0YSIgInsiICgiZXh0ZXJuYWxDc3NVUkkiCisJCS8vZXh0ZXJuYWxDc3NVUkk9U1RSSU5HICgiZnJvbSBidW5kbGUiIGV4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORyk/KT8gcGFnZXRlbXBsYXRlcz1QYWdlVGVtcGxhdGVzCisJCS8vZm9ybWF0dGVycz1Tb21lRm9ybWF0cyBjb2xvcnM9Q29sb3JzIGZvbnRzPUZvbnRzIG1lZGlhcz1NZWRpYXMgc3R5bGVzPVN0eWxlcyAifSIpPyByZXBvcnRzKz1SZXBvcnQqICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tSZXBvcnRQYWNrYWdlfQorCQlwdWJsaWMgQWN0aW9uIGdldFJlcG9ydFBhY2thZ2VBY3Rpb25fMCgpIHsgcmV0dXJuIGNSZXBvcnRQYWNrYWdlQWN0aW9uXzA7IH0KKworCQkvLyJwYWNrYWdlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWNrYWdlS2V5d29yZF8xKCkgeyByZXR1cm4gY1BhY2thZ2VLZXl3b3JkXzE7IH0KKworCQkvL25hbWU9UXVhbGlmaWVkTmFtZQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzI7IH0KKworCQkvL1F1YWxpZmllZE5hbWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY05hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zOyB9CisKKwkJLy9pbXBvcnRzKz1SZXBvcnRJbXBvcnQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEltcG9ydHNBc3NpZ25tZW50XzQoKSB7IHJldHVybiBjSW1wb3J0c0Fzc2lnbm1lbnRfNDsgfQorCisJCS8vUmVwb3J0SW1wb3J0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbXBvcnRzUmVwb3J0SW1wb3J0UGFyc2VyUnVsZUNhbGxfNF8wKCkgeyByZXR1cm4gY0ltcG9ydHNSZXBvcnRJbXBvcnRQYXJzZXJSdWxlQ2FsbF80XzA7IH0KKworCQkvLygibGF5b3V0LWRhdGEiICJ7IiAoImV4dGVybmFsQ3NzVVJJIiBleHRlcm5hbENzc1VSST1TVFJJTkcgKCJmcm9tIGJ1bmRsZSIgZXh0ZXJuYWxDc3NVUklCdW5kbGU9U1RSSU5HKT8pPworCQkvL3BhZ2V0ZW1wbGF0ZXM9UGFnZVRlbXBsYXRlcyBmb3JtYXR0ZXJzPVNvbWVGb3JtYXRzIGNvbG9ycz1Db2xvcnMgZm9udHM9Rm9udHMgbWVkaWFzPU1lZGlhcyBzdHlsZXM9U3R5bGVzICJ9Iik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF81KCkgeyByZXR1cm4gY0dyb3VwXzU7IH0KKworCQkvLyJsYXlvdXQtZGF0YSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGF5b3V0RGF0YUtleXdvcmRfNV8wKCkgeyByZXR1cm4gY0xheW91dERhdGFLZXl3b3JkXzVfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzVfMSgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF81XzE7IH0KKworCQkvLygiZXh0ZXJuYWxDc3NVUkkiIGV4dGVybmFsQ3NzVVJJPVNUUklORyAoImZyb20gYnVuZGxlIiBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkcpPyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF81XzIoKSB7IHJldHVybiBjR3JvdXBfNV8yOyB9CisKKwkJLy8iZXh0ZXJuYWxDc3NVUkkiCisJCXB1YmxpYyBLZXl3b3JkIGdldEV4dGVybmFsQ3NzVVJJS2V5d29yZF81XzJfMCgpIHsgcmV0dXJuIGNFeHRlcm5hbENzc1VSSUtleXdvcmRfNV8yXzA7IH0KKworCQkvL2V4dGVybmFsQ3NzVVJJPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfNV8yXzEoKSB7IHJldHVybiBjRXh0ZXJuYWxDc3NVUklBc3NpZ25tZW50XzVfMl8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEV4dGVybmFsQ3NzVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzJfMV8wKCkgeyByZXR1cm4gY0V4dGVybmFsQ3NzVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzJfMV8wOyB9CisKKwkJLy8oImZyb20gYnVuZGxlIiBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNV8yXzIoKSB7IHJldHVybiBjR3JvdXBfNV8yXzI7IH0KKworCQkvLyJmcm9tIGJ1bmRsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RnJvbUJ1bmRsZUtleXdvcmRfNV8yXzJfMCgpIHsgcmV0dXJuIGNGcm9tQnVuZGxlS2V5d29yZF81XzJfMl8wOyB9CisKKwkJLy9leHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzVfMl8yXzEoKSB7IHJldHVybiBjRXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzVfMl8yXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMl8yXzFfMCgpIHsgcmV0dXJuIGNFeHRlcm5hbENzc1VSSUJ1bmRsZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNV8yXzJfMV8wOyB9CisKKwkJLy9wYWdldGVtcGxhdGVzPVBhZ2VUZW1wbGF0ZXMKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFnZXRlbXBsYXRlc0Fzc2lnbm1lbnRfNV8zKCkgeyByZXR1cm4gY1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzVfMzsgfQorCisJCS8vUGFnZVRlbXBsYXRlcworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFnZXRlbXBsYXRlc1BhZ2VUZW1wbGF0ZXNQYXJzZXJSdWxlQ2FsbF81XzNfMCgpIHsgcmV0dXJuIGNQYWdldGVtcGxhdGVzUGFnZVRlbXBsYXRlc1BhcnNlclJ1bGVDYWxsXzVfM18wOyB9CisKKwkJLy9mb3JtYXR0ZXJzPVNvbWVGb3JtYXRzCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEZvcm1hdHRlcnNBc3NpZ25tZW50XzVfNCgpIHsgcmV0dXJuIGNGb3JtYXR0ZXJzQXNzaWdubWVudF81XzQ7IH0KKworCQkvL1NvbWVGb3JtYXRzCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb3JtYXR0ZXJzU29tZUZvcm1hdHNQYXJzZXJSdWxlQ2FsbF81XzRfMCgpIHsgcmV0dXJuIGNGb3JtYXR0ZXJzU29tZUZvcm1hdHNQYXJzZXJSdWxlQ2FsbF81XzRfMDsgfQorCisJCS8vY29sb3JzPUNvbG9ycworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDb2xvcnNBc3NpZ25tZW50XzVfNSgpIHsgcmV0dXJuIGNDb2xvcnNBc3NpZ25tZW50XzVfNTsgfQorCisJCS8vQ29sb3JzCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDb2xvcnNDb2xvcnNQYXJzZXJSdWxlQ2FsbF81XzVfMCgpIHsgcmV0dXJuIGNDb2xvcnNDb2xvcnNQYXJzZXJSdWxlQ2FsbF81XzVfMDsgfQorCisJCS8vZm9udHM9Rm9udHMKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9udHNBc3NpZ25tZW50XzVfNigpIHsgcmV0dXJuIGNGb250c0Fzc2lnbm1lbnRfNV82OyB9CisKKwkJLy9Gb250cworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9udHNGb250c1BhcnNlclJ1bGVDYWxsXzVfNl8wKCkgeyByZXR1cm4gY0ZvbnRzRm9udHNQYXJzZXJSdWxlQ2FsbF81XzZfMDsgfQorCisJCS8vbWVkaWFzPU1lZGlhcworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNZWRpYXNBc3NpZ25tZW50XzVfNygpIHsgcmV0dXJuIGNNZWRpYXNBc3NpZ25tZW50XzVfNzsgfQorCisJCS8vTWVkaWFzCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNZWRpYXNNZWRpYXNQYXJzZXJSdWxlQ2FsbF81XzdfMCgpIHsgcmV0dXJuIGNNZWRpYXNNZWRpYXNQYXJzZXJSdWxlQ2FsbF81XzdfMDsgfQorCisJCS8vc3R5bGVzPVN0eWxlcworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTdHlsZXNBc3NpZ25tZW50XzVfOCgpIHsgcmV0dXJuIGNTdHlsZXNBc3NpZ25tZW50XzVfODsgfQorCisJCS8vU3R5bGVzCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdHlsZXNTdHlsZXNQYXJzZXJSdWxlQ2FsbF81XzhfMCgpIHsgcmV0dXJuIGNTdHlsZXNTdHlsZXNQYXJzZXJSdWxlQ2FsbF81XzhfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81XzkoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzVfOTsgfQorCisJCS8vcmVwb3J0cys9UmVwb3J0KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZXBvcnRzQXNzaWdubWVudF82KCkgeyByZXR1cm4gY1JlcG9ydHNBc3NpZ25tZW50XzY7IH0KKworCQkvL1JlcG9ydAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0c1JlcG9ydFBhcnNlclJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNSZXBvcnRzUmVwb3J0UGFyc2VyUnVsZUNhbGxfNl8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzc7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGFnZVRlbXBsYXRlc0VsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQYWdlVGVtcGxhdGVzIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGFnZVRlbXBsYXRlc0FjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZ2V0ZW1wbGF0ZXNBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWdldGVtcGxhdGVzUGFnZVRlbXBsYXRlUGFyc2VyUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNQYWdldGVtcGxhdGVzQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUGFnZVRlbXBsYXRlczoKKwkJLy8Je1BhZ2VUZW1wbGF0ZXN9IHBhZ2V0ZW1wbGF0ZXMrPVBhZ2VUZW1wbGF0ZSo7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97UGFnZVRlbXBsYXRlc30gcGFnZXRlbXBsYXRlcys9UGFnZVRlbXBsYXRlKgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tQYWdlVGVtcGxhdGVzfQorCQlwdWJsaWMgQWN0aW9uIGdldFBhZ2VUZW1wbGF0ZXNBY3Rpb25fMCgpIHsgcmV0dXJuIGNQYWdlVGVtcGxhdGVzQWN0aW9uXzA7IH0KKworCQkvL3BhZ2V0ZW1wbGF0ZXMrPVBhZ2VUZW1wbGF0ZSoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFnZXRlbXBsYXRlc0Fzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNQYWdldGVtcGxhdGVzQXNzaWdubWVudF8xOyB9CisKKwkJLy9QYWdlVGVtcGxhdGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZ2V0ZW1wbGF0ZXNQYWdlVGVtcGxhdGVQYXJzZXJSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjUGFnZXRlbXBsYXRlc1BhZ2VUZW1wbGF0ZVBhcnNlclJ1bGVDYWxsXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBTb21lRm9ybWF0c0VsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJTb21lRm9ybWF0cyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1NvbWVGb3JtYXRzQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRm9ybWF0dGVyc0tleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRm9ybWF0dGVyc0Fzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0Zvcm1hdHRlcnNTb21lRm9ybWF0UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNGb3JtYXR0ZXJzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvL1NvbWVGb3JtYXRzOgorCQkvLwl7U29tZUZvcm1hdHN9ICJmb3JtYXR0ZXJzIiAieyIgZm9ybWF0dGVycys9U29tZUZvcm1hdCogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1NvbWVGb3JtYXRzfSAiZm9ybWF0dGVycyIgInsiIGZvcm1hdHRlcnMrPVNvbWVGb3JtYXQqICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tTb21lRm9ybWF0c30KKwkJcHVibGljIEFjdGlvbiBnZXRTb21lRm9ybWF0c0FjdGlvbl8wKCkgeyByZXR1cm4gY1NvbWVGb3JtYXRzQWN0aW9uXzA7IH0KKworCQkvLyJmb3JtYXR0ZXJzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb3JtYXR0ZXJzS2V5d29yZF8xKCkgeyByZXR1cm4gY0Zvcm1hdHRlcnNLZXl3b3JkXzE7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvL2Zvcm1hdHRlcnMrPVNvbWVGb3JtYXQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEZvcm1hdHRlcnNBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjRm9ybWF0dGVyc0Fzc2lnbm1lbnRfMzsgfQorCisJCS8vU29tZUZvcm1hdAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9ybWF0dGVyc1NvbWVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRm9ybWF0dGVyc1NvbWVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDb2xvcnNFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ29sb3JzIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ29sb3JzQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ29sb3JzS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb2xvcnNBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb2xvcnNDb2xvclBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljQ29sb3JzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvL0NvbG9yczoKKwkJLy8Je0NvbG9yc30gImNvbG9ycyIgInsiIGNvbG9ycys9Q29sb3IqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tDb2xvcnN9ICJjb2xvcnMiICJ7IiBjb2xvcnMrPUNvbG9yKiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Q29sb3JzfQorCQlwdWJsaWMgQWN0aW9uIGdldENvbG9yc0FjdGlvbl8wKCkgeyByZXR1cm4gY0NvbG9yc0FjdGlvbl8wOyB9CisKKwkJLy8iY29sb3JzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDb2xvcnNLZXl3b3JkXzEoKSB7IHJldHVybiBjQ29sb3JzS2V5d29yZF8xOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yOyB9CisKKwkJLy9jb2xvcnMrPUNvbG9yKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDb2xvcnNBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjQ29sb3JzQXNzaWdubWVudF8zOyB9CisKKwkJLy9Db2xvcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29sb3JzQ29sb3JQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjQ29sb3JzQ29sb3JQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBGb250c0VsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJGb250cyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0ZvbnRzQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRm9udHNLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZvbnRzQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9udHNGb250UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNGb250c0Fzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQkKKwkJLy9Gb250czoKKwkJLy8Je0ZvbnRzfSAiZm9udHMiICJ7IiBmb250cys9Rm9udCogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0ZvbnRzfSAiZm9udHMiICJ7IiBmb250cys9Rm9udCogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0ZvbnRzfQorCQlwdWJsaWMgQWN0aW9uIGdldEZvbnRzQWN0aW9uXzAoKSB7IHJldHVybiBjRm9udHNBY3Rpb25fMDsgfQorCisJCS8vImZvbnRzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb250c0tleXdvcmRfMSgpIHsgcmV0dXJuIGNGb250c0tleXdvcmRfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vZm9udHMrPUZvbnQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEZvbnRzQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0ZvbnRzQXNzaWdubWVudF8zOyB9CisKKwkJLy9Gb250CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb250c0ZvbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRm9udHNGb250UGFyc2VyUnVsZUNhbGxfM18wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQ7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgTWVkaWFzRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIk1lZGlhcyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY01lZGlhc0FjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01lZGlhc0tleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWVkaWFzQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWVkaWFzTWVkaWFQYXJzZXJSdWxlQ2FsbF8zXzAgPSAoUnVsZUNhbGwpY01lZGlhc0Fzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQkKKwkJLy9NZWRpYXM6CisJCS8vCXtNZWRpYXN9ICJtZWRpYXMiICJ7IiBtZWRpYXMrPU1lZGlhKiAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97TWVkaWFzfSAibWVkaWFzIiAieyIgbWVkaWFzKz1NZWRpYSogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve01lZGlhc30KKwkJcHVibGljIEFjdGlvbiBnZXRNZWRpYXNBY3Rpb25fMCgpIHsgcmV0dXJuIGNNZWRpYXNBY3Rpb25fMDsgfQorCisJCS8vIm1lZGlhcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWVkaWFzS2V5d29yZF8xKCkgeyByZXR1cm4gY01lZGlhc0tleXdvcmRfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vbWVkaWFzKz1NZWRpYSoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWVkaWFzQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY01lZGlhc0Fzc2lnbm1lbnRfMzsgfQorCisJCS8vTWVkaWEKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1lZGlhc01lZGlhUGFyc2VyUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY01lZGlhc01lZGlhUGFyc2VyUnVsZUNhbGxfM18wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQ7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgTWVkaWFFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiTWVkaWEiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWVkaWFLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL01lZGlhOgorCQkvLwkibWVkaWEiIG5hbWU9SUQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8ibWVkaWEiIG5hbWU9SUQKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8ibWVkaWEiCisJCXB1YmxpYyBLZXl3b3JkIGdldE1lZGlhS2V5d29yZF8wKCkgeyByZXR1cm4gY01lZGlhS2V5d29yZF8wOyB9CisKKwkJLy9uYW1lPUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE5hbWVBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMTsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFN0eWxlc0VsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJTdHlsZXMiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNTdHlsZXNBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZXNLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlc0Fzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlc1N0eWxlUGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNTdHlsZXNBc3NpZ25tZW50XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJCisJCS8vU3R5bGVzOgorCQkvLwl7U3R5bGVzfSAic3R5bGVzIiAieyIgc3R5bGVzKz1TdHlsZSogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1N0eWxlc30gInN0eWxlcyIgInsiIHN0eWxlcys9U3R5bGUqICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tTdHlsZXN9CisJCXB1YmxpYyBBY3Rpb24gZ2V0U3R5bGVzQWN0aW9uXzAoKSB7IHJldHVybiBjU3R5bGVzQWN0aW9uXzA7IH0KKworCQkvLyJzdHlsZXMiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlc0tleXdvcmRfMSgpIHsgcmV0dXJuIGNTdHlsZXNLZXl3b3JkXzE7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvL3N0eWxlcys9U3R5bGUqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlc0Fzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNTdHlsZXNBc3NpZ25tZW50XzM7IH0KKworCQkvL1N0eWxlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdHlsZXNTdHlsZVBhcnNlclJ1bGVDYWxsXzNfMCgpIHsgcmV0dXJuIGNTdHlsZXNTdHlsZVBhcnNlclJ1bGVDYWxsXzNfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80OyB9CisJfQorCisJcHVibGljIGNsYXNzIFBhZ2VUZW1wbGF0ZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQYWdlVGVtcGxhdGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGFnZXRlbXBsYXRlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAgPSAoUnVsZUNhbGwpY05hbWVBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1R5cGVLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1NpemVBc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTaXplUGFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljU2l6ZUFzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT3JpZW50YXRpb25LZXl3b3JkXzUgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY09yaWVudGF0aW9uQXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjT3JpZW50YXRpb25PcmllbnRhdGlvbkVudW1FbnVtUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNPcmllbnRhdGlvbkFzc2lnbm1lbnRfNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVG9wbWFyZ2luS2V5d29yZF83ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUb3BNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfOCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoOCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RvcE1hcmdpblZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF84XzAgPSAoUnVsZUNhbGwpY1RvcE1hcmdpblZhbHVlQXNzaWdubWVudF84LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUb3BNYXJnaW5Vbml0QXNzaWdubWVudF85ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg5KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVG9wTWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzlfMCA9IChSdWxlQ2FsbCljVG9wTWFyZ2luVW5pdEFzc2lnbm1lbnRfOS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdG1hcmdpbktleXdvcmRfMTAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMZWZ0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzExID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0xlZnRNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTFfMCA9IChSdWxlQ2FsbCljTGVmdE1hcmdpblZhbHVlQXNzaWdubWVudF8xMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTGVmdE1hcmdpblVuaXRBc3NpZ25tZW50XzEyID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0xlZnRNYXJnaW5Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMTJfMCA9IChSdWxlQ2FsbCljTGVmdE1hcmdpblVuaXRBc3NpZ25tZW50XzEyLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCb3R0b21tYXJnaW5LZXl3b3JkXzEzID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQm90dG9tTWFyZ2luVmFsdWVBc3NpZ25tZW50XzE0ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxNCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0JvdHRvbU1hcmdpblZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xNF8wID0gKFJ1bGVDYWxsKWNCb3R0b21NYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvdHRvbU1hcmdpblVuaXRBc3NpZ25tZW50XzE1ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxNSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0JvdHRvbU1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8xNV8wID0gKFJ1bGVDYWxsKWNCb3R0b21NYXJnaW5Vbml0QXNzaWdubWVudF8xNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRtYXJnaW5LZXl3b3JkXzE2ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxNik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmlnaHRNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTcgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDE3KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmlnaHRNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTdfMCA9IChSdWxlQ2FsbCljUmlnaHRNYXJnaW5WYWx1ZUFzc2lnbm1lbnRfMTcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JpZ2h0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTggPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDE4KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmlnaHRNYXJnaW5Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMThfMCA9IChSdWxlQ2FsbCljUmlnaHRNYXJnaW5Vbml0QXNzaWdubWVudF8xOC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSGVhZGVyQXNzaWdubWVudF8xOSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTkpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNIZWFkZXJQYWdlSGVhZGVyUGFyc2VyUnVsZUNhbGxfMTlfMCA9IChSdWxlQ2FsbCljSGVhZGVyQXNzaWdubWVudF8xOS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRm9vdGVyQXNzaWdubWVudF8yMCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMjApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb290ZXJQYWdlRm9vdGVyUGFyc2VyUnVsZUNhbGxfMjBfMCA9IChSdWxlQ2FsbCljRm9vdGVyQXNzaWdubWVudF8yMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzIxID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyMSk7CisJCQorCQkvL1BhZ2VUZW1wbGF0ZToKKwkJLy8JInBhZ2V0ZW1wbGF0ZSIgbmFtZT1JRCAieyIgInR5cGUiIHNpemU9UGFnZVNpemVFbnVtICJvcmllbnRhdGlvbiIgb3JpZW50YXRpb249T3JpZW50YXRpb25FbnVtICJ0b3BtYXJnaW4iCisJCS8vCXRvcE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIHRvcE1hcmdpblVuaXQ9VW5pdEVudW0gImxlZnRtYXJnaW4iIGxlZnRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvLwlsZWZ0TWFyZ2luVW5pdD1Vbml0RW51bSAiYm90dG9tbWFyZ2luIiBib3R0b21NYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciBib3R0b21NYXJnaW5Vbml0PVVuaXRFbnVtICJyaWdodG1hcmdpbiIKKwkJLy8JcmlnaHRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciByaWdodE1hcmdpblVuaXQ9VW5pdEVudW0gaGVhZGVyPVBhZ2VIZWFkZXI/IGZvb3Rlcj1QYWdlRm9vdGVyPyAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8icGFnZXRlbXBsYXRlIiBuYW1lPUlEICJ7IiAidHlwZSIgc2l6ZT1QYWdlU2l6ZUVudW0gIm9yaWVudGF0aW9uIiBvcmllbnRhdGlvbj1PcmllbnRhdGlvbkVudW0gInRvcG1hcmdpbiIKKwkJLy90b3BNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciB0b3BNYXJnaW5Vbml0PVVuaXRFbnVtICJsZWZ0bWFyZ2luIiBsZWZ0TWFyZ2luVmFsdWU9VW5zaWduZWROdW1iZXIKKwkJLy9sZWZ0TWFyZ2luVW5pdD1Vbml0RW51bSAiYm90dG9tbWFyZ2luIiBib3R0b21NYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciBib3R0b21NYXJnaW5Vbml0PVVuaXRFbnVtICJyaWdodG1hcmdpbiIKKwkJLy9yaWdodE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIHJpZ2h0TWFyZ2luVW5pdD1Vbml0RW51bSBoZWFkZXI9UGFnZUhlYWRlcj8gZm9vdGVyPVBhZ2VGb290ZXI/ICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJwYWdldGVtcGxhdGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBhZ2V0ZW1wbGF0ZUtleXdvcmRfMCgpIHsgcmV0dXJuIGNQYWdldGVtcGxhdGVLZXl3b3JkXzA7IH0KKworCQkvL25hbWU9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvLyJ0eXBlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUeXBlS2V5d29yZF8zKCkgeyByZXR1cm4gY1R5cGVLZXl3b3JkXzM7IH0KKworCQkvL3NpemU9UGFnZVNpemVFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNpemVBc3NpZ25tZW50XzQoKSB7IHJldHVybiBjU2l6ZUFzc2lnbm1lbnRfNDsgfQorCisJCS8vUGFnZVNpemVFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTaXplUGFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNTaXplUGFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzRfMDsgfQorCisJCS8vIm9yaWVudGF0aW9uIgorCQlwdWJsaWMgS2V5d29yZCBnZXRPcmllbnRhdGlvbktleXdvcmRfNSgpIHsgcmV0dXJuIGNPcmllbnRhdGlvbktleXdvcmRfNTsgfQorCisJCS8vb3JpZW50YXRpb249T3JpZW50YXRpb25FbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE9yaWVudGF0aW9uQXNzaWdubWVudF82KCkgeyByZXR1cm4gY09yaWVudGF0aW9uQXNzaWdubWVudF82OyB9CisKKwkJLy9PcmllbnRhdGlvbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldE9yaWVudGF0aW9uT3JpZW50YXRpb25FbnVtRW51bVJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNPcmllbnRhdGlvbk9yaWVudGF0aW9uRW51bUVudW1SdWxlQ2FsbF82XzA7IH0KKworCQkvLyJ0b3BtYXJnaW4iCisJCXB1YmxpYyBLZXl3b3JkIGdldFRvcG1hcmdpbktleXdvcmRfNygpIHsgcmV0dXJuIGNUb3BtYXJnaW5LZXl3b3JkXzc7IH0KKworCQkvL3RvcE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRvcE1hcmdpblZhbHVlQXNzaWdubWVudF84KCkgeyByZXR1cm4gY1RvcE1hcmdpblZhbHVlQXNzaWdubWVudF84OyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VG9wTWFyZ2luVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzhfMCgpIHsgcmV0dXJuIGNUb3BNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfOF8wOyB9CisKKwkJLy90b3BNYXJnaW5Vbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRvcE1hcmdpblVuaXRBc3NpZ25tZW50XzkoKSB7IHJldHVybiBjVG9wTWFyZ2luVW5pdEFzc2lnbm1lbnRfOTsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRvcE1hcmdpblVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF85XzAoKSB7IHJldHVybiBjVG9wTWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzlfMDsgfQorCisJCS8vImxlZnRtYXJnaW4iCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRtYXJnaW5LZXl3b3JkXzEwKCkgeyByZXR1cm4gY0xlZnRtYXJnaW5LZXl3b3JkXzEwOyB9CisKKwkJLy9sZWZ0TWFyZ2luVmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TGVmdE1hcmdpblZhbHVlQXNzaWdubWVudF8xMSgpIHsgcmV0dXJuIGNMZWZ0TWFyZ2luVmFsdWVBc3NpZ25tZW50XzExOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TGVmdE1hcmdpblZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xMV8wKCkgeyByZXR1cm4gY0xlZnRNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTFfMDsgfQorCisJCS8vbGVmdE1hcmdpblVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TGVmdE1hcmdpblVuaXRBc3NpZ25tZW50XzEyKCkgeyByZXR1cm4gY0xlZnRNYXJnaW5Vbml0QXNzaWdubWVudF8xMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldExlZnRNYXJnaW5Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMTJfMCgpIHsgcmV0dXJuIGNMZWZ0TWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzEyXzA7IH0KKworCQkvLyJib3R0b21tYXJnaW4iCisJCXB1YmxpYyBLZXl3b3JkIGdldEJvdHRvbW1hcmdpbktleXdvcmRfMTMoKSB7IHJldHVybiBjQm90dG9tbWFyZ2luS2V5d29yZF8xMzsgfQorCisJCS8vYm90dG9tTWFyZ2luVmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Qm90dG9tTWFyZ2luVmFsdWVBc3NpZ25tZW50XzE0KCkgeyByZXR1cm4gY0JvdHRvbU1hcmdpblZhbHVlQXNzaWdubWVudF8xNDsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJvdHRvbU1hcmdpblZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xNF8wKCkgeyByZXR1cm4gY0JvdHRvbU1hcmdpblZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xNF8wOyB9CisKKwkJLy9ib3R0b21NYXJnaW5Vbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJvdHRvbU1hcmdpblVuaXRBc3NpZ25tZW50XzE1KCkgeyByZXR1cm4gY0JvdHRvbU1hcmdpblVuaXRBc3NpZ25tZW50XzE1OyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Qm90dG9tTWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzE1XzAoKSB7IHJldHVybiBjQm90dG9tTWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzE1XzA7IH0KKworCQkvLyJyaWdodG1hcmdpbiIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRtYXJnaW5LZXl3b3JkXzE2KCkgeyByZXR1cm4gY1JpZ2h0bWFyZ2luS2V5d29yZF8xNjsgfQorCisJCS8vcmlnaHRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSaWdodE1hcmdpblZhbHVlQXNzaWdubWVudF8xNygpIHsgcmV0dXJuIGNSaWdodE1hcmdpblZhbHVlQXNzaWdubWVudF8xNzsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJpZ2h0TWFyZ2luVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzE3XzAoKSB7IHJldHVybiBjUmlnaHRNYXJnaW5WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMTdfMDsgfQorCisJCS8vcmlnaHRNYXJnaW5Vbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJpZ2h0TWFyZ2luVW5pdEFzc2lnbm1lbnRfMTgoKSB7IHJldHVybiBjUmlnaHRNYXJnaW5Vbml0QXNzaWdubWVudF8xODsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJpZ2h0TWFyZ2luVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzE4XzAoKSB7IHJldHVybiBjUmlnaHRNYXJnaW5Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMThfMDsgfQorCisJCS8vaGVhZGVyPVBhZ2VIZWFkZXI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlYWRlckFzc2lnbm1lbnRfMTkoKSB7IHJldHVybiBjSGVhZGVyQXNzaWdubWVudF8xOTsgfQorCisJCS8vUGFnZUhlYWRlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGVhZGVyUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzE5XzAoKSB7IHJldHVybiBjSGVhZGVyUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzE5XzA7IH0KKworCQkvL2Zvb3Rlcj1QYWdlRm9vdGVyPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGb290ZXJBc3NpZ25tZW50XzIwKCkgeyByZXR1cm4gY0Zvb3RlckFzc2lnbm1lbnRfMjA7IH0KKworCQkvL1BhZ2VGb290ZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldEZvb3RlclBhZ2VGb290ZXJQYXJzZXJSdWxlQ2FsbF8yMF8wKCkgeyByZXR1cm4gY0Zvb3RlclBhZ2VGb290ZXJQYXJzZXJSdWxlQ2FsbF8yMF8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzIxKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBVbnNpZ25lZE51bWJlckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJVbnNpZ25lZE51bWJlciIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOdW1iZXJQYXJzZXJSdWxlQ2FsbCA9IChSdWxlQ2FsbClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVW5zaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKwkJLy8JTnVtYmVyOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROdW1iZXJQYXJzZXJSdWxlQ2FsbCgpIHsgcmV0dXJuIGNOdW1iZXJQYXJzZXJSdWxlQ2FsbDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDb2xvckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDb2xvciIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDb2xvcktleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlc18yID0gKEFsdGVybmF0aXZlcyljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NvbG9yQXNzaWdubWVudF8yXzAgPSAoQXNzaWdubWVudCljQWx0ZXJuYXRpdmVzXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb2xvclNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzAgPSAoUnVsZUNhbGwpY0NvbG9yQXNzaWdubWVudF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yXzEgPSAoR3JvdXApY0FsdGVybmF0aXZlc18yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEYXJrZW5zS2V5d29yZF8yXzFfMCA9IChLZXl3b3JkKWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8xXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMl8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQmFzZWNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzFfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNCYXNlY29sb3JBc3NpZ25tZW50XzJfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmFzZWNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzFfMF8xID0gKFJ1bGVDYWxsKWNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfMV8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0J5UGVyY2VudEtleXdvcmRfMl8xXzIgPSAoS2V5d29yZCljR3JvdXBfMl8xLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEYXJrZW5zYnlBc3NpZ25tZW50XzJfMV8zID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMS5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0RhcmtlbnNieUlOVFRlcm1pbmFsUnVsZUNhbGxfMl8xXzNfMCA9IChSdWxlQ2FsbCljRGFya2Vuc2J5QXNzaWdubWVudF8yXzFfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzJfMiA9IChHcm91cCljQWx0ZXJuYXRpdmVzXzIuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xpZ2h0ZW5zS2V5d29yZF8yXzJfMCA9IChLZXl3b3JkKWNHcm91cF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMl8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQmFzZWNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNCYXNlY29sb3JBc3NpZ25tZW50XzJfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmFzZWNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMl8yXzFfMF8xID0gKFJ1bGVDYWxsKWNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfMl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0J5UGVyY2VudEtleXdvcmRfMl8yXzIgPSAoS2V5d29yZCljR3JvdXBfMl8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMyA9IChBc3NpZ25tZW50KWNHcm91cF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMaWdodGVuc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzJfM18wID0gKFJ1bGVDYWxsKWNMaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzJfMyA9IChHcm91cCljQWx0ZXJuYXRpdmVzXzIuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RyYW5zZm9ybXNLZXl3b3JkXzJfM18wID0gKEtleXdvcmQpY0dyb3VwXzJfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQmFzZWNvbG9yQXNzaWdubWVudF8yXzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfM18xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCYXNlY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8yXzNfMV8wXzEgPSAoUnVsZUNhbGwpY0Jhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8zXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQnlQZXJjZW50S2V5d29yZF8yXzNfMiA9IChLZXl3b3JkKWNHcm91cF8yXzMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RyYW5zZm9ybXNieUFzc2lnbm1lbnRfMl8zXzMgPSAoQXNzaWdubWVudCljR3JvdXBfMl8zLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVHJhbnNmb3Jtc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzNfM18wID0gKFJ1bGVDYWxsKWNUcmFuc2Zvcm1zYnlBc3NpZ25tZW50XzJfM18zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUb3dhcmRzS2V5d29yZF8yXzNfNCA9IChLZXl3b3JkKWNHcm91cF8yXzMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RhcmdldGNvbG9yQXNzaWdubWVudF8yXzNfNSA9IChBc3NpZ25tZW50KWNHcm91cF8yXzMuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNUYXJnZXRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8zXzVfMCA9IChDcm9zc1JlZmVyZW5jZSljVGFyZ2V0Y29sb3JBc3NpZ25tZW50XzJfM181LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFyZ2V0Y29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8yXzNfNV8wXzEgPSAoUnVsZUNhbGwpY1RhcmdldGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8yXzNfNV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vQ29sb3I6CisJCS8vCSJjb2xvciIgbmFtZT1JRCAoY29sb3I9U1RSSU5HIHwgImRhcmtlbnMiIGJhc2Vjb2xvcj1bQ29sb3JdICJieS1wZXJjZW50IiBkYXJrZW5zYnk9SU5UIHwgImxpZ2h0ZW5zIiBiYXNlY29sb3I9W0NvbG9yXQorCQkvLwkiYnktcGVyY2VudCIgbGlnaHRlbnNieT1JTlQgfCAidHJhbnNmb3JtcyIgYmFzZWNvbG9yPVtDb2xvcl0gImJ5LXBlcmNlbnQiIHRyYW5zZm9ybXNieT1JTlQgInRvd2FyZHMiCisJCS8vCXRhcmdldGNvbG9yPVtDb2xvcl0pOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImNvbG9yIiBuYW1lPUlEIChjb2xvcj1TVFJJTkcgfCAiZGFya2VucyIgYmFzZWNvbG9yPVtDb2xvcl0gImJ5LXBlcmNlbnQiIGRhcmtlbnNieT1JTlQgfCAibGlnaHRlbnMiIGJhc2Vjb2xvcj1bQ29sb3JdCisJCS8vImJ5LXBlcmNlbnQiIGxpZ2h0ZW5zYnk9SU5UIHwgInRyYW5zZm9ybXMiIGJhc2Vjb2xvcj1bQ29sb3JdICJieS1wZXJjZW50IiB0cmFuc2Zvcm1zYnk9SU5UICJ0b3dhcmRzIgorCQkvL3RhcmdldGNvbG9yPVtDb2xvcl0pCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImNvbG9yIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDb2xvcktleXdvcmRfMCgpIHsgcmV0dXJuIGNDb2xvcktleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vY29sb3I9U1RSSU5HIHwgImRhcmtlbnMiIGJhc2Vjb2xvcj1bQ29sb3JdICJieS1wZXJjZW50IiBkYXJrZW5zYnk9SU5UIHwgImxpZ2h0ZW5zIiBiYXNlY29sb3I9W0NvbG9yXSAiYnktcGVyY2VudCIKKwkJLy9saWdodGVuc2J5PUlOVCB8ICJ0cmFuc2Zvcm1zIiBiYXNlY29sb3I9W0NvbG9yXSAiYnktcGVyY2VudCIgdHJhbnNmb3Jtc2J5PUlOVCAidG93YXJkcyIgdGFyZ2V0Y29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlc18yKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlc18yOyB9CisKKwkJLy9jb2xvcj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29sb3JBc3NpZ25tZW50XzJfMCgpIHsgcmV0dXJuIGNDb2xvckFzc2lnbm1lbnRfMl8wOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldENvbG9yU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzBfMCgpIHsgcmV0dXJuIGNDb2xvclNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzA7IH0KKworCQkvLyJkYXJrZW5zIiBiYXNlY29sb3I9W0NvbG9yXSAiYnktcGVyY2VudCIgZGFya2Vuc2J5PUlOVAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8xKCkgeyByZXR1cm4gY0dyb3VwXzJfMTsgfQorCisJCS8vImRhcmtlbnMiCisJCXB1YmxpYyBLZXl3b3JkIGdldERhcmtlbnNLZXl3b3JkXzJfMV8wKCkgeyByZXR1cm4gY0RhcmtlbnNLZXl3b3JkXzJfMV8wOyB9CisKKwkJLy9iYXNlY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCYXNlY29sb3JBc3NpZ25tZW50XzJfMV8xKCkgeyByZXR1cm4gY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8xXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEJhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8xXzFfMCgpIHsgcmV0dXJuIGNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfMV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCYXNlY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8yXzFfMV8wXzEoKSB7IHJldHVybiBjQmFzZWNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzFfMF8xOyB9CisKKwkJLy8iYnktcGVyY2VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0QnlQZXJjZW50S2V5d29yZF8yXzFfMigpIHsgcmV0dXJuIGNCeVBlcmNlbnRLZXl3b3JkXzJfMV8yOyB9CisKKwkJLy9kYXJrZW5zYnk9SU5UCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERhcmtlbnNieUFzc2lnbm1lbnRfMl8xXzMoKSB7IHJldHVybiBjRGFya2Vuc2J5QXNzaWdubWVudF8yXzFfMzsgfQorCisJCS8vSU5UCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXREYXJrZW5zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfMV8zXzAoKSB7IHJldHVybiBjRGFya2Vuc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfM18wOyB9CisKKwkJLy8ibGlnaHRlbnMiIGJhc2Vjb2xvcj1bQ29sb3JdICJieS1wZXJjZW50IiBsaWdodGVuc2J5PUlOVAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8yKCkgeyByZXR1cm4gY0dyb3VwXzJfMjsgfQorCisJCS8vImxpZ2h0ZW5zIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMaWdodGVuc0tleXdvcmRfMl8yXzAoKSB7IHJldHVybiBjTGlnaHRlbnNLZXl3b3JkXzJfMl8wOyB9CisKKwkJLy9iYXNlY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCYXNlY29sb3JBc3NpZ25tZW50XzJfMl8xKCkgeyByZXR1cm4gY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8yXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEJhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8yXzFfMCgpIHsgcmV0dXJuIGNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfMl8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCYXNlY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8yXzJfMV8wXzEoKSB7IHJldHVybiBjQmFzZWNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMl8yXzFfMF8xOyB9CisKKwkJLy8iYnktcGVyY2VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0QnlQZXJjZW50S2V5d29yZF8yXzJfMigpIHsgcmV0dXJuIGNCeVBlcmNlbnRLZXl3b3JkXzJfMl8yOyB9CisKKwkJLy9saWdodGVuc2J5PUlOVAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRMaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMygpIHsgcmV0dXJuIGNMaWdodGVuc2J5QXNzaWdubWVudF8yXzJfMzsgfQorCisJCS8vSU5UCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRMaWdodGVuc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzJfM18wKCkgeyByZXR1cm4gY0xpZ2h0ZW5zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfMl8zXzA7IH0KKworCQkvLyJ0cmFuc2Zvcm1zIiBiYXNlY29sb3I9W0NvbG9yXSAiYnktcGVyY2VudCIgdHJhbnNmb3Jtc2J5PUlOVCAidG93YXJkcyIgdGFyZ2V0Y29sb3I9W0NvbG9yXQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8zKCkgeyByZXR1cm4gY0dyb3VwXzJfMzsgfQorCisJCS8vInRyYW5zZm9ybXMiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRyYW5zZm9ybXNLZXl3b3JkXzJfM18wKCkgeyByZXR1cm4gY1RyYW5zZm9ybXNLZXl3b3JkXzJfM18wOyB9CisKKwkJLy9iYXNlY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCYXNlY29sb3JBc3NpZ25tZW50XzJfM18xKCkgeyByZXR1cm4gY0Jhc2Vjb2xvckFzc2lnbm1lbnRfMl8zXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEJhc2Vjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMl8zXzFfMCgpIHsgcmV0dXJuIGNCYXNlY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfM18xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCYXNlY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8yXzNfMV8wXzEoKSB7IHJldHVybiBjQmFzZWNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMl8zXzFfMF8xOyB9CisKKwkJLy8iYnktcGVyY2VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0QnlQZXJjZW50S2V5d29yZF8yXzNfMigpIHsgcmV0dXJuIGNCeVBlcmNlbnRLZXl3b3JkXzJfM18yOyB9CisKKwkJLy90cmFuc2Zvcm1zYnk9SU5UCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRyYW5zZm9ybXNieUFzc2lnbm1lbnRfMl8zXzMoKSB7IHJldHVybiBjVHJhbnNmb3Jtc2J5QXNzaWdubWVudF8yXzNfMzsgfQorCisJCS8vSU5UCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUcmFuc2Zvcm1zYnlJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfM18zXzAoKSB7IHJldHVybiBjVHJhbnNmb3Jtc2J5SU5UVGVybWluYWxSdWxlQ2FsbF8yXzNfM18wOyB9CisKKwkJLy8idG93YXJkcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0VG93YXJkc0tleXdvcmRfMl8zXzQoKSB7IHJldHVybiBjVG93YXJkc0tleXdvcmRfMl8zXzQ7IH0KKworCQkvL3RhcmdldGNvbG9yPVtDb2xvcl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGFyZ2V0Y29sb3JBc3NpZ25tZW50XzJfM181KCkgeyByZXR1cm4gY1RhcmdldGNvbG9yQXNzaWdubWVudF8yXzNfNTsgfQorCisJCS8vW0NvbG9yXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0VGFyZ2V0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfM181XzAoKSB7IHJldHVybiBjVGFyZ2V0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzJfM181XzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYXJnZXRjb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzJfM181XzBfMSgpIHsgcmV0dXJuIGNUYXJnZXRjb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzJfM181XzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBGb250RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkZvbnQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXAgPSAoVW5vcmRlcmVkR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGb250S2V5d29yZF8wXzAgPSAoS2V5d29yZCljR3JvdXBfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzBfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzBfMiA9IChLZXl3b3JkKWNHcm91cF8wLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMF8zID0gKEdyb3VwKWNHcm91cF8wLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFeHRlbmRzS2V5d29yZF8wXzNfMCA9IChLZXl3b3JkKWNHcm91cF8wXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0V4dGVuZHNBc3NpZ25tZW50XzBfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0V4dGVuZHNGb250Q3Jvc3NSZWZlcmVuY2VfMF8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRXh0ZW5kc0Fzc2lnbm1lbnRfMF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFeHRlbmRzRm9udElEVGVybWluYWxSdWxlQ2FsbF8wXzNfMV8wXzEgPSAoUnVsZUNhbGwpY0V4dGVuZHNGb250Q3Jvc3NSZWZlcmVuY2VfMF8zXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzBfNCA9IChHcm91cCljR3JvdXBfMC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRmFtaWx5S2V5d29yZF8wXzRfMCA9IChLZXl3b3JkKWNHcm91cF8wXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZhbWlseUFzc2lnbm1lbnRfMF80XzEgPSAoQXNzaWdubWVudCljR3JvdXBfMF80LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRmFtaWx5Rm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzBfNF8xXzAgPSAoUnVsZUNhbGwpY0ZhbWlseUFzc2lnbm1lbnRfMF80XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY1Vub3JkZXJlZEdyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU3R5bGVGb250U3R5bGVFbnVtRW51bVJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljU3R5bGVBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvbGRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljVW5vcmRlcmVkR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JvbGRCb2xkS2V5d29yZF8yXzAgPSAoS2V5d29yZCljQm9sZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18wID0gKEdyb3VwKWNHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTaXplS2V5d29yZF8zXzBfMCA9IChLZXl3b3JkKWNHcm91cF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1NpemV2YWx1ZUFzc2lnbm1lbnRfM18wXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU2l6ZXZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzBfMV8wID0gKFJ1bGVDYWxsKWNTaXpldmFsdWVBc3NpZ25tZW50XzNfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTaXpldW5pdEFzc2lnbm1lbnRfM18wXzIgPSAoQXNzaWdubWVudCljR3JvdXBfM18wLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU2l6ZXVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzBfMl8wID0gKFJ1bGVDYWxsKWNTaXpldW5pdEFzc2lnbm1lbnRfM18wXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzEgPSAoS2V5d29yZCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL0ZvbnQ6CisJCS8vCSJmb250IiBuYW1lPUlEICJ7IiAoImV4dGVuZHMiIGV4dGVuZHM9W0ZvbnRdKT8gKCJmYW1pbHkiIGZhbWlseT1Gb250RmFtaWx5KT8gJiBzdHlsZT1Gb250U3R5bGVFbnVtPyAmIGJvbGQ/PSJib2xkIj8gJgorCQkvLwkoInNpemUiIHNpemV2YWx1ZT1VbnNpZ25lZE51bWJlciBzaXpldW5pdD1Vbml0RW51bSk/ICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJmb250IiBuYW1lPUlEICJ7IiAoImV4dGVuZHMiIGV4dGVuZHM9W0ZvbnRdKT8gKCJmYW1pbHkiIGZhbWlseT1Gb250RmFtaWx5KT8gJiBzdHlsZT1Gb250U3R5bGVFbnVtPyAmIGJvbGQ/PSJib2xkIj8gJgorCQkvLygic2l6ZSIgc2l6ZXZhbHVlPVVuc2lnbmVkTnVtYmVyIHNpemV1bml0PVVuaXRFbnVtKT8gIn0iCisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cCgpIHsgcmV0dXJuIGNVbm9yZGVyZWRHcm91cDsgfQorCisJCS8vImZvbnQiIG5hbWU9SUQgInsiICgiZXh0ZW5kcyIgZXh0ZW5kcz1bRm9udF0pPyAoImZhbWlseSIgZmFtaWx5PUZvbnRGYW1pbHkpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMCgpIHsgcmV0dXJuIGNHcm91cF8wOyB9CisKKwkJLy8iZm9udCIKKwkJcHVibGljIEtleXdvcmQgZ2V0Rm9udEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0ZvbnRLZXl3b3JkXzBfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8wXzEoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMF8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8wXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzBfMV8wOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzBfMjsgfQorCisJCS8vKCJleHRlbmRzIiBleHRlbmRzPVtGb250XSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8wXzMoKSB7IHJldHVybiBjR3JvdXBfMF8zOyB9CisKKwkJLy8iZXh0ZW5kcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0RXh0ZW5kc0tleXdvcmRfMF8zXzAoKSB7IHJldHVybiBjRXh0ZW5kc0tleXdvcmRfMF8zXzA7IH0KKworCQkvL2V4dGVuZHM9W0ZvbnRdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEV4dGVuZHNBc3NpZ25tZW50XzBfM18xKCkgeyByZXR1cm4gY0V4dGVuZHNBc3NpZ25tZW50XzBfM18xOyB9CisKKwkJLy9bRm9udF0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEV4dGVuZHNGb250Q3Jvc3NSZWZlcmVuY2VfMF8zXzFfMCgpIHsgcmV0dXJuIGNFeHRlbmRzRm9udENyb3NzUmVmZXJlbmNlXzBfM18xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFeHRlbmRzRm9udElEVGVybWluYWxSdWxlQ2FsbF8wXzNfMV8wXzEoKSB7IHJldHVybiBjRXh0ZW5kc0ZvbnRJRFRlcm1pbmFsUnVsZUNhbGxfMF8zXzFfMF8xOyB9CisKKwkJLy8oImZhbWlseSIgZmFtaWx5PUZvbnRGYW1pbHkpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMF80KCkgeyByZXR1cm4gY0dyb3VwXzBfNDsgfQorCisJCS8vImZhbWlseSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RmFtaWx5S2V5d29yZF8wXzRfMCgpIHsgcmV0dXJuIGNGYW1pbHlLZXl3b3JkXzBfNF8wOyB9CisKKwkJLy9mYW1pbHk9Rm9udEZhbWlseQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGYW1pbHlBc3NpZ25tZW50XzBfNF8xKCkgeyByZXR1cm4gY0ZhbWlseUFzc2lnbm1lbnRfMF80XzE7IH0KKworCQkvL0ZvbnRGYW1pbHkKKwkJcHVibGljIFJ1bGVDYWxsIGdldEZhbWlseUZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8wXzRfMV8wKCkgeyByZXR1cm4gY0ZhbWlseUZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8wXzRfMV8wOyB9CisKKwkJLy9zdHlsZT1Gb250U3R5bGVFbnVtPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTdHlsZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNTdHlsZUFzc2lnbm1lbnRfMTsgfQorCisJCS8vRm9udFN0eWxlRW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U3R5bGVGb250U3R5bGVFbnVtRW51bVJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNTdHlsZUZvbnRTdHlsZUVudW1FbnVtUnVsZUNhbGxfMV8wOyB9CisKKwkJLy9ib2xkPz0iYm9sZCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJvbGRBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjQm9sZEFzc2lnbm1lbnRfMjsgfQorCisJCS8vImJvbGQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEJvbGRCb2xkS2V5d29yZF8yXzAoKSB7IHJldHVybiBjQm9sZEJvbGRLZXl3b3JkXzJfMDsgfQorCisJCS8vKCJzaXplIiBzaXpldmFsdWU9VW5zaWduZWROdW1iZXIgc2l6ZXVuaXQ9VW5pdEVudW0pPyAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzMoKSB7IHJldHVybiBjR3JvdXBfMzsgfQorCisJCS8vKCJzaXplIiBzaXpldmFsdWU9VW5zaWduZWROdW1iZXIgc2l6ZXVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18wKCkgeyByZXR1cm4gY0dyb3VwXzNfMDsgfQorCisJCS8vInNpemUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNpemVLZXl3b3JkXzNfMF8wKCkgeyByZXR1cm4gY1NpemVLZXl3b3JkXzNfMF8wOyB9CisKKwkJLy9zaXpldmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U2l6ZXZhbHVlQXNzaWdubWVudF8zXzBfMSgpIHsgcmV0dXJuIGNTaXpldmFsdWVBc3NpZ25tZW50XzNfMF8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U2l6ZXZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzBfMV8wKCkgeyByZXR1cm4gY1NpemV2YWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18wXzFfMDsgfQorCisJCS8vc2l6ZXVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U2l6ZXVuaXRBc3NpZ25tZW50XzNfMF8yKCkgeyByZXR1cm4gY1NpemV1bml0QXNzaWdubWVudF8zXzBfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFNpemV1bml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18wXzJfMCgpIHsgcmV0dXJuIGNTaXpldW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMF8yXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgRm9udEZhbWlseUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJGb250RmFtaWx5Iik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCdWlsZEluRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0N1c3RvbUZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9Gb250RmFtaWx5OgorCQkvLwlCdWlsZEluRm9udEZhbWlseSB8IEN1c3RvbUZvbnRGYW1pbHk7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9CdWlsZEluRm9udEZhbWlseSB8IEN1c3RvbUZvbnRGYW1pbHkKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9CdWlsZEluRm9udEZhbWlseQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QnVpbGRJbkZvbnRGYW1pbHlQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY0J1aWxkSW5Gb250RmFtaWx5UGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vQ3VzdG9tRm9udEZhbWlseQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q3VzdG9tRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjQ3VzdG9tRm9udEZhbWlseVBhcnNlclJ1bGVDYWxsXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQnVpbGRJbkZvbnRGYW1pbHlFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQnVpbGRJbkZvbnRGYW1pbHkiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDdXN0b21Bc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0N1c3RvbUJ1aWxkSW5Gb250RmFtaWx5RW51bUVudW1SdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNDdXN0b21Bc3NpZ25tZW50LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vQnVpbGRJbkZvbnRGYW1pbHk6CisJCS8vCWN1c3RvbT1CdWlsZEluRm9udEZhbWlseUVudW07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9jdXN0b209QnVpbGRJbkZvbnRGYW1pbHlFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEN1c3RvbUFzc2lnbm1lbnQoKSB7IHJldHVybiBjQ3VzdG9tQXNzaWdubWVudDsgfQorCisJCS8vQnVpbGRJbkZvbnRGYW1pbHlFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDdXN0b21CdWlsZEluRm9udEZhbWlseUVudW1FbnVtUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNDdXN0b21CdWlsZEluRm9udEZhbWlseUVudW1FbnVtUnVsZUNhbGxfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDdXN0b21Gb250RmFtaWx5RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkN1c3RvbUZvbnRGYW1pbHkiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDdXN0b21Bc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0N1c3RvbVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljQ3VzdG9tQXNzaWdubWVudC5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0N1c3RvbUZvbnRGYW1pbHk6CisJCS8vCWN1c3RvbT1TVFJJTkc7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9jdXN0b209U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEN1c3RvbUFzc2lnbm1lbnQoKSB7IHJldHVybiBjQ3VzdG9tQXNzaWdubWVudDsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDdXN0b21TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzAoKSB7IHJldHVybiBjQ3VzdG9tU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIEJvcmRlclN0eWxlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkJvcmRlclN0eWxlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1R5cGVBc3NpZ25tZW50XzAgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUeXBlQm9yZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wID0gKFJ1bGVDYWxsKWNUeXBlQXNzaWdubWVudF8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNXaWR0aHZhbHVlQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjV2lkdGh2YWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNXaWR0aHZhbHVlQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNXaWR0aHVuaXRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNXaWR0aHVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY1dpZHRodW5pdEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQ29sb3JBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18wID0gKENyb3NzUmVmZXJlbmNlKWNDb2xvckFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzEgPSAoUnVsZUNhbGwpY0NvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9Cb3JkZXJTdHlsZToKKwkJLy8JdHlwZT1Cb3JkZXJUeXBlRW51bSB3aWR0aHZhbHVlPVVuc2lnbmVkTnVtYmVyIHdpZHRodW5pdD1Vbml0RW51bSBjb2xvcj1bQ29sb3JdOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vdHlwZT1Cb3JkZXJUeXBlRW51bSB3aWR0aHZhbHVlPVVuc2lnbmVkTnVtYmVyIHdpZHRodW5pdD1Vbml0RW51bSBjb2xvcj1bQ29sb3JdCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vdHlwZT1Cb3JkZXJUeXBlRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUeXBlQXNzaWdubWVudF8wKCkgeyByZXR1cm4gY1R5cGVBc3NpZ25tZW50XzA7IH0KKworCQkvL0JvcmRlclR5cGVFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUeXBlQm9yZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCkgeyByZXR1cm4gY1R5cGVCb3JkZXJUeXBlRW51bUVudW1SdWxlQ2FsbF8wXzA7IH0KKworCQkvL3dpZHRodmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0V2lkdGh2YWx1ZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNXaWR0aHZhbHVlQXNzaWdubWVudF8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0V2lkdGh2YWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY1dpZHRodmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzFfMDsgfQorCisJCS8vd2lkdGh1bml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFdpZHRodW5pdEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNXaWR0aHVuaXRBc3NpZ25tZW50XzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRXaWR0aHVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjV2lkdGh1bml0VW5pdEVudW1FbnVtUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9jb2xvcj1bQ29sb3JdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldENvbG9yQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0NvbG9yQXNzaWdubWVudF8zOyB9CisKKwkJLy9bQ29sb3JdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18wKCkgeyByZXR1cm4gY0NvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xKCkgeyByZXR1cm4gY0NvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgU3R5bGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiU3R5bGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU3R5bGVLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFeHRlbmRzS2V5d29yZF8zXzAgPSAoS2V5d29yZCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXh0ZW5kc0Fzc2lnbm1lbnRfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNFeHRlbmRzU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRXh0ZW5kc0Fzc2lnbm1lbnRfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRXh0ZW5kc1N0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzEgPSAoUnVsZUNhbGwpY0V4dGVuZHNTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXBfNCA9IChVbm9yZGVyZWRHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zvcm1hdHRlcktleXdvcmRfNF8wXzAgPSAoS2V5d29yZCljR3JvdXBfNF8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb3JtYXRBc3NpZ25tZW50XzRfMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0Zvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV80XzBfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNGb3JtYXRBc3NpZ25tZW50XzRfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9ybWF0U29tZUZvcm1hdElEVGVybWluYWxSdWxlQ2FsbF80XzBfMV8wXzEgPSAoUnVsZUNhbGwpY0Zvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV80XzBfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNF8xID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF80LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGb250S2V5d29yZF80XzFfMCA9IChLZXl3b3JkKWNHcm91cF80XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZvbnRBc3NpZ25tZW50XzRfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0ZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfNF8xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRm9udEFzc2lnbm1lbnRfNF8xXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb250Rm9udElEVGVybWluYWxSdWxlQ2FsbF80XzFfMV8wXzEgPSAoUnVsZUNhbGwpY0ZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfNF8xXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfMiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQmFja2dyb3VuZGNvbG9yS2V5d29yZF80XzJfMCA9IChLZXl3b3JkKWNHcm91cF80XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfNF8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQmFja2dyb3VuZGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV80XzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNCYWNrZ3JvdW5kY29sb3JBc3NpZ25tZW50XzRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmFja2dyb3VuZGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfNF8yXzFfMF8xID0gKFJ1bGVDYWxsKWNCYWNrZ3JvdW5kY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfMl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzJfMiA9IChHcm91cCljR3JvdXBfNF8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBbHRlcm5hdGVLZXl3b3JkXzRfMl8yXzAgPSAoS2V5d29yZCljR3JvdXBfNF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzRfMl8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV80XzJfMl8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzRfMl8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfNF8yXzJfMV8wXzEgPSAoUnVsZUNhbGwpY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVDb2xvckNyb3NzUmVmZXJlbmNlXzRfMl8yXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfMyA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGV4dGNvbG9yS2V5d29yZF80XzNfMCA9IChLZXl3b3JkKWNHcm91cF80XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRjb2xvckFzc2lnbm1lbnRfNF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV80XzNfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNUZXh0Y29sb3JBc3NpZ25tZW50XzRfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfNF8zXzFfMF8xID0gKFJ1bGVDYWxsKWNUZXh0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfM18xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzQgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RleHRhbGlnbktleXdvcmRfNF80XzAgPSAoS2V5d29yZCljR3JvdXBfNF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0YWxpZ25Bc3NpZ25tZW50XzRfNF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfNC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfNF80XzFfMCA9IChSdWxlQ2FsbCljVGV4dGFsaWduQXNzaWdubWVudF80XzRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfNSA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQm9yZGVyVG9wS2V5d29yZF80XzVfMCA9IChLZXl3b3JkKWNHcm91cF80XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvcmRlclRvcEFzc2lnbm1lbnRfNF81XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF81LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzVfMV8wID0gKFJ1bGVDYWxsKWNCb3JkZXJUb3BBc3NpZ25tZW50XzRfNV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNF82ID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF80LmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCb3JkZXJCb3R0b21LZXl3b3JkXzRfNl8wID0gKEtleXdvcmQpY0dyb3VwXzRfNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQm9yZGVyQm90dG9tQXNzaWdubWVudF80XzZfMSA9IChBc3NpZ25tZW50KWNHcm91cF80XzYuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzRfNl8xXzAgPSAoUnVsZUNhbGwpY0JvcmRlckJvdHRvbUFzc2lnbm1lbnRfNF82XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzcgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JvcmRlckxlZnRLZXl3b3JkXzRfN18wID0gKEtleXdvcmQpY0dyb3VwXzRfNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQm9yZGVyTGVmdEFzc2lnbm1lbnRfNF83XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF83LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQm9yZGVyTGVmdEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF83XzFfMCA9IChSdWxlQ2FsbCljQm9yZGVyTGVmdEFzc2lnbm1lbnRfNF83XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzggPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JvcmRlclJpZ2h0S2V5d29yZF80XzhfMCA9IChLZXl3b3JkKWNHcm91cF80XzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvcmRlclJpZ2h0QXNzaWdubWVudF80XzhfMSA9IChBc3NpZ25tZW50KWNHcm91cF80XzguZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCb3JkZXJSaWdodEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF84XzFfMCA9IChSdWxlQ2FsbCljQm9yZGVyUmlnaHRBc3NpZ25tZW50XzRfOF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNF85ID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF80LmVDb250ZW50cygpLmdldCg5KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nVG9wS2V5d29yZF80XzlfMCA9IChLZXl3b3JkKWNHcm91cF80XzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfNF85XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF85LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1RvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzlfMV8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nVG9wVmFsdWVBc3NpZ25tZW50XzRfOV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfNF85XzIgPSAoQXNzaWdubWVudCljR3JvdXBfNF85LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1RvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzlfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfNF85XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzEwID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF80LmVDb250ZW50cygpLmdldCgxMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGFkZGluZ0JvdHRvbUtleXdvcmRfNF8xMF8wID0gKEtleXdvcmQpY0dyb3VwXzRfMTAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdCb3R0b21WYWx1ZUFzc2lnbm1lbnRfNF8xMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMTAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWRkaW5nQm90dG9tVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTBfMV8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzRfMTBfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTBfMiA9IChBc3NpZ25tZW50KWNHcm91cF80XzEwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEwXzJfMCA9IChSdWxlQ2FsbCljUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfMTEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDExKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nTGVmdEtleXdvcmRfNF8xMV8wID0gKEtleXdvcmQpY0dyb3VwXzRfMTEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzRfMTFfMSA9IChBc3NpZ25tZW50KWNHcm91cF80XzExLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ0xlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMV8xXzAgPSAoUnVsZUNhbGwpY1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzRfMTFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF80XzExXzIgPSAoQXNzaWdubWVudCljR3JvdXBfNF8xMS5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BhZGRpbmdMZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTFfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nTGVmdFVuaXRBc3NpZ25tZW50XzRfMTFfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfMTIgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDEyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nUmlnaHRLZXl3b3JkXzRfMTJfMCA9IChLZXl3b3JkKWNHcm91cF80XzEyLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMTIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWRkaW5nUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMl8xXzAgPSAoUnVsZUNhbGwpY1BhZGRpbmdSaWdodFZhbHVlQXNzaWdubWVudF80XzEyXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdSaWdodFVuaXRBc3NpZ25tZW50XzRfMTJfMiA9IChBc3NpZ25tZW50KWNHcm91cF80XzEyLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1JpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTJfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nUmlnaHRVbml0QXNzaWdubWVudF80XzEyXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzEzID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF80LmVDb250ZW50cygpLmdldCgxMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWFyZ2luVG9wS2V5d29yZF80XzEzXzAgPSAoS2V5d29yZCljR3JvdXBfNF8xMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luVG9wVmFsdWVBc3NpZ25tZW50XzRfMTNfMSA9IChBc3NpZ25tZW50KWNHcm91cF80XzEzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWFyZ2luVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTNfMV8wID0gKFJ1bGVDYWxsKWNNYXJnaW5Ub3BWYWx1ZUFzc2lnbm1lbnRfNF8xM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5Ub3BVbml0QXNzaWdubWVudF80XzEzXzIgPSAoQXNzaWdubWVudCljR3JvdXBfNF8xMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpblRvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEzXzJfMCA9IChSdWxlQ2FsbCljTWFyZ2luVG9wVW5pdEFzc2lnbm1lbnRfNF8xM18yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNF8xNCA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMTQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01hcmdpbkJvdHRvbUtleXdvcmRfNF8xNF8wID0gKEtleXdvcmQpY0dyb3VwXzRfMTQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01hcmdpbkJvdHRvbVZhbHVlQXNzaWdubWVudF80XzE0XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF8xNC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE0XzFfMCA9IChSdWxlQ2FsbCljTWFyZ2luQm90dG9tVmFsdWVBc3NpZ25tZW50XzRfMTRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luQm90dG9tVW5pdEFzc2lnbm1lbnRfNF8xNF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMTQuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5Cb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNF8yXzAgPSAoUnVsZUNhbGwpY01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzRfMTUgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDE1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNYXJnaW5MZWZ0S2V5d29yZF80XzE1XzAgPSAoS2V5d29yZCljR3JvdXBfNF8xNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF80XzE1XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNF8xNS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpbkxlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNV8xXzAgPSAoUnVsZUNhbGwpY01hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xNV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfNF8xNV8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMTUuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5MZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTVfMl8wID0gKFJ1bGVDYWxsKWNNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfNF8xNV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNF8xNiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMTYpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01hcmdpblJpZ2h0S2V5d29yZF80XzE2XzAgPSAoS2V5d29yZCljR3JvdXBfNF8xNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xNl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzRfMTYuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5SaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE2XzFfMCA9IChSdWxlQ2FsbCljTWFyZ2luUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xNl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5SaWdodFVuaXRBc3NpZ25tZW50XzRfMTZfMiA9IChBc3NpZ25tZW50KWNHcm91cF80XzE2LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWFyZ2luUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNl8yXzAgPSAoUnVsZUNhbGwpY01hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xNl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNZWRpYXN0eWxlc0Fzc2lnbm1lbnRfNSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01lZGlhc3R5bGVzTWVkaWFTdHlsZVBhcnNlclJ1bGVDYWxsXzVfMCA9IChSdWxlQ2FsbCljTWVkaWFzdHlsZXNBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJCisJCS8vU3R5bGU6CisJCS8vCSJzdHlsZSIgbmFtZT1JRCAieyIgKCJleHRlbmRzIiBleHRlbmRzPVtTdHlsZV0pPyAoKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmICgiZm9udCIgZm9udD1bRm9udF0pPyAmCisJCS8vCSgiYmFja2dyb3VuZGNvbG9yIiBiYWNrZ3JvdW5kY29sb3I9W0NvbG9yXSAoImFsdGVybmF0ZSIgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3JdKT8pPyAmICgidGV4dGNvbG9yIgorCQkvLwl0ZXh0Y29sb3I9W0NvbG9yXSk/ICYgKCJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtKT8gJiAoImJvcmRlci10b3AiIGJvcmRlclRvcD1Cb3JkZXJTdHlsZSk/ICYKKwkJLy8JKCJib3JkZXItYm90dG9tIiBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWxlZnQiIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLXJpZ2h0IgorCQkvLwlib3JkZXJSaWdodD1Cb3JkZXJTdHlsZSk/ICYgKCJwYWRkaW5nLXRvcCIgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8gJgorCQkvLwkoInBhZGRpbmctYm90dG9tIiBwYWRkaW5nQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0JvdHRvbVVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1sZWZ0IgorCQkvLwlwYWRkaW5nTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdMZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLXJpZ2h0IiBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvLwlwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi10b3AiIG1hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblRvcFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWJvdHRvbSIKKwkJLy8JbWFyZ2luQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luQm90dG9tVW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tbGVmdCIgbWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCS8vCW1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1yaWdodCIgbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPykKKwkJLy8JbWVkaWFzdHlsZXMrPU1lZGlhU3R5bGUqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJzdHlsZSIgbmFtZT1JRCAieyIgKCJleHRlbmRzIiBleHRlbmRzPVtTdHlsZV0pPyAoKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmICgiZm9udCIgZm9udD1bRm9udF0pPyAmCisJCS8vKCJiYWNrZ3JvdW5kY29sb3IiIGJhY2tncm91bmRjb2xvcj1bQ29sb3JdICgiYWx0ZXJuYXRlIiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPyk/ICYgKCJ0ZXh0Y29sb3IiCisJCS8vdGV4dGNvbG9yPVtDb2xvcl0pPyAmICgidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSk/ICYgKCJib3JkZXItdG9wIiBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmCisJCS8vKCJib3JkZXItYm90dG9tIiBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWxlZnQiIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLXJpZ2h0IgorCQkvL2JvcmRlclJpZ2h0PUJvcmRlclN0eWxlKT8gJiAoInBhZGRpbmctdG9wIiBwYWRkaW5nVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPyAmCisJCS8vKCJwYWRkaW5nLWJvdHRvbSIgcGFkZGluZ0JvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctbGVmdCIKKwkJLy9wYWRkaW5nTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdMZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLXJpZ2h0IiBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvL3BhZGRpbmdSaWdodFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLXRvcCIgbWFyZ2luVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tYm90dG9tIgorCQkvL21hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvL21hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1yaWdodCIgbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPykKKwkJLy9tZWRpYXN0eWxlcys9TWVkaWFTdHlsZSogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInN0eWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHlsZUtleXdvcmRfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vKCJleHRlbmRzIiBleHRlbmRzPVtTdHlsZV0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisKKwkJLy8iZXh0ZW5kcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0RXh0ZW5kc0tleXdvcmRfM18wKCkgeyByZXR1cm4gY0V4dGVuZHNLZXl3b3JkXzNfMDsgfQorCisJCS8vZXh0ZW5kcz1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEV4dGVuZHNBc3NpZ25tZW50XzNfMSgpIHsgcmV0dXJuIGNFeHRlbmRzQXNzaWdubWVudF8zXzE7IH0KKworCQkvL1tTdHlsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEV4dGVuZHNTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY0V4dGVuZHNTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RXh0ZW5kc1N0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzEoKSB7IHJldHVybiBjRXh0ZW5kc1N0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKworCQkvLygiZm9ybWF0dGVyIiBmb3JtYXQ9W1NvbWVGb3JtYXRdKT8gJiAoImZvbnQiIGZvbnQ9W0ZvbnRdKT8gJiAoImJhY2tncm91bmRjb2xvciIgYmFja2dyb3VuZGNvbG9yPVtDb2xvcl0gKCJhbHRlcm5hdGUiCisJCS8vYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3JdKT8pPyAmICgidGV4dGNvbG9yIiB0ZXh0Y29sb3I9W0NvbG9yXSk/ICYgKCJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtKT8gJgorCQkvLygiYm9yZGVyLXRvcCIgYm9yZGVyVG9wPUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1ib3R0b20iIGJvcmRlckJvdHRvbT1Cb3JkZXJTdHlsZSk/ICYgKCJib3JkZXItbGVmdCIKKwkJLy9ib3JkZXJMZWZ0PUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1yaWdodCIgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPyAmICgicGFkZGluZy10b3AiIHBhZGRpbmdUb3BWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvL3BhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctYm90dG9tIiBwYWRkaW5nQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0JvdHRvbVVuaXQ9VW5pdEVudW0pPyAmCisJCS8vKCJwYWRkaW5nLWxlZnQiIHBhZGRpbmdMZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0xlZnRVbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctcmlnaHQiCisJCS8vcGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tdG9wIiBtYXJnaW5Ub3BWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvL21hcmdpblRvcFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWJvdHRvbSIgbWFyZ2luQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luQm90dG9tVW5pdD1Vbml0RW51bSk/ICYKKwkJLy8oIm1hcmdpbi1sZWZ0IiBtYXJnaW5MZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luTGVmdFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLXJpZ2h0IgorCQkvL21hcmdpblJpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIFVub3JkZXJlZEdyb3VwIGdldFVub3JkZXJlZEdyb3VwXzQoKSB7IHJldHVybiBjVW5vcmRlcmVkR3JvdXBfNDsgfQorCisJCS8vKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNF8wKCkgeyByZXR1cm4gY0dyb3VwXzRfMDsgfQorCisJCS8vImZvcm1hdHRlciIKKwkJcHVibGljIEtleXdvcmQgZ2V0Rm9ybWF0dGVyS2V5d29yZF80XzBfMCgpIHsgcmV0dXJuIGNGb3JtYXR0ZXJLZXl3b3JkXzRfMF8wOyB9CisKKwkJLy9mb3JtYXQ9W1NvbWVGb3JtYXRdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEZvcm1hdEFzc2lnbm1lbnRfNF8wXzEoKSB7IHJldHVybiBjRm9ybWF0QXNzaWdubWVudF80XzBfMTsgfQorCisJCS8vW1NvbWVGb3JtYXRdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRGb3JtYXRTb21lRm9ybWF0Q3Jvc3NSZWZlcmVuY2VfNF8wXzFfMCgpIHsgcmV0dXJuIGNGb3JtYXRTb21lRm9ybWF0Q3Jvc3NSZWZlcmVuY2VfNF8wXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEZvcm1hdFNvbWVGb3JtYXRJRFRlcm1pbmFsUnVsZUNhbGxfNF8wXzFfMF8xKCkgeyByZXR1cm4gY0Zvcm1hdFNvbWVGb3JtYXRJRFRlcm1pbmFsUnVsZUNhbGxfNF8wXzFfMF8xOyB9CisKKwkJLy8oImZvbnQiIGZvbnQ9W0ZvbnRdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMSgpIHsgcmV0dXJuIGNHcm91cF80XzE7IH0KKworCQkvLyJmb250IgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb250S2V5d29yZF80XzFfMCgpIHsgcmV0dXJuIGNGb250S2V5d29yZF80XzFfMDsgfQorCisJCS8vZm9udD1bRm9udF0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9udEFzc2lnbm1lbnRfNF8xXzEoKSB7IHJldHVybiBjRm9udEFzc2lnbm1lbnRfNF8xXzE7IH0KKworCQkvL1tGb250XQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0Rm9udEZvbnRDcm9zc1JlZmVyZW5jZV80XzFfMV8wKCkgeyByZXR1cm4gY0ZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfNF8xXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEZvbnRGb250SURUZXJtaW5hbFJ1bGVDYWxsXzRfMV8xXzBfMSgpIHsgcmV0dXJuIGNGb250Rm9udElEVGVybWluYWxSdWxlQ2FsbF80XzFfMV8wXzE7IH0KKworCQkvLygiYmFja2dyb3VuZGNvbG9yIiBiYWNrZ3JvdW5kY29sb3I9W0NvbG9yXSAoImFsdGVybmF0ZSIgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3JdKT8pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNF8yKCkgeyByZXR1cm4gY0dyb3VwXzRfMjsgfQorCisJCS8vImJhY2tncm91bmRjb2xvciIKKwkJcHVibGljIEtleXdvcmQgZ2V0QmFja2dyb3VuZGNvbG9yS2V5d29yZF80XzJfMCgpIHsgcmV0dXJuIGNCYWNrZ3JvdW5kY29sb3JLZXl3b3JkXzRfMl8wOyB9CisKKwkJLy9iYWNrZ3JvdW5kY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCYWNrZ3JvdW5kY29sb3JBc3NpZ25tZW50XzRfMl8xKCkgeyByZXR1cm4gY0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfNF8yXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEJhY2tncm91bmRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfNF8yXzFfMCgpIHsgcmV0dXJuIGNCYWNrZ3JvdW5kY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfMl8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCYWNrZ3JvdW5kY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF80XzJfMV8wXzEoKSB7IHJldHVybiBjQmFja2dyb3VuZGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfNF8yXzFfMF8xOyB9CisKKwkJLy8oImFsdGVybmF0ZSIgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3JdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMl8yKCkgeyByZXR1cm4gY0dyb3VwXzRfMl8yOyB9CisKKwkJLy8iYWx0ZXJuYXRlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBbHRlcm5hdGVLZXl3b3JkXzRfMl8yXzAoKSB7IHJldHVybiBjQWx0ZXJuYXRlS2V5d29yZF80XzJfMl8wOyB9CisKKwkJLy9iYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUFzc2lnbm1lbnRfNF8yXzJfMSgpIHsgcmV0dXJuIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQXNzaWdubWVudF80XzJfMl8xOyB9CisKKwkJLy9bQ29sb3JdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV80XzJfMl8xXzAoKSB7IHJldHVybiBjQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUNvbG9yQ3Jvc3NSZWZlcmVuY2VfNF8yXzJfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzRfMl8yXzFfMF8xKCkgeyByZXR1cm4gY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVDb2xvcklEVGVybWluYWxSdWxlQ2FsbF80XzJfMl8xXzBfMTsgfQorCisJCS8vKCJ0ZXh0Y29sb3IiIHRleHRjb2xvcj1bQ29sb3JdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMygpIHsgcmV0dXJuIGNHcm91cF80XzM7IH0KKworCQkvLyJ0ZXh0Y29sb3IiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRjb2xvcktleXdvcmRfNF8zXzAoKSB7IHJldHVybiBjVGV4dGNvbG9yS2V5d29yZF80XzNfMDsgfQorCisJCS8vdGV4dGNvbG9yPVtDb2xvcl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dGNvbG9yQXNzaWdubWVudF80XzNfMSgpIHsgcmV0dXJuIGNUZXh0Y29sb3JBc3NpZ25tZW50XzRfM18xOyB9CisKKwkJLy9bQ29sb3JdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRUZXh0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzRfM18xXzAoKSB7IHJldHVybiBjVGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV80XzNfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGV4dGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfNF8zXzFfMF8xKCkgeyByZXR1cm4gY1RleHRjb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzRfM18xXzBfMTsgfQorCisJCS8vKCJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfNCgpIHsgcmV0dXJuIGNHcm91cF80XzQ7IH0KKworCQkvLyJ0ZXh0YWxpZ24iCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRhbGlnbktleXdvcmRfNF80XzAoKSB7IHJldHVybiBjVGV4dGFsaWduS2V5d29yZF80XzRfMDsgfQorCisJCS8vdGV4dGFsaWduPVRleHRBbGlnbkVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dGFsaWduQXNzaWdubWVudF80XzRfMSgpIHsgcmV0dXJuIGNUZXh0YWxpZ25Bc3NpZ25tZW50XzRfNF8xOyB9CisKKwkJLy9UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzRfNF8xXzAoKSB7IHJldHVybiBjVGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF80XzRfMV8wOyB9CisKKwkJLy8oImJvcmRlci10b3AiIGJvcmRlclRvcD1Cb3JkZXJTdHlsZSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80XzUoKSB7IHJldHVybiBjR3JvdXBfNF81OyB9CisKKwkJLy8iYm9yZGVyLXRvcCIKKwkJcHVibGljIEtleXdvcmQgZ2V0Qm9yZGVyVG9wS2V5d29yZF80XzVfMCgpIHsgcmV0dXJuIGNCb3JkZXJUb3BLZXl3b3JkXzRfNV8wOyB9CisKKwkJLy9ib3JkZXJUb3A9Qm9yZGVyU3R5bGUKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Qm9yZGVyVG9wQXNzaWdubWVudF80XzVfMSgpIHsgcmV0dXJuIGNCb3JkZXJUb3BBc3NpZ25tZW50XzRfNV8xOyB9CisKKwkJLy9Cb3JkZXJTdHlsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Qm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF80XzVfMV8wKCkgeyByZXR1cm4gY0JvcmRlclRvcEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF81XzFfMDsgfQorCisJCS8vKCJib3JkZXItYm90dG9tIiBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNF82KCkgeyByZXR1cm4gY0dyb3VwXzRfNjsgfQorCisJCS8vImJvcmRlci1ib3R0b20iCisJCXB1YmxpYyBLZXl3b3JkIGdldEJvcmRlckJvdHRvbUtleXdvcmRfNF82XzAoKSB7IHJldHVybiBjQm9yZGVyQm90dG9tS2V5d29yZF80XzZfMDsgfQorCisJCS8vYm9yZGVyQm90dG9tPUJvcmRlclN0eWxlCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJvcmRlckJvdHRvbUFzc2lnbm1lbnRfNF82XzEoKSB7IHJldHVybiBjQm9yZGVyQm90dG9tQXNzaWdubWVudF80XzZfMTsgfQorCisJCS8vQm9yZGVyU3R5bGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJvcmRlckJvdHRvbUJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF82XzFfMCgpIHsgcmV0dXJuIGNCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzRfNl8xXzA7IH0KKworCQkvLygiYm9yZGVyLWxlZnQiIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNF83KCkgeyByZXR1cm4gY0dyb3VwXzRfNzsgfQorCisJCS8vImJvcmRlci1sZWZ0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRCb3JkZXJMZWZ0S2V5d29yZF80XzdfMCgpIHsgcmV0dXJuIGNCb3JkZXJMZWZ0S2V5d29yZF80XzdfMDsgfQorCisJCS8vYm9yZGVyTGVmdD1Cb3JkZXJTdHlsZQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCb3JkZXJMZWZ0QXNzaWdubWVudF80XzdfMSgpIHsgcmV0dXJuIGNCb3JkZXJMZWZ0QXNzaWdubWVudF80XzdfMTsgfQorCisJCS8vQm9yZGVyU3R5bGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJvcmRlckxlZnRCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzRfN18xXzAoKSB7IHJldHVybiBjQm9yZGVyTGVmdEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF83XzFfMDsgfQorCisJCS8vKCJib3JkZXItcmlnaHQiIGJvcmRlclJpZ2h0PUJvcmRlclN0eWxlKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfOCgpIHsgcmV0dXJuIGNHcm91cF80Xzg7IH0KKworCQkvLyJib3JkZXItcmlnaHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEJvcmRlclJpZ2h0S2V5d29yZF80XzhfMCgpIHsgcmV0dXJuIGNCb3JkZXJSaWdodEtleXdvcmRfNF84XzA7IH0KKworCQkvL2JvcmRlclJpZ2h0PUJvcmRlclN0eWxlCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJvcmRlclJpZ2h0QXNzaWdubWVudF80XzhfMSgpIHsgcmV0dXJuIGNCb3JkZXJSaWdodEFzc2lnbm1lbnRfNF84XzE7IH0KKworCQkvL0JvcmRlclN0eWxlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCb3JkZXJSaWdodEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF84XzFfMCgpIHsgcmV0dXJuIGNCb3JkZXJSaWdodEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfNF84XzFfMDsgfQorCisJCS8vKCJwYWRkaW5nLXRvcCIgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfOSgpIHsgcmV0dXJuIGNHcm91cF80Xzk7IH0KKworCQkvLyJwYWRkaW5nLXRvcCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UGFkZGluZ1RvcEtleXdvcmRfNF85XzAoKSB7IHJldHVybiBjUGFkZGluZ1RvcEtleXdvcmRfNF85XzA7IH0KKworCQkvL3BhZGRpbmdUb3BWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWRkaW5nVG9wVmFsdWVBc3NpZ25tZW50XzRfOV8xKCkgeyByZXR1cm4gY1BhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfNF85XzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfOV8xXzAoKSB7IHJldHVybiBjUGFkZGluZ1RvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzlfMV8wOyB9CisKKwkJLy9wYWRkaW5nVG9wVW5pdD1Vbml0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfNF85XzIoKSB7IHJldHVybiBjUGFkZGluZ1RvcFVuaXRBc3NpZ25tZW50XzRfOV8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFkZGluZ1RvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzlfMl8wKCkgeyByZXR1cm4gY1BhZGRpbmdUb3BVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF85XzJfMDsgfQorCisJCS8vKCJwYWRkaW5nLWJvdHRvbSIgcGFkZGluZ0JvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMTAoKSB7IHJldHVybiBjR3JvdXBfNF8xMDsgfQorCisJCS8vInBhZGRpbmctYm90dG9tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWRkaW5nQm90dG9tS2V5d29yZF80XzEwXzAoKSB7IHJldHVybiBjUGFkZGluZ0JvdHRvbUtleXdvcmRfNF8xMF8wOyB9CisKKwkJLy9wYWRkaW5nQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFkZGluZ0JvdHRvbVZhbHVlQXNzaWdubWVudF80XzEwXzEoKSB7IHJldHVybiBjUGFkZGluZ0JvdHRvbVZhbHVlQXNzaWdubWVudF80XzEwXzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nQm90dG9tVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTBfMV8wKCkgeyByZXR1cm4gY1BhZGRpbmdCb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xMF8xXzA7IH0KKworCQkvL3BhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdCb3R0b21Vbml0QXNzaWdubWVudF80XzEwXzIoKSB7IHJldHVybiBjUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTBfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZGRpbmdCb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMF8yXzAoKSB7IHJldHVybiBjUGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEwXzJfMDsgfQorCisJCS8vKCJwYWRkaW5nLWxlZnQiIHBhZGRpbmdMZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0xlZnRVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMTEoKSB7IHJldHVybiBjR3JvdXBfNF8xMTsgfQorCisJCS8vInBhZGRpbmctbGVmdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UGFkZGluZ0xlZnRLZXl3b3JkXzRfMTFfMCgpIHsgcmV0dXJuIGNQYWRkaW5nTGVmdEtleXdvcmRfNF8xMV8wOyB9CisKKwkJLy9wYWRkaW5nTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzRfMTFfMSgpIHsgcmV0dXJuIGNQYWRkaW5nTGVmdFZhbHVlQXNzaWdubWVudF80XzExXzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nTGVmdFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzExXzFfMCgpIHsgcmV0dXJuIGNQYWRkaW5nTGVmdFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzExXzFfMDsgfQorCisJCS8vcGFkZGluZ0xlZnRVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdMZWZ0VW5pdEFzc2lnbm1lbnRfNF8xMV8yKCkgeyByZXR1cm4gY1BhZGRpbmdMZWZ0VW5pdEFzc2lnbm1lbnRfNF8xMV8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFkZGluZ0xlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMV8yXzAoKSB7IHJldHVybiBjUGFkZGluZ0xlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xMV8yXzA7IH0KKworCQkvLygicGFkZGluZy1yaWdodCIgcGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80XzEyKCkgeyByZXR1cm4gY0dyb3VwXzRfMTI7IH0KKworCQkvLyJwYWRkaW5nLXJpZ2h0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWRkaW5nUmlnaHRLZXl3b3JkXzRfMTJfMCgpIHsgcmV0dXJuIGNQYWRkaW5nUmlnaHRLZXl3b3JkXzRfMTJfMDsgfQorCisJCS8vcGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFkZGluZ1JpZ2h0VmFsdWVBc3NpZ25tZW50XzRfMTJfMSgpIHsgcmV0dXJuIGNQYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xMl8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFkZGluZ1JpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTJfMV8wKCkgeyByZXR1cm4gY1BhZGRpbmdSaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzEyXzFfMDsgfQorCisJCS8vcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWRkaW5nUmlnaHRVbml0QXNzaWdubWVudF80XzEyXzIoKSB7IHJldHVybiBjUGFkZGluZ1JpZ2h0VW5pdEFzc2lnbm1lbnRfNF8xMl8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFkZGluZ1JpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTJfMl8wKCkgeyByZXR1cm4gY1BhZGRpbmdSaWdodFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzEyXzJfMDsgfQorCisJCS8vKCJtYXJnaW4tdG9wIiBtYXJnaW5Ub3BWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Ub3BVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzRfMTMoKSB7IHJldHVybiBjR3JvdXBfNF8xMzsgfQorCisJCS8vIm1hcmdpbi10b3AiCisJCXB1YmxpYyBLZXl3b3JkIGdldE1hcmdpblRvcEtleXdvcmRfNF8xM18wKCkgeyByZXR1cm4gY01hcmdpblRvcEtleXdvcmRfNF8xM18wOyB9CisKKwkJLy9tYXJnaW5Ub3BWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJnaW5Ub3BWYWx1ZUFzc2lnbm1lbnRfNF8xM18xKCkgeyByZXR1cm4gY01hcmdpblRvcFZhbHVlQXNzaWdubWVudF80XzEzXzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXJnaW5Ub3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xM18xXzAoKSB7IHJldHVybiBjTWFyZ2luVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTNfMV8wOyB9CisKKwkJLy9tYXJnaW5Ub3BVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpblRvcFVuaXRBc3NpZ25tZW50XzRfMTNfMigpIHsgcmV0dXJuIGNNYXJnaW5Ub3BVbml0QXNzaWdubWVudF80XzEzXzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXJnaW5Ub3BVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xM18yXzAoKSB7IHJldHVybiBjTWFyZ2luVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTNfMl8wOyB9CisKKwkJLy8oIm1hcmdpbi1ib3R0b20iIG1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNF8xNCgpIHsgcmV0dXJuIGNHcm91cF80XzE0OyB9CisKKwkJLy8ibWFyZ2luLWJvdHRvbSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFyZ2luQm90dG9tS2V5d29yZF80XzE0XzAoKSB7IHJldHVybiBjTWFyZ2luQm90dG9tS2V5d29yZF80XzE0XzA7IH0KKworCQkvL21hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpbkJvdHRvbVZhbHVlQXNzaWdubWVudF80XzE0XzEoKSB7IHJldHVybiBjTWFyZ2luQm90dG9tVmFsdWVBc3NpZ25tZW50XzRfMTRfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE0XzFfMCgpIHsgcmV0dXJuIGNNYXJnaW5Cb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNF8xXzA7IH0KKworCQkvL21hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFyZ2luQm90dG9tVW5pdEFzc2lnbm1lbnRfNF8xNF8yKCkgeyByZXR1cm4gY01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzRfMTRfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpbkJvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF80XzE0XzJfMCgpIHsgcmV0dXJuIGNNYXJnaW5Cb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNF8yXzA7IH0KKworCQkvLygibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5MZWZ0VW5pdD1Vbml0RW51bSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80XzE1KCkgeyByZXR1cm4gY0dyb3VwXzRfMTU7IH0KKworCQkvLyJtYXJnaW4tbGVmdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFyZ2luTGVmdEtleXdvcmRfNF8xNV8wKCkgeyByZXR1cm4gY01hcmdpbkxlZnRLZXl3b3JkXzRfMTVfMDsgfQorCisJCS8vbWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xNV8xKCkgeyByZXR1cm4gY01hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfNF8xNV8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TWFyZ2luTGVmdFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF80XzE1XzFfMCgpIHsgcmV0dXJuIGNNYXJnaW5MZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzRfMTVfMV8wOyB9CisKKwkJLy9tYXJnaW5MZWZ0VW5pdD1Vbml0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfNF8xNV8yKCkgeyByZXR1cm4gY01hcmdpbkxlZnRVbml0QXNzaWdubWVudF80XzE1XzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXJnaW5MZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTVfMl8wKCkgeyByZXR1cm4gY01hcmdpbkxlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNF8xNV8yXzA7IH0KKworCQkvLygibWFyZ2luLXJpZ2h0IiBtYXJnaW5SaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblJpZ2h0VW5pdD1Vbml0RW51bSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80XzE2KCkgeyByZXR1cm4gY0dyb3VwXzRfMTY7IH0KKworCQkvLyJtYXJnaW4tcmlnaHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldE1hcmdpblJpZ2h0S2V5d29yZF80XzE2XzAoKSB7IHJldHVybiBjTWFyZ2luUmlnaHRLZXl3b3JkXzRfMTZfMDsgfQorCisJCS8vbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJnaW5SaWdodFZhbHVlQXNzaWdubWVudF80XzE2XzEoKSB7IHJldHVybiBjTWFyZ2luUmlnaHRWYWx1ZUFzc2lnbm1lbnRfNF8xNl8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TWFyZ2luUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNl8xXzAoKSB7IHJldHVybiBjTWFyZ2luUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNF8xNl8xXzA7IH0KKworCQkvL21hcmdpblJpZ2h0VW5pdD1Vbml0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJnaW5SaWdodFVuaXRBc3NpZ25tZW50XzRfMTZfMigpIHsgcmV0dXJuIGNNYXJnaW5SaWdodFVuaXRBc3NpZ25tZW50XzRfMTZfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpblJpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTZfMl8wKCkgeyByZXR1cm4gY01hcmdpblJpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzRfMTZfMl8wOyB9CisKKwkJLy9tZWRpYXN0eWxlcys9TWVkaWFTdHlsZSoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWVkaWFzdHlsZXNBc3NpZ25tZW50XzUoKSB7IHJldHVybiBjTWVkaWFzdHlsZXNBc3NpZ25tZW50XzU7IH0KKworCQkvL01lZGlhU3R5bGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1lZGlhc3R5bGVzTWVkaWFTdHlsZVBhcnNlclJ1bGVDYWxsXzVfMCgpIHsgcmV0dXJuIGNNZWRpYXN0eWxlc01lZGlhU3R5bGVQYXJzZXJSdWxlQ2FsbF81XzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNjsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBNZWRpYVN0eWxlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIk1lZGlhU3R5bGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWVkaWFLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01lZGlhQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjTWVkaWFNZWRpYUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljTWVkaWFBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNZWRpYU1lZGlhSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xID0gKFJ1bGVDYWxsKWNNZWRpYU1lZGlhQ3Jvc3NSZWZlcmVuY2VfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXBfMyA9IChVbm9yZGVyZWRHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zvcm1hdHRlcktleXdvcmRfM18wXzAgPSAoS2V5d29yZCljR3JvdXBfM18wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb3JtYXRBc3NpZ25tZW50XzNfMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0Zvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNGb3JtYXRBc3NpZ25tZW50XzNfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9ybWF0U29tZUZvcm1hdElEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzEgPSAoUnVsZUNhbGwpY0Zvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18xID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGb250S2V5d29yZF8zXzFfMCA9IChLZXl3b3JkKWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZvbnRBc3NpZ25tZW50XzNfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0ZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfM18xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRm9udEFzc2lnbm1lbnRfM18xXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb250Rm9udElEVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wXzEgPSAoUnVsZUNhbGwpY0ZvbnRGb250Q3Jvc3NSZWZlcmVuY2VfM18xXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQmFja2dyb3VuZGNvbG9yS2V5d29yZF8zXzJfMCA9IChLZXl3b3JkKWNHcm91cF8zXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfM18yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQmFja2dyb3VuZGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNCYWNrZ3JvdW5kY29sb3JBc3NpZ25tZW50XzNfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmFja2dyb3VuZGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18yXzFfMF8xID0gKFJ1bGVDYWxsKWNCYWNrZ3JvdW5kY29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzNfMl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzJfMiA9IChHcm91cCljR3JvdXBfM18yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBbHRlcm5hdGVLZXl3b3JkXzNfMl8yXzAgPSAoS2V5d29yZCljR3JvdXBfM18yXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzNfMl8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18yXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMl8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzNfMl8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18yXzJfMV8wXzEgPSAoUnVsZUNhbGwpY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVDb2xvckNyb3NzUmVmZXJlbmNlXzNfMl8yXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMyA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGV4dGNvbG9yS2V5d29yZF8zXzNfMCA9IChLZXl3b3JkKWNHcm91cF8zXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRjb2xvckFzc2lnbm1lbnRfM18zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVGV4dGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzNfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNUZXh0Y29sb3JBc3NpZ25tZW50XzNfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18zXzFfMF8xID0gKFJ1bGVDYWxsKWNUZXh0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzNfM18xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzQgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RleHRhbGlnbktleXdvcmRfM180XzAgPSAoS2V5d29yZCljR3JvdXBfM180LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0YWxpZ25Bc3NpZ25tZW50XzNfNF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfNC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfM180XzFfMCA9IChSdWxlQ2FsbCljVGV4dGFsaWduQXNzaWdubWVudF8zXzRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfNSA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQm9yZGVyVG9wS2V5d29yZF8zXzVfMCA9IChLZXl3b3JkKWNHcm91cF8zXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvcmRlclRvcEFzc2lnbm1lbnRfM181XzEgPSAoQXNzaWdubWVudCljR3JvdXBfM181LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzVfMV8wID0gKFJ1bGVDYWxsKWNCb3JkZXJUb3BBc3NpZ25tZW50XzNfNV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM182ID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCb3JkZXJCb3R0b21LZXl3b3JkXzNfNl8wID0gKEtleXdvcmQpY0dyb3VwXzNfNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQm9yZGVyQm90dG9tQXNzaWdubWVudF8zXzZfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzYuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCb3JkZXJCb3R0b21Cb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfNl8xXzAgPSAoUnVsZUNhbGwpY0JvcmRlckJvdHRvbUFzc2lnbm1lbnRfM182XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzcgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JvcmRlckxlZnRLZXl3b3JkXzNfN18wID0gKEtleXdvcmQpY0dyb3VwXzNfNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQm9yZGVyTGVmdEFzc2lnbm1lbnRfM183XzEgPSAoQXNzaWdubWVudCljR3JvdXBfM183LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQm9yZGVyTGVmdEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM183XzFfMCA9IChSdWxlQ2FsbCljQm9yZGVyTGVmdEFzc2lnbm1lbnRfM183XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzggPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JvcmRlclJpZ2h0S2V5d29yZF8zXzhfMCA9IChLZXl3b3JkKWNHcm91cF8zXzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JvcmRlclJpZ2h0QXNzaWdubWVudF8zXzhfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzguZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCb3JkZXJSaWdodEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM184XzFfMCA9IChSdWxlQ2FsbCljQm9yZGVyUmlnaHRBc3NpZ25tZW50XzNfOF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM185ID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCg5KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nVG9wS2V5d29yZF8zXzlfMCA9IChLZXl3b3JkKWNHcm91cF8zXzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfM185XzEgPSAoQXNzaWdubWVudCljR3JvdXBfM185LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1RvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzlfMV8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nVG9wVmFsdWVBc3NpZ25tZW50XzNfOV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfM185XzIgPSAoQXNzaWdubWVudCljR3JvdXBfM185LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1RvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzlfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfM185XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzEwID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgxMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGFkZGluZ0JvdHRvbUtleXdvcmRfM18xMF8wID0gKEtleXdvcmQpY0dyb3VwXzNfMTAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdCb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMTAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWRkaW5nQm90dG9tVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTBfMV8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTBfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTBfMiA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzEwXzJfMCA9IChSdWxlQ2FsbCljUGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMTEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDExKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nTGVmdEtleXdvcmRfM18xMV8wID0gKEtleXdvcmQpY0dyb3VwXzNfMTEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzNfMTFfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzExLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ0xlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMV8xXzAgPSAoUnVsZUNhbGwpY1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzNfMTFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF8zXzExXzIgPSAoQXNzaWdubWVudCljR3JvdXBfM18xMS5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BhZGRpbmdMZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTFfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nTGVmdFVuaXRBc3NpZ25tZW50XzNfMTFfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMTIgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWRkaW5nUmlnaHRLZXl3b3JkXzNfMTJfMCA9IChLZXl3b3JkKWNHcm91cF8zXzEyLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfM18xMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMTIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWRkaW5nUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMl8xXzAgPSAoUnVsZUNhbGwpY1BhZGRpbmdSaWdodFZhbHVlQXNzaWdubWVudF8zXzEyXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BhZGRpbmdSaWdodFVuaXRBc3NpZ25tZW50XzNfMTJfMiA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEyLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFkZGluZ1JpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTJfMl8wID0gKFJ1bGVDYWxsKWNQYWRkaW5nUmlnaHRVbml0QXNzaWdubWVudF8zXzEyXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzEzID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgxMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWFyZ2luVG9wS2V5d29yZF8zXzEzXzAgPSAoS2V5d29yZCljR3JvdXBfM18xMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luVG9wVmFsdWVBc3NpZ25tZW50XzNfMTNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWFyZ2luVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTNfMV8wID0gKFJ1bGVDYWxsKWNNYXJnaW5Ub3BWYWx1ZUFzc2lnbm1lbnRfM18xM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5Ub3BVbml0QXNzaWdubWVudF8zXzEzXzIgPSAoQXNzaWdubWVudCljR3JvdXBfM18xMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpblRvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzEzXzJfMCA9IChSdWxlQ2FsbCljTWFyZ2luVG9wVW5pdEFzc2lnbm1lbnRfM18xM18yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18xNCA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMTQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01hcmdpbkJvdHRvbUtleXdvcmRfM18xNF8wID0gKEtleXdvcmQpY0dyb3VwXzNfMTQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01hcmdpbkJvdHRvbVZhbHVlQXNzaWdubWVudF8zXzE0XzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18xNC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE0XzFfMCA9IChSdWxlQ2FsbCljTWFyZ2luQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luQm90dG9tVW5pdEFzc2lnbm1lbnRfM18xNF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMTQuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5Cb3R0b21Vbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xNF8yXzAgPSAoUnVsZUNhbGwpY01hcmdpbkJvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMTUgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDE1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNYXJnaW5MZWZ0S2V5d29yZF8zXzE1XzAgPSAoS2V5d29yZCljR3JvdXBfM18xNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF8zXzE1XzEgPSAoQXNzaWdubWVudCljR3JvdXBfM18xNS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01hcmdpbkxlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xNV8xXzAgPSAoUnVsZUNhbGwpY01hcmdpbkxlZnRWYWx1ZUFzc2lnbm1lbnRfM18xNV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfM18xNV8yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMTUuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5MZWZ0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTVfMl8wID0gKFJ1bGVDYWxsKWNNYXJnaW5MZWZ0VW5pdEFzc2lnbm1lbnRfM18xNV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfM18xNiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMTYpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01hcmdpblJpZ2h0S2V5d29yZF8zXzE2XzAgPSAoS2V5d29yZCljR3JvdXBfM18xNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWFyZ2luUmlnaHRWYWx1ZUFzc2lnbm1lbnRfM18xNl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMTYuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXJnaW5SaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE2XzFfMCA9IChSdWxlQ2FsbCljTWFyZ2luUmlnaHRWYWx1ZUFzc2lnbm1lbnRfM18xNl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXJnaW5SaWdodFVuaXRBc3NpZ25tZW50XzNfMTZfMiA9IChBc3NpZ25tZW50KWNHcm91cF8zXzE2LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWFyZ2luUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xNl8yXzAgPSAoUnVsZUNhbGwpY01hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfM18xNl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvL01lZGlhU3R5bGU6CisJCS8vCSJtZWRpYSIgbWVkaWE9W01lZGlhXSAieyIgKCgiZm9ybWF0dGVyIiBmb3JtYXQ9W1NvbWVGb3JtYXRdKT8gJiAoImZvbnQiIGZvbnQ9W0ZvbnRdKT8gJiAoImJhY2tncm91bmRjb2xvciIKKwkJLy8JYmFja2dyb3VuZGNvbG9yPVtDb2xvcl0gKCJhbHRlcm5hdGUiIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU9W0NvbG9yXSk/KT8gJiAoInRleHRjb2xvciIgdGV4dGNvbG9yPVtDb2xvcl0pPyAmCisJCS8vCSgidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSk/ICYgKCJib3JkZXItdG9wIiBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWJvdHRvbSIKKwkJLy8JYm9yZGVyQm90dG9tPUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1sZWZ0IiBib3JkZXJMZWZ0PUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1yaWdodCIgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPyAmCisJCS8vCSgicGFkZGluZy10b3AiIHBhZGRpbmdUb3BWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nVG9wVW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLWJvdHRvbSIKKwkJLy8JcGFkZGluZ0JvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctbGVmdCIgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvLwlwYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1yaWdodCIgcGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bSk/ICYKKwkJLy8JKCJtYXJnaW4tdG9wIiBtYXJnaW5Ub3BWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Ub3BVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1ib3R0b20iCisJCS8vCW1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQkvLwltYXJnaW5MZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tcmlnaHQiIG1hcmdpblJpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtKT8pICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJtZWRpYSIgbWVkaWE9W01lZGlhXSAieyIgKCgiZm9ybWF0dGVyIiBmb3JtYXQ9W1NvbWVGb3JtYXRdKT8gJiAoImZvbnQiIGZvbnQ9W0ZvbnRdKT8gJiAoImJhY2tncm91bmRjb2xvciIKKwkJLy9iYWNrZ3JvdW5kY29sb3I9W0NvbG9yXSAoImFsdGVybmF0ZSIgYmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZT1bQ29sb3JdKT8pPyAmICgidGV4dGNvbG9yIiB0ZXh0Y29sb3I9W0NvbG9yXSk/ICYKKwkJLy8oInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0pPyAmICgiYm9yZGVyLXRvcCIgYm9yZGVyVG9wPUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1ib3R0b20iCisJCS8vYm9yZGVyQm90dG9tPUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1sZWZ0IiBib3JkZXJMZWZ0PUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1yaWdodCIgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPyAmCisJCS8vKCJwYWRkaW5nLXRvcCIgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctYm90dG9tIgorCQkvL3BhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nQm90dG9tVW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLWxlZnQiIHBhZGRpbmdMZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJLy9wYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1yaWdodCIgcGFkZGluZ1JpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1JpZ2h0VW5pdD1Vbml0RW51bSk/ICYKKwkJLy8oIm1hcmdpbi10b3AiIG1hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblRvcFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWJvdHRvbSIKKwkJLy9tYXJnaW5Cb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Cb3R0b21Vbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1sZWZ0IiBtYXJnaW5MZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJLy9tYXJnaW5MZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tcmlnaHQiIG1hcmdpblJpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtKT8pICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJtZWRpYSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWVkaWFLZXl3b3JkXzAoKSB7IHJldHVybiBjTWVkaWFLZXl3b3JkXzA7IH0KKworCQkvL21lZGlhPVtNZWRpYV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWVkaWFBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjTWVkaWFBc3NpZ25tZW50XzE7IH0KKworCQkvL1tNZWRpYV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldE1lZGlhTWVkaWFDcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjTWVkaWFNZWRpYUNyb3NzUmVmZXJlbmNlXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1lZGlhTWVkaWFJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSB7IHJldHVybiBjTWVkaWFNZWRpYUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmICgiZm9udCIgZm9udD1bRm9udF0pPyAmICgiYmFja2dyb3VuZGNvbG9yIiBiYWNrZ3JvdW5kY29sb3I9W0NvbG9yXSAoImFsdGVybmF0ZSIKKwkJLy9iYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPyk/ICYgKCJ0ZXh0Y29sb3IiIHRleHRjb2xvcj1bQ29sb3JdKT8gJiAoInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0pPyAmCisJCS8vKCJib3JkZXItdG9wIiBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWJvdHRvbSIgYm9yZGVyQm90dG9tPUJvcmRlclN0eWxlKT8gJiAoImJvcmRlci1sZWZ0IgorCQkvL2JvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLXJpZ2h0IiBib3JkZXJSaWdodD1Cb3JkZXJTdHlsZSk/ICYgKCJwYWRkaW5nLXRvcCIgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCS8vcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1ib3R0b20iIHBhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nQm90dG9tVW5pdD1Vbml0RW51bSk/ICYKKwkJLy8oInBhZGRpbmctbGVmdCIgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1yaWdodCIKKwkJLy9wYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi10b3AiIG1hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCS8vbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tYm90dG9tIiBtYXJnaW5Cb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5Cb3R0b21Vbml0PVVuaXRFbnVtKT8gJgorCQkvLygibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5MZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tcmlnaHQiCisJCS8vbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgVW5vcmRlcmVkR3JvdXAgZ2V0VW5vcmRlcmVkR3JvdXBfMygpIHsgcmV0dXJuIGNVbm9yZGVyZWRHcm91cF8zOyB9CisKKwkJLy8oImZvcm1hdHRlciIgZm9ybWF0PVtTb21lRm9ybWF0XSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzAoKSB7IHJldHVybiBjR3JvdXBfM18wOyB9CisKKwkJLy8iZm9ybWF0dGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb3JtYXR0ZXJLZXl3b3JkXzNfMF8wKCkgeyByZXR1cm4gY0Zvcm1hdHRlcktleXdvcmRfM18wXzA7IH0KKworCQkvL2Zvcm1hdD1bU29tZUZvcm1hdF0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9ybWF0QXNzaWdubWVudF8zXzBfMSgpIHsgcmV0dXJuIGNGb3JtYXRBc3NpZ25tZW50XzNfMF8xOyB9CisKKwkJLy9bU29tZUZvcm1hdF0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEZvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wKCkgeyByZXR1cm4gY0Zvcm1hdFNvbWVGb3JtYXRDcm9zc1JlZmVyZW5jZV8zXzBfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9ybWF0U29tZUZvcm1hdElEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzEoKSB7IHJldHVybiBjRm9ybWF0U29tZUZvcm1hdElEVGVybWluYWxSdWxlQ2FsbF8zXzBfMV8wXzE7IH0KKworCQkvLygiZm9udCIgZm9udD1bRm9udF0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18xKCkgeyByZXR1cm4gY0dyb3VwXzNfMTsgfQorCisJCS8vImZvbnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEZvbnRLZXl3b3JkXzNfMV8wKCkgeyByZXR1cm4gY0ZvbnRLZXl3b3JkXzNfMV8wOyB9CisKKwkJLy9mb250PVtGb250XQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGb250QXNzaWdubWVudF8zXzFfMSgpIHsgcmV0dXJuIGNGb250QXNzaWdubWVudF8zXzFfMTsgfQorCisJCS8vW0ZvbnRdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRGb250Rm9udENyb3NzUmVmZXJlbmNlXzNfMV8xXzAoKSB7IHJldHVybiBjRm9udEZvbnRDcm9zc1JlZmVyZW5jZV8zXzFfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9udEZvbnRJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzFfMF8xKCkgeyByZXR1cm4gY0ZvbnRGb250SURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8xXzBfMTsgfQorCisJCS8vKCJiYWNrZ3JvdW5kY29sb3IiIGJhY2tncm91bmRjb2xvcj1bQ29sb3JdICgiYWx0ZXJuYXRlIiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzIoKSB7IHJldHVybiBjR3JvdXBfM18yOyB9CisKKwkJLy8iYmFja2dyb3VuZGNvbG9yIgorCQlwdWJsaWMgS2V5d29yZCBnZXRCYWNrZ3JvdW5kY29sb3JLZXl3b3JkXzNfMl8wKCkgeyByZXR1cm4gY0JhY2tncm91bmRjb2xvcktleXdvcmRfM18yXzA7IH0KKworCQkvL2JhY2tncm91bmRjb2xvcj1bQ29sb3JdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJhY2tncm91bmRjb2xvckFzc2lnbm1lbnRfM18yXzEoKSB7IHJldHVybiBjQmFja2dyb3VuZGNvbG9yQXNzaWdubWVudF8zXzJfMTsgfQorCisJCS8vW0NvbG9yXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0QmFja2dyb3VuZGNvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMV8wKCkgeyByZXR1cm4gY0JhY2tncm91bmRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18yXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJhY2tncm91bmRjb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzNfMl8xXzBfMSgpIHsgcmV0dXJuIGNCYWNrZ3JvdW5kY29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wXzE7IH0KKworCQkvLygiYWx0ZXJuYXRlIiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18yXzIoKSB7IHJldHVybiBjR3JvdXBfM18yXzI7IH0KKworCQkvLyJhbHRlcm5hdGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFsdGVybmF0ZUtleXdvcmRfM18yXzJfMCgpIHsgcmV0dXJuIGNBbHRlcm5hdGVLZXl3b3JkXzNfMl8yXzA7IH0KKworCQkvL2JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQXNzaWdubWVudF8zXzJfMl8xKCkgeyByZXR1cm4gY0JhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVBc3NpZ25tZW50XzNfMl8yXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGVDb2xvckNyb3NzUmVmZXJlbmNlXzNfMl8yXzFfMCgpIHsgcmV0dXJuIGNCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JDcm9zc1JlZmVyZW5jZV8zXzJfMl8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18yXzJfMV8wXzEoKSB7IHJldHVybiBjQmFja2dyb3VuZGNvbG9yX2FsdGVybmF0ZUNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzNfMl8yXzFfMF8xOyB9CisKKwkJLy8oInRleHRjb2xvciIgdGV4dGNvbG9yPVtDb2xvcl0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18zKCkgeyByZXR1cm4gY0dyb3VwXzNfMzsgfQorCisJCS8vInRleHRjb2xvciIKKwkJcHVibGljIEtleXdvcmQgZ2V0VGV4dGNvbG9yS2V5d29yZF8zXzNfMCgpIHsgcmV0dXJuIGNUZXh0Y29sb3JLZXl3b3JkXzNfM18wOyB9CisKKwkJLy90ZXh0Y29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0Y29sb3JBc3NpZ25tZW50XzNfM18xKCkgeyByZXR1cm4gY1RleHRjb2xvckFzc2lnbm1lbnRfM18zXzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFRleHRjb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfM18zXzFfMCgpIHsgcmV0dXJuIGNUZXh0Y29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzNfM18xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0Y29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8zXzNfMV8wXzEoKSB7IHJldHVybiBjVGV4dGNvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfM18zXzFfMF8xOyB9CisKKwkJLy8oInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM180KCkgeyByZXR1cm4gY0dyb3VwXzNfNDsgfQorCisJCS8vInRleHRhbGlnbiIKKwkJcHVibGljIEtleXdvcmQgZ2V0VGV4dGFsaWduS2V5d29yZF8zXzRfMCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25LZXl3b3JkXzNfNF8wOyB9CisKKwkJLy90ZXh0YWxpZ249VGV4dEFsaWduRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzNfNF8xKCkgeyByZXR1cm4gY1RleHRhbGlnbkFzc2lnbm1lbnRfM180XzE7IH0KKworCQkvL1RleHRBbGlnbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfM180XzFfMCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzNfNF8xXzA7IH0KKworCQkvLygiYm9yZGVyLXRvcCIgYm9yZGVyVG9wPUJvcmRlclN0eWxlKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfNSgpIHsgcmV0dXJuIGNHcm91cF8zXzU7IH0KKworCQkvLyJib3JkZXItdG9wIgorCQlwdWJsaWMgS2V5d29yZCBnZXRCb3JkZXJUb3BLZXl3b3JkXzNfNV8wKCkgeyByZXR1cm4gY0JvcmRlclRvcEtleXdvcmRfM181XzA7IH0KKworCQkvL2JvcmRlclRvcD1Cb3JkZXJTdHlsZQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCb3JkZXJUb3BBc3NpZ25tZW50XzNfNV8xKCkgeyByZXR1cm4gY0JvcmRlclRvcEFzc2lnbm1lbnRfM181XzE7IH0KKworCQkvL0JvcmRlclN0eWxlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCb3JkZXJUb3BCb3JkZXJTdHlsZVBhcnNlclJ1bGVDYWxsXzNfNV8xXzAoKSB7IHJldHVybiBjQm9yZGVyVG9wQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzVfMV8wOyB9CisKKwkJLy8oImJvcmRlci1ib3R0b20iIGJvcmRlckJvdHRvbT1Cb3JkZXJTdHlsZSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzYoKSB7IHJldHVybiBjR3JvdXBfM182OyB9CisKKwkJLy8iYm9yZGVyLWJvdHRvbSIKKwkJcHVibGljIEtleXdvcmQgZ2V0Qm9yZGVyQm90dG9tS2V5d29yZF8zXzZfMCgpIHsgcmV0dXJuIGNCb3JkZXJCb3R0b21LZXl3b3JkXzNfNl8wOyB9CisKKwkJLy9ib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Qm9yZGVyQm90dG9tQXNzaWdubWVudF8zXzZfMSgpIHsgcmV0dXJuIGNCb3JkZXJCb3R0b21Bc3NpZ25tZW50XzNfNl8xOyB9CisKKwkJLy9Cb3JkZXJTdHlsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Qm9yZGVyQm90dG9tQm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzZfMV8wKCkgeyByZXR1cm4gY0JvcmRlckJvdHRvbUJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM182XzFfMDsgfQorCisJCS8vKCJib3JkZXItbGVmdCIgYm9yZGVyTGVmdD1Cb3JkZXJTdHlsZSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzcoKSB7IHJldHVybiBjR3JvdXBfM183OyB9CisKKwkJLy8iYm9yZGVyLWxlZnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEJvcmRlckxlZnRLZXl3b3JkXzNfN18wKCkgeyByZXR1cm4gY0JvcmRlckxlZnRLZXl3b3JkXzNfN18wOyB9CisKKwkJLy9ib3JkZXJMZWZ0PUJvcmRlclN0eWxlCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJvcmRlckxlZnRBc3NpZ25tZW50XzNfN18xKCkgeyByZXR1cm4gY0JvcmRlckxlZnRBc3NpZ25tZW50XzNfN18xOyB9CisKKwkJLy9Cb3JkZXJTdHlsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Qm9yZGVyTGVmdEJvcmRlclN0eWxlUGFyc2VyUnVsZUNhbGxfM183XzFfMCgpIHsgcmV0dXJuIGNCb3JkZXJMZWZ0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzdfMV8wOyB9CisKKwkJLy8oImJvcmRlci1yaWdodCIgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM184KCkgeyByZXR1cm4gY0dyb3VwXzNfODsgfQorCisJCS8vImJvcmRlci1yaWdodCIKKwkJcHVibGljIEtleXdvcmQgZ2V0Qm9yZGVyUmlnaHRLZXl3b3JkXzNfOF8wKCkgeyByZXR1cm4gY0JvcmRlclJpZ2h0S2V5d29yZF8zXzhfMDsgfQorCisJCS8vYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Qm9yZGVyUmlnaHRBc3NpZ25tZW50XzNfOF8xKCkgeyByZXR1cm4gY0JvcmRlclJpZ2h0QXNzaWdubWVudF8zXzhfMTsgfQorCisJCS8vQm9yZGVyU3R5bGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJvcmRlclJpZ2h0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzhfMV8wKCkgeyByZXR1cm4gY0JvcmRlclJpZ2h0Qm9yZGVyU3R5bGVQYXJzZXJSdWxlQ2FsbF8zXzhfMV8wOyB9CisKKwkJLy8oInBhZGRpbmctdG9wIiBwYWRkaW5nVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM185KCkgeyByZXR1cm4gY0dyb3VwXzNfOTsgfQorCisJCS8vInBhZGRpbmctdG9wIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWRkaW5nVG9wS2V5d29yZF8zXzlfMCgpIHsgcmV0dXJuIGNQYWRkaW5nVG9wS2V5d29yZF8zXzlfMDsgfQorCisJCS8vcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdUb3BWYWx1ZUFzc2lnbm1lbnRfM185XzEoKSB7IHJldHVybiBjUGFkZGluZ1RvcFZhbHVlQXNzaWdubWVudF8zXzlfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZGRpbmdUb3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM185XzFfMCgpIHsgcmV0dXJuIGNQYWRkaW5nVG9wVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfOV8xXzA7IH0KKworCQkvL3BhZGRpbmdUb3BVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdUb3BVbml0QXNzaWdubWVudF8zXzlfMigpIHsgcmV0dXJuIGNQYWRkaW5nVG9wVW5pdEFzc2lnbm1lbnRfM185XzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nVG9wVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfOV8yXzAoKSB7IHJldHVybiBjUGFkZGluZ1RvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzlfMl8wOyB9CisKKwkJLy8oInBhZGRpbmctYm90dG9tIiBwYWRkaW5nQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ0JvdHRvbVVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18xMCgpIHsgcmV0dXJuIGNHcm91cF8zXzEwOyB9CisKKwkJLy8icGFkZGluZy1ib3R0b20iCisJCXB1YmxpYyBLZXl3b3JkIGdldFBhZGRpbmdCb3R0b21LZXl3b3JkXzNfMTBfMCgpIHsgcmV0dXJuIGNQYWRkaW5nQm90dG9tS2V5d29yZF8zXzEwXzA7IH0KKworCQkvL3BhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTBfMSgpIHsgcmV0dXJuIGNQYWRkaW5nQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTBfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZGRpbmdCb3R0b21WYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMF8xXzAoKSB7IHJldHVybiBjUGFkZGluZ0JvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzEwXzFfMDsgfQorCisJCS8vcGFkZGluZ0JvdHRvbVVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFkZGluZ0JvdHRvbVVuaXRBc3NpZ25tZW50XzNfMTBfMigpIHsgcmV0dXJuIGNQYWRkaW5nQm90dG9tVW5pdEFzc2lnbm1lbnRfM18xMF8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFkZGluZ0JvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzEwXzJfMCgpIHsgcmV0dXJuIGNQYWRkaW5nQm90dG9tVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTBfMl8wOyB9CisKKwkJLy8oInBhZGRpbmctbGVmdCIgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18xMSgpIHsgcmV0dXJuIGNHcm91cF8zXzExOyB9CisKKwkJLy8icGFkZGluZy1sZWZ0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWRkaW5nTGVmdEtleXdvcmRfM18xMV8wKCkgeyByZXR1cm4gY1BhZGRpbmdMZWZ0S2V5d29yZF8zXzExXzA7IH0KKworCQkvL3BhZGRpbmdMZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFkZGluZ0xlZnRWYWx1ZUFzc2lnbm1lbnRfM18xMV8xKCkgeyByZXR1cm4gY1BhZGRpbmdMZWZ0VmFsdWVBc3NpZ25tZW50XzNfMTFfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZGRpbmdMZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTFfMV8wKCkgeyByZXR1cm4gY1BhZGRpbmdMZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTFfMV8wOyB9CisKKwkJLy9wYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF8zXzExXzIoKSB7IHJldHVybiBjUGFkZGluZ0xlZnRVbml0QXNzaWdubWVudF8zXzExXzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzExXzJfMCgpIHsgcmV0dXJuIGNQYWRkaW5nTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzExXzJfMDsgfQorCisJCS8vKCJwYWRkaW5nLXJpZ2h0IiBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMTIoKSB7IHJldHVybiBjR3JvdXBfM18xMjsgfQorCisJCS8vInBhZGRpbmctcmlnaHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBhZGRpbmdSaWdodEtleXdvcmRfM18xMl8wKCkgeyByZXR1cm4gY1BhZGRpbmdSaWdodEtleXdvcmRfM18xMl8wOyB9CisKKwkJLy9wYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWRkaW5nUmlnaHRWYWx1ZUFzc2lnbm1lbnRfM18xMl8xKCkgeyByZXR1cm4gY1BhZGRpbmdSaWdodFZhbHVlQXNzaWdubWVudF8zXzEyXzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nUmlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xMl8xXzAoKSB7IHJldHVybiBjUGFkZGluZ1JpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTJfMV8wOyB9CisKKwkJLy9wYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhZGRpbmdSaWdodFVuaXRBc3NpZ25tZW50XzNfMTJfMigpIHsgcmV0dXJuIGNQYWRkaW5nUmlnaHRVbml0QXNzaWdubWVudF8zXzEyXzI7IH0KKworCQkvL1VuaXRFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWRkaW5nUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xMl8yXzAoKSB7IHJldHVybiBjUGFkZGluZ1JpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTJfMl8wOyB9CisKKwkJLy8oIm1hcmdpbi10b3AiIG1hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblRvcFVuaXQ9VW5pdEVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18xMygpIHsgcmV0dXJuIGNHcm91cF8zXzEzOyB9CisKKwkJLy8ibWFyZ2luLXRvcCIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFyZ2luVG9wS2V5d29yZF8zXzEzXzAoKSB7IHJldHVybiBjTWFyZ2luVG9wS2V5d29yZF8zXzEzXzA7IH0KKworCQkvL21hcmdpblRvcFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpblRvcFZhbHVlQXNzaWdubWVudF8zXzEzXzEoKSB7IHJldHVybiBjTWFyZ2luVG9wVmFsdWVBc3NpZ25tZW50XzNfMTNfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpblRvcFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzEzXzFfMCgpIHsgcmV0dXJuIGNNYXJnaW5Ub3BWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xM18xXzA7IH0KKworCQkvL21hcmdpblRvcFVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFyZ2luVG9wVW5pdEFzc2lnbm1lbnRfM18xM18yKCkgeyByZXR1cm4gY01hcmdpblRvcFVuaXRBc3NpZ25tZW50XzNfMTNfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpblRvcFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzEzXzJfMCgpIHsgcmV0dXJuIGNNYXJnaW5Ub3BVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xM18yXzA7IH0KKworCQkvLygibWFyZ2luLWJvdHRvbSIgbWFyZ2luQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luQm90dG9tVW5pdD1Vbml0RW51bSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzE0KCkgeyByZXR1cm4gY0dyb3VwXzNfMTQ7IH0KKworCQkvLyJtYXJnaW4tYm90dG9tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRNYXJnaW5Cb3R0b21LZXl3b3JkXzNfMTRfMCgpIHsgcmV0dXJuIGNNYXJnaW5Cb3R0b21LZXl3b3JkXzNfMTRfMDsgfQorCisJCS8vbWFyZ2luQm90dG9tVmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFyZ2luQm90dG9tVmFsdWVBc3NpZ25tZW50XzNfMTRfMSgpIHsgcmV0dXJuIGNNYXJnaW5Cb3R0b21WYWx1ZUFzc2lnbm1lbnRfM18xNF8xOyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TWFyZ2luQm90dG9tVmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTRfMV8wKCkgeyByZXR1cm4gY01hcmdpbkJvdHRvbVZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE0XzFfMDsgfQorCisJCS8vbWFyZ2luQm90dG9tVW5pdD1Vbml0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXJnaW5Cb3R0b21Vbml0QXNzaWdubWVudF8zXzE0XzIoKSB7IHJldHVybiBjTWFyZ2luQm90dG9tVW5pdEFzc2lnbm1lbnRfM18xNF8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TWFyZ2luQm90dG9tVW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzNfMTRfMl8wKCkgeyByZXR1cm4gY01hcmdpbkJvdHRvbVVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzE0XzJfMDsgfQorCisJCS8vKCJtYXJnaW4tbGVmdCIgbWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMTUoKSB7IHJldHVybiBjR3JvdXBfM18xNTsgfQorCisJCS8vIm1hcmdpbi1sZWZ0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRNYXJnaW5MZWZ0S2V5d29yZF8zXzE1XzAoKSB7IHJldHVybiBjTWFyZ2luTGVmdEtleXdvcmRfM18xNV8wOyB9CisKKwkJLy9tYXJnaW5MZWZ0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF8zXzE1XzEoKSB7IHJldHVybiBjTWFyZ2luTGVmdFZhbHVlQXNzaWdubWVudF8zXzE1XzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXJnaW5MZWZ0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzNfMTVfMV8wKCkgeyByZXR1cm4gY01hcmdpbkxlZnRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfM18xNV8xXzA7IH0KKworCQkvL21hcmdpbkxlZnRVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpbkxlZnRVbml0QXNzaWdubWVudF8zXzE1XzIoKSB7IHJldHVybiBjTWFyZ2luTGVmdFVuaXRBc3NpZ25tZW50XzNfMTVfMjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldE1hcmdpbkxlZnRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xNV8yXzAoKSB7IHJldHVybiBjTWFyZ2luTGVmdFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF8zXzE1XzJfMDsgfQorCisJCS8vKCJtYXJnaW4tcmlnaHQiIG1hcmdpblJpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMTYoKSB7IHJldHVybiBjR3JvdXBfM18xNjsgfQorCisJCS8vIm1hcmdpbi1yaWdodCIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWFyZ2luUmlnaHRLZXl3b3JkXzNfMTZfMCgpIHsgcmV0dXJuIGNNYXJnaW5SaWdodEtleXdvcmRfM18xNl8wOyB9CisKKwkJLy9tYXJnaW5SaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpblJpZ2h0VmFsdWVBc3NpZ25tZW50XzNfMTZfMSgpIHsgcmV0dXJuIGNNYXJnaW5SaWdodFZhbHVlQXNzaWdubWVudF8zXzE2XzE7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNYXJnaW5SaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE2XzFfMCgpIHsgcmV0dXJuIGNNYXJnaW5SaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8zXzE2XzFfMDsgfQorCisJCS8vbWFyZ2luUmlnaHRVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfM18xNl8yKCkgeyByZXR1cm4gY01hcmdpblJpZ2h0VW5pdEFzc2lnbm1lbnRfM18xNl8yOyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TWFyZ2luUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xNl8yXzAoKSB7IHJldHVybiBjTWFyZ2luUmlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfM18xNl8yXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBTb21lRm9ybWF0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlNvbWVGb3JtYXQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1VvbW9Gb3JtYXRQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOdW1iZXJGb3JtYXRQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDdXJyZW5jeUZvcm1hdFBhcnNlclJ1bGVDYWxsXzIgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0RhdGVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEYXRlVGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzQgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RpbWVGb3JtYXRQYXJzZXJSdWxlQ2FsbF81ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQkKKwkJLy9Tb21lRm9ybWF0OgorCQkvLwlVb21vRm9ybWF0IHwgTnVtYmVyRm9ybWF0IHwgQ3VycmVuY3lGb3JtYXQgfCBEYXRlRm9ybWF0IHwgRGF0ZVRpbWVGb3JtYXQgfCBUaW1lRm9ybWF0OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vVW9tb0Zvcm1hdCB8IE51bWJlckZvcm1hdCB8IEN1cnJlbmN5Rm9ybWF0IHwgRGF0ZUZvcm1hdCB8IERhdGVUaW1lRm9ybWF0IHwgVGltZUZvcm1hdAorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1VvbW9Gb3JtYXQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFVvbW9Gb3JtYXRQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1VvbW9Gb3JtYXRQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9OdW1iZXJGb3JtYXQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE51bWJlckZvcm1hdFBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjTnVtYmVyRm9ybWF0UGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vQ3VycmVuY3lGb3JtYXQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEN1cnJlbmN5Rm9ybWF0UGFyc2VyUnVsZUNhbGxfMigpIHsgcmV0dXJuIGNDdXJyZW5jeUZvcm1hdFBhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL0RhdGVGb3JtYXQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERhdGVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY0RhdGVGb3JtYXRQYXJzZXJSdWxlQ2FsbF8zOyB9CisKKwkJLy9EYXRlVGltZUZvcm1hdAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJzZXJSdWxlQ2FsbF80KCkgeyByZXR1cm4gY0RhdGVUaW1lRm9ybWF0UGFyc2VyUnVsZUNhbGxfNDsgfQorCisJCS8vVGltZUZvcm1hdAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzUoKSB7IHJldHVybiBjVGltZUZvcm1hdFBhcnNlclJ1bGVDYWxsXzU7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVW9tb0Zvcm1hdEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJVb21vRm9ybWF0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1VvbW9LZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVWlLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlcG9ydEtleXdvcmRfNSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzYgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGV4dGFsaWduS2V5d29yZF83ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0YWxpZ25Bc3NpZ25tZW50XzggPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzhfMCA9IChSdWxlQ2FsbCljVGV4dGFsaWduQXNzaWdubWVudF84LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7CisJCQorCQkvL1VvbW9Gb3JtYXQ6CisJCS8vCSJ1b21vIiBuYW1lPUlEICJ7IiAidWkiIHVpX3BhdHRlcm49U1RSSU5HICJyZXBvcnQiIHJlcG9ydF9wYXR0ZXJuPVNUUklORyAidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8idW9tbyIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfcGF0dGVybj1TVFJJTkcgInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInVvbW8iCisJCXB1YmxpYyBLZXl3b3JkIGdldFVvbW9LZXl3b3JkXzAoKSB7IHJldHVybiBjVW9tb0tleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vInVpIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVaUtleXdvcmRfMygpIHsgcmV0dXJuIGNVaUtleXdvcmRfMzsgfQorCisJCS8vdWlfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VWlfcGF0dGVybkFzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuQXNzaWdubWVudF80OyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzA7IH0KKworCQkvLyJyZXBvcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlcG9ydEtleXdvcmRfNSgpIHsgcmV0dXJuIGNSZXBvcnRLZXl3b3JkXzU7IH0KKworCQkvL3JlcG9ydF9wYXR0ZXJuPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNjsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNl8wKCkgeyByZXR1cm4gY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF82XzA7IH0KKworCQkvLyJ0ZXh0YWxpZ24iCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRhbGlnbktleXdvcmRfNygpIHsgcmV0dXJuIGNUZXh0YWxpZ25LZXl3b3JkXzc7IH0KKworCQkvL3RleHRhbGlnbj1UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRleHRhbGlnbkFzc2lnbm1lbnRfOCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25Bc3NpZ25tZW50Xzg7IH0KKworCQkvL1RleHRBbGlnbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOF8wKCkgeyByZXR1cm4gY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOF8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzkoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzk7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgTnVtYmVyRm9ybWF0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIk51bWJlckZvcm1hdCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNOdW1iZXJLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVWlLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlcG9ydEtleXdvcmRfNSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVwb3J0X2NhdGVnb3J5TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCA9IChSdWxlQ2FsbCljUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAgPSAoUnVsZUNhbGwpY1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUZXh0YWxpZ25LZXl3b3JkXzggPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRhbGlnbkFzc2lnbm1lbnRfOSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wID0gKFJ1bGVDYWxsKWNUZXh0YWxpZ25Bc3NpZ25tZW50XzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTApOworCQkKKwkJLy9OdW1iZXJGb3JtYXQ6CisJCS8vCSJudW1iZXIiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PU51bWJlckZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJLy8JInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vIm51bWJlciIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfY2F0ZWdvcnk9TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORworCQkvLyJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJudW1iZXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldE51bWJlcktleXdvcmRfMCgpIHsgcmV0dXJuIGNOdW1iZXJLZXl3b3JkXzA7IH0KKworCQkvL25hbWU9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvLyJ1aSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VWlLZXl3b3JkXzMoKSB7IHJldHVybiBjVWlLZXl3b3JkXzM7IH0KKworCQkvL3VpX3BhdHRlcm49U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFVpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSB7IHJldHVybiBjVWlfcGF0dGVybkFzc2lnbm1lbnRfNDsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSB7IHJldHVybiBjVWlfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wOyB9CisKKwkJLy8icmVwb3J0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZXBvcnRLZXl3b3JkXzUoKSB7IHJldHVybiBjUmVwb3J0S2V5d29yZF81OyB9CisKKwkJLy9yZXBvcnRfY2F0ZWdvcnk9TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzY7IH0KKworCQkvL051bWJlckZvcm1hdENhdGVnb3J5RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0X2NhdGVnb3J5TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wOyB9CisKKwkJLy9yZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcoKSB7IHJldHVybiBjUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50Xzc7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wOyB9CisKKwkJLy8idGV4dGFsaWduIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSB7IHJldHVybiBjVGV4dGFsaWduS2V5d29yZF84OyB9CisKKwkJLy90ZXh0YWxpZ249VGV4dEFsaWduRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSB7IHJldHVybiBjVGV4dGFsaWduQXNzaWdubWVudF85OyB9CisKKwkJLy9UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ3VycmVuY3lGb3JtYXRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ3VycmVuY3lGb3JtYXQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ3VycmVuY3lLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVWlLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlcG9ydEtleXdvcmRfNSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVwb3J0X2NhdGVnb3J5Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCA9IChSdWxlQ2FsbCljUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RleHRhbGlnbktleXdvcmRfOCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVGV4dGFsaWduQXNzaWdubWVudF85ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg5KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF85XzAgPSAoUnVsZUNhbGwpY1RleHRhbGlnbkFzc2lnbm1lbnRfOS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMCk7CisJCQorCQkvL0N1cnJlbmN5Rm9ybWF0OgorCQkvLwkiY3VycmVuY3kiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtCisJCS8vCXJlcG9ydF9wYXR0ZXJuPVNUUklORyAidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iY3VycmVuY3kiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORworCQkvLyJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJjdXJyZW5jeSIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q3VycmVuY3lLZXl3b3JkXzAoKSB7IHJldHVybiBjQ3VycmVuY3lLZXl3b3JkXzA7IH0KKworCQkvL25hbWU9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvLyJ1aSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VWlLZXl3b3JkXzMoKSB7IHJldHVybiBjVWlLZXl3b3JkXzM7IH0KKworCQkvL3VpX3BhdHRlcm49U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFVpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSB7IHJldHVybiBjVWlfcGF0dGVybkFzc2lnbm1lbnRfNDsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSB7IHJldHVybiBjVWlfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wOyB9CisKKwkJLy8icmVwb3J0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZXBvcnRLZXl3b3JkXzUoKSB7IHJldHVybiBjUmVwb3J0S2V5d29yZF81OyB9CisKKwkJLy9yZXBvcnRfY2F0ZWdvcnk9Q3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82KCkgeyByZXR1cm4gY1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNjsgfQorCisJCS8vQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlcG9ydF9jYXRlZ29yeUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzA7IH0KKworCQkvL3JlcG9ydF9wYXR0ZXJuPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNzsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wKCkgeyByZXR1cm4gY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzA7IH0KKworCQkvLyJ0ZXh0YWxpZ24iCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRhbGlnbktleXdvcmRfOCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25LZXl3b3JkXzg7IH0KKworCQkvL3RleHRhbGlnbj1UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRleHRhbGlnbkFzc2lnbm1lbnRfOSgpIHsgcmV0dXJuIGNUZXh0YWxpZ25Bc3NpZ25tZW50Xzk7IH0KKworCQkvL1RleHRBbGlnbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkgeyByZXR1cm4gY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBEYXRlRm9ybWF0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGVGb3JtYXQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGF0ZUtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVaUtleXdvcmRfMyA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVWlfcGF0dGVybkFzc2lnbm1lbnRfNCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1VpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljVWlfcGF0dGVybkFzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmVwb3J0S2V5d29yZF81ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZXBvcnRfY2F0ZWdvcnlEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCA9IChSdWxlQ2FsbCljUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAgPSAoUnVsZUNhbGwpY1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUZXh0YWxpZ25LZXl3b3JkXzggPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRhbGlnbkFzc2lnbm1lbnRfOSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wID0gKFJ1bGVDYWxsKWNUZXh0YWxpZ25Bc3NpZ25tZW50XzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTApOworCQkKKwkJLy9EYXRlRm9ybWF0OgorCQkvLwkiZGF0ZSIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfY2F0ZWdvcnk9RGF0ZUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJLy8JInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImRhdGUiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PURhdGVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HCisJCS8vInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImRhdGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldERhdGVLZXl3b3JkXzAoKSB7IHJldHVybiBjRGF0ZUtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vInVpIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVaUtleXdvcmRfMygpIHsgcmV0dXJuIGNVaUtleXdvcmRfMzsgfQorCisJCS8vdWlfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VWlfcGF0dGVybkFzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuQXNzaWdubWVudF80OyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzA7IH0KKworCQkvLyJyZXBvcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlcG9ydEtleXdvcmRfNSgpIHsgcmV0dXJuIGNSZXBvcnRLZXl3b3JkXzU7IH0KKworCQkvL3JlcG9ydF9jYXRlZ29yeT1EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzY7IH0KKworCQkvL0RhdGVGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlcG9ydF9jYXRlZ29yeURhdGVGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wKCkgeyByZXR1cm4gY1JlcG9ydF9jYXRlZ29yeURhdGVGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wOyB9CisKKwkJLy9yZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcoKSB7IHJldHVybiBjUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50Xzc7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wOyB9CisKKwkJLy8idGV4dGFsaWduIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSB7IHJldHVybiBjVGV4dGFsaWduS2V5d29yZF84OyB9CisKKwkJLy90ZXh0YWxpZ249VGV4dEFsaWduRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSB7IHJldHVybiBjVGV4dGFsaWduQXNzaWdubWVudF85OyB9CisKKwkJLy9UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgRGF0ZVRpbWVGb3JtYXRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiRGF0ZVRpbWVGb3JtYXQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGF0ZVRpbWVLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVWlLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1VpX3BhdHRlcm5Bc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlcG9ydEtleXdvcmRfNSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVwb3J0X2NhdGVnb3J5RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCA9IChSdWxlQ2FsbCljUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RleHRhbGlnbktleXdvcmRfOCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVGV4dGFsaWduQXNzaWdubWVudF85ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg5KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dGFsaWduVGV4dEFsaWduRW51bUVudW1SdWxlQ2FsbF85XzAgPSAoUnVsZUNhbGwpY1RleHRhbGlnbkFzc2lnbm1lbnRfOS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMCk7CisJCQorCQkvL0RhdGVUaW1lRm9ybWF0OgorCQkvLwkiZGF0ZSt0aW1lIiBuYW1lPUlEICJ7IiAidWkiIHVpX3BhdHRlcm49U1RSSU5HICJyZXBvcnQiIHJlcG9ydF9jYXRlZ29yeT1EYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bQorCQkvLwlyZXBvcnRfcGF0dGVybj1TVFJJTkcgInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImRhdGUrdGltZSIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfY2F0ZWdvcnk9RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HCisJCS8vInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImRhdGUrdGltZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RGF0ZVRpbWVLZXl3b3JkXzAoKSB7IHJldHVybiBjRGF0ZVRpbWVLZXl3b3JkXzA7IH0KKworCQkvL25hbWU9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzI7IH0KKworCQkvLyJ1aSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VWlLZXl3b3JkXzMoKSB7IHJldHVybiBjVWlLZXl3b3JkXzM7IH0KKworCQkvL3VpX3BhdHRlcm49U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFVpX3BhdHRlcm5Bc3NpZ25tZW50XzQoKSB7IHJldHVybiBjVWlfcGF0dGVybkFzc2lnbm1lbnRfNDsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSB7IHJldHVybiBjVWlfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wOyB9CisKKwkJLy8icmVwb3J0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZXBvcnRLZXl3b3JkXzUoKSB7IHJldHVybiBjUmVwb3J0S2V5d29yZF81OyB9CisKKwkJLy9yZXBvcnRfY2F0ZWdvcnk9RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82KCkgeyByZXR1cm4gY1JlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNjsgfQorCisJCS8vRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlcG9ydF9jYXRlZ29yeURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUVudW1SdWxlQ2FsbF82XzA7IH0KKworCQkvL3JlcG9ydF9wYXR0ZXJuPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNygpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNzsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wKCkgeyByZXR1cm4gY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzA7IH0KKworCQkvLyJ0ZXh0YWxpZ24iCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRhbGlnbktleXdvcmRfOCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25LZXl3b3JkXzg7IH0KKworCQkvL3RleHRhbGlnbj1UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRleHRhbGlnbkFzc2lnbm1lbnRfOSgpIHsgcmV0dXJuIGNUZXh0YWxpZ25Bc3NpZ25tZW50Xzk7IH0KKworCQkvL1RleHRBbGlnbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wKCkgeyByZXR1cm4gY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzEwKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUaW1lRm9ybWF0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRpbWVGb3JtYXQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGltZUtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVaUtleXdvcmRfMyA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVWlfcGF0dGVybkFzc2lnbm1lbnRfNCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1VpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljVWlfcGF0dGVybkFzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmVwb3J0S2V5d29yZF81ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzYgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZXBvcnRfY2F0ZWdvcnlUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRW51bVJ1bGVDYWxsXzZfMCA9IChSdWxlQ2FsbCljUmVwb3J0X2NhdGVnb3J5QXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXBvcnRfcGF0dGVybkFzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlcG9ydF9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF83XzAgPSAoUnVsZUNhbGwpY1JlcG9ydF9wYXR0ZXJuQXNzaWdubWVudF83LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUZXh0YWxpZ25LZXl3b3JkXzggPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRhbGlnbkFzc2lnbm1lbnRfOSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRhbGlnblRleHRBbGlnbkVudW1FbnVtUnVsZUNhbGxfOV8wID0gKFJ1bGVDYWxsKWNUZXh0YWxpZ25Bc3NpZ25tZW50XzkuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTApOworCQkKKwkJLy9UaW1lRm9ybWF0OgorCQkvLwkidGltZSIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfY2F0ZWdvcnk9VGltZUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJLy8JInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vInRpbWUiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HCisJCS8vInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInRpbWUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRpbWVLZXl3b3JkXzAoKSB7IHJldHVybiBjVGltZUtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vInVpIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVaUtleXdvcmRfMygpIHsgcmV0dXJuIGNVaUtleXdvcmRfMzsgfQorCisJCS8vdWlfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VWlfcGF0dGVybkFzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuQXNzaWdubWVudF80OyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFVpX3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNVaV9wYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzA7IH0KKworCQkvLyJyZXBvcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlcG9ydEtleXdvcmRfNSgpIHsgcmV0dXJuIGNSZXBvcnRLZXl3b3JkXzU7IH0KKworCQkvL3JlcG9ydF9jYXRlZ29yeT1UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlcG9ydF9jYXRlZ29yeUFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNSZXBvcnRfY2F0ZWdvcnlBc3NpZ25tZW50XzY7IH0KKworCQkvL1RpbWVGb3JtYXRDYXRlZ29yeUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlcG9ydF9jYXRlZ29yeVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wKCkgeyByZXR1cm4gY1JlcG9ydF9jYXRlZ29yeVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FbnVtUnVsZUNhbGxfNl8wOyB9CisKKwkJLy9yZXBvcnRfcGF0dGVybj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50XzcoKSB7IHJldHVybiBjUmVwb3J0X3BhdHRlcm5Bc3NpZ25tZW50Xzc7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0X3BhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzdfMCgpIHsgcmV0dXJuIGNSZXBvcnRfcGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfN18wOyB9CisKKwkJLy8idGV4dGFsaWduIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUZXh0YWxpZ25LZXl3b3JkXzgoKSB7IHJldHVybiBjVGV4dGFsaWduS2V5d29yZF84OyB9CisKKwkJLy90ZXh0YWxpZ249VGV4dEFsaWduRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0YWxpZ25Bc3NpZ25tZW50XzkoKSB7IHJldHVybiBjVGV4dGFsaWduQXNzaWdubWVudF85OyB9CisKKwkJLy9UZXh0QWxpZ25FbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMCgpIHsgcmV0dXJuIGNUZXh0YWxpZ25UZXh0QWxpZ25FbnVtRW51bVJ1bGVDYWxsXzlfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xMCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVwb3J0RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJlcG9ydCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSZXBvcnRLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzIgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfMl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Rlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzJfMF8wID0gKEtleXdvcmQpY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMV8wID0gKFJ1bGVDYWxsKWNEZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVG9vbGJhcktleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Rvb2xiYXJBc3NpZ25tZW50XzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVG9vbGJhckFjdGlvblRvb2xiYXJDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljVG9vbGJhckFzc2lnbm1lbnRfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVG9vbGJhckFjdGlvblRvb2xiYXJJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljVG9vbGJhckFjdGlvblRvb2xiYXJDcm9zc1JlZmVyZW5jZV8zXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGF0YW1hcnRLZXl3b3JkXzUgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RhdGFtYXJ0UmVmQXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjRGF0YW1hcnRSZWZEYXRhbWFydERlZmluaXRpb25Dcm9zc1JlZmVyZW5jZV82XzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0RhdGFtYXJ0UmVmQXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGF0YW1hcnRSZWZEYXRhbWFydERlZmluaXRpb25JRFRlcm1pbmFsUnVsZUNhbGxfNl8wXzEgPSAoUnVsZUNhbGwpY0RhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uQ3Jvc3NSZWZlcmVuY2VfNl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSZW5kZXJpbmdLZXl3b3JkXzcgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlbmRlcmluZ0Fzc2lnbm1lbnRfOCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoOCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlbmRlcmluZ1JlbmRlcmluZ0VudW1FbnVtUnVsZUNhbGxfOF8wID0gKFJ1bGVDYWxsKWNSZW5kZXJpbmdBc3NpZ25tZW50XzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF85ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoOSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXh0ZXJuYWxDc3NVUklLZXl3b3JkXzlfMCA9IChLZXl3b3JkKWNHcm91cF85LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfOV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzkuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFeHRlcm5hbENzc1VSSVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfOV8xXzAgPSAoUnVsZUNhbGwpY0V4dGVybmFsQ3NzVVJJQXNzaWdubWVudF85XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF85XzIgPSAoR3JvdXApY0dyb3VwXzkuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zyb21CdW5kbGVLZXl3b3JkXzlfMl8wID0gKEtleXdvcmQpY0dyb3VwXzlfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzlfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzlfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0V4dGVybmFsQ3NzVVJJQnVuZGxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF85XzJfMV8wID0gKFJ1bGVDYWxsKWNFeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfOV8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BhZ2V0ZW1wbGF0ZUtleXdvcmRfMTAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWdlVGVtcGxhdGVBc3NpZ25tZW50XzExID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1BhZ2VUZW1wbGF0ZVBhZ2VUZW1wbGF0ZUNyb3NzUmVmZXJlbmNlXzExXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1BhZ2VUZW1wbGF0ZUFzc2lnbm1lbnRfMTEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWdlVGVtcGxhdGVQYWdlVGVtcGxhdGVJRFRlcm1pbmFsUnVsZUNhbGxfMTFfMF8xID0gKFJ1bGVDYWxsKWNQYWdlVGVtcGxhdGVQYWdlVGVtcGxhdGVDcm9zc1JlZmVyZW5jZV8xMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNZWRpYUtleXdvcmRfMTIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNZWRpYUFzc2lnbm1lbnRfMTMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEzKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjTWVkaWFNZWRpYUNyb3NzUmVmZXJlbmNlXzEzXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY01lZGlhQXNzaWdubWVudF8xMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01lZGlhTWVkaWFJRFRlcm1pbmFsUnVsZUNhbGxfMTNfMF8xID0gKFJ1bGVDYWxsKWNNZWRpYU1lZGlhQ3Jvc3NSZWZlcmVuY2VfMTNfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVzaWduQXNzaWdubWVudF8xNCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMTQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEZXNpZ25SZXBvcnREZXNpZ25QYXJzZXJSdWxlQ2FsbF8xNF8wID0gKFJ1bGVDYWxsKWNEZXNpZ25Bc3NpZ25tZW50XzE0LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTUgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDE1KTsKKwkJCisJCS8vUmVwb3J0OgorCQkvLwkicmVwb3J0IiBuYW1lPUlEIChkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPyAoInRvb2xiYXIiCisJCS8vCXRvb2xiYXI9W2FjdGlvbjo6QWN0aW9uVG9vbGJhcl0pPyAieyIgImRhdGFtYXJ0IiBkYXRhbWFydFJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0RGVmaW5pdGlvbl0gInJlbmRlcmluZyIKKwkJLy8JcmVuZGVyaW5nPVJlbmRlcmluZ0VudW0gKCJleHRlcm5hbENzc1VSSSIgZXh0ZXJuYWxDc3NVUkk9U1RSSU5HICgiZnJvbSBidW5kbGUiIGV4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORyk/KT8KKwkJLy8JInBhZ2V0ZW1wbGF0ZSIgcGFnZVRlbXBsYXRlPVtQYWdlVGVtcGxhdGVdICJtZWRpYSIgbWVkaWE9W01lZGlhXSBkZXNpZ249UmVwb3J0RGVzaWduICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJyZXBvcnQiIG5hbWU9SUQgKGRlc2NyaXB0aW9uPz0iZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/ICgidG9vbGJhciIKKwkJLy90b29sYmFyPVthY3Rpb246OkFjdGlvblRvb2xiYXJdKT8gInsiICJkYXRhbWFydCIgZGF0YW1hcnRSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dICJyZW5kZXJpbmciCisJCS8vcmVuZGVyaW5nPVJlbmRlcmluZ0VudW0gKCJleHRlcm5hbENzc1VSSSIgZXh0ZXJuYWxDc3NVUkk9U1RSSU5HICgiZnJvbSBidW5kbGUiIGV4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORyk/KT8KKwkJLy8icGFnZXRlbXBsYXRlIiBwYWdlVGVtcGxhdGU9W1BhZ2VUZW1wbGF0ZV0gIm1lZGlhIiBtZWRpYT1bTWVkaWFdIGRlc2lnbj1SZXBvcnREZXNpZ24gIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInJlcG9ydCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmVwb3J0S2V5d29yZF8wKCkgeyByZXR1cm4gY1JlcG9ydEtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzFfMDsgfQorCisJCS8vKGRlc2NyaXB0aW9uPz0iZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8yKCkgeyByZXR1cm4gY0dyb3VwXzI7IH0KKworCQkvL2Rlc2NyaXB0aW9uPz0iZGVzY3JpYmVkIGJ5IgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfMl8wKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzA7IH0KKworCQkvLyJkZXNjcmliZWQgYnkiCisJCXB1YmxpYyBLZXl3b3JkIGdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzJfMF8wKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzJfMF8wOyB9CisKKwkJLy9kZXNjcmlwdGlvblZhbHVlPVRSQU5TTEFUQUJMRVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfMl8xOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldERlc2NyaXB0aW9uVmFsdWVUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8xXzA7IH0KKworCQkvLygidG9vbGJhciIgdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJ0b29sYmFyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUb29sYmFyS2V5d29yZF8zXzAoKSB7IHJldHVybiBjVG9vbGJhcktleXdvcmRfM18wOyB9CisKKwkJLy90b29sYmFyPVthY3Rpb246OkFjdGlvblRvb2xiYXJdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRvb2xiYXJBc3NpZ25tZW50XzNfMSgpIHsgcmV0dXJuIGNUb29sYmFyQXNzaWdubWVudF8zXzE7IH0KKworCQkvL1thY3Rpb246OkFjdGlvblRvb2xiYXJdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRUb29sYmFyQWN0aW9uVG9vbGJhckNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1Rvb2xiYXJBY3Rpb25Ub29sYmFyQ3Jvc3NSZWZlcmVuY2VfM18xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUb29sYmFyQWN0aW9uVG9vbGJhcklEVGVybWluYWxSdWxlQ2FsbF8zXzFfMF8xKCkgeyByZXR1cm4gY1Rvb2xiYXJBY3Rpb25Ub29sYmFySURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80KCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQ7IH0KKworCQkvLyJkYXRhbWFydCIKKwkJcHVibGljIEtleXdvcmQgZ2V0RGF0YW1hcnRLZXl3b3JkXzUoKSB7IHJldHVybiBjRGF0YW1hcnRLZXl3b3JkXzU7IH0KKworCQkvL2RhdGFtYXJ0UmVmPVtkYXRhbWFydDo6RGF0YW1hcnREZWZpbml0aW9uXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREYXRhbWFydFJlZkFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNEYXRhbWFydFJlZkFzc2lnbm1lbnRfNjsgfQorCisJCS8vW2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXREYXRhbWFydFJlZkRhdGFtYXJ0RGVmaW5pdGlvbkNyb3NzUmVmZXJlbmNlXzZfMCgpIHsgcmV0dXJuIGNEYXRhbWFydFJlZkRhdGFtYXJ0RGVmaW5pdGlvbkNyb3NzUmVmZXJlbmNlXzZfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uSURUZXJtaW5hbFJ1bGVDYWxsXzZfMF8xKCkgeyByZXR1cm4gY0RhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uSURUZXJtaW5hbFJ1bGVDYWxsXzZfMF8xOyB9CisKKwkJLy8icmVuZGVyaW5nIgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZW5kZXJpbmdLZXl3b3JkXzcoKSB7IHJldHVybiBjUmVuZGVyaW5nS2V5d29yZF83OyB9CisKKwkJLy9yZW5kZXJpbmc9UmVuZGVyaW5nRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZW5kZXJpbmdBc3NpZ25tZW50XzgoKSB7IHJldHVybiBjUmVuZGVyaW5nQXNzaWdubWVudF84OyB9CisKKwkJLy9SZW5kZXJpbmdFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZW5kZXJpbmdSZW5kZXJpbmdFbnVtRW51bVJ1bGVDYWxsXzhfMCgpIHsgcmV0dXJuIGNSZW5kZXJpbmdSZW5kZXJpbmdFbnVtRW51bVJ1bGVDYWxsXzhfMDsgfQorCisJCS8vKCJleHRlcm5hbENzc1VSSSIgZXh0ZXJuYWxDc3NVUkk9U1RSSU5HICgiZnJvbSBidW5kbGUiIGV4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORyk/KT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzkoKSB7IHJldHVybiBjR3JvdXBfOTsgfQorCisJCS8vImV4dGVybmFsQ3NzVVJJIgorCQlwdWJsaWMgS2V5d29yZCBnZXRFeHRlcm5hbENzc1VSSUtleXdvcmRfOV8wKCkgeyByZXR1cm4gY0V4dGVybmFsQ3NzVVJJS2V5d29yZF85XzA7IH0KKworCQkvL2V4dGVybmFsQ3NzVVJJPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHRlcm5hbENzc1VSSUFzc2lnbm1lbnRfOV8xKCkgeyByZXR1cm4gY0V4dGVybmFsQ3NzVVJJQXNzaWdubWVudF85XzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RXh0ZXJuYWxDc3NVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzlfMV8wKCkgeyByZXR1cm4gY0V4dGVybmFsQ3NzVVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF85XzFfMDsgfQorCisJCS8vKCJmcm9tIGJ1bmRsZSIgZXh0ZXJuYWxDc3NVUklCdW5kbGU9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzlfMigpIHsgcmV0dXJuIGNHcm91cF85XzI7IH0KKworCQkvLyJmcm9tIGJ1bmRsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RnJvbUJ1bmRsZUtleXdvcmRfOV8yXzAoKSB7IHJldHVybiBjRnJvbUJ1bmRsZUtleXdvcmRfOV8yXzA7IH0KKworCQkvL2V4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZUFzc2lnbm1lbnRfOV8yXzEoKSB7IHJldHVybiBjRXh0ZXJuYWxDc3NVUklCdW5kbGVBc3NpZ25tZW50XzlfMl8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEV4dGVybmFsQ3NzVVJJQnVuZGxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF85XzJfMV8wKCkgeyByZXR1cm4gY0V4dGVybmFsQ3NzVVJJQnVuZGxlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF85XzJfMV8wOyB9CisKKwkJLy8icGFnZXRlbXBsYXRlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWdldGVtcGxhdGVLZXl3b3JkXzEwKCkgeyByZXR1cm4gY1BhZ2V0ZW1wbGF0ZUtleXdvcmRfMTA7IH0KKworCQkvL3BhZ2VUZW1wbGF0ZT1bUGFnZVRlbXBsYXRlXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQYWdlVGVtcGxhdGVBc3NpZ25tZW50XzExKCkgeyByZXR1cm4gY1BhZ2VUZW1wbGF0ZUFzc2lnbm1lbnRfMTE7IH0KKworCQkvL1tQYWdlVGVtcGxhdGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRQYWdlVGVtcGxhdGVQYWdlVGVtcGxhdGVDcm9zc1JlZmVyZW5jZV8xMV8wKCkgeyByZXR1cm4gY1BhZ2VUZW1wbGF0ZVBhZ2VUZW1wbGF0ZUNyb3NzUmVmZXJlbmNlXzExXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWdlVGVtcGxhdGVQYWdlVGVtcGxhdGVJRFRlcm1pbmFsUnVsZUNhbGxfMTFfMF8xKCkgeyByZXR1cm4gY1BhZ2VUZW1wbGF0ZVBhZ2VUZW1wbGF0ZUlEVGVybWluYWxSdWxlQ2FsbF8xMV8wXzE7IH0KKworCQkvLyJtZWRpYSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWVkaWFLZXl3b3JkXzEyKCkgeyByZXR1cm4gY01lZGlhS2V5d29yZF8xMjsgfQorCisJCS8vbWVkaWE9W01lZGlhXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNZWRpYUFzc2lnbm1lbnRfMTMoKSB7IHJldHVybiBjTWVkaWFBc3NpZ25tZW50XzEzOyB9CisKKwkJLy9bTWVkaWFdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRNZWRpYU1lZGlhQ3Jvc3NSZWZlcmVuY2VfMTNfMCgpIHsgcmV0dXJuIGNNZWRpYU1lZGlhQ3Jvc3NSZWZlcmVuY2VfMTNfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1lZGlhTWVkaWFJRFRlcm1pbmFsUnVsZUNhbGxfMTNfMF8xKCkgeyByZXR1cm4gY01lZGlhTWVkaWFJRFRlcm1pbmFsUnVsZUNhbGxfMTNfMF8xOyB9CisKKwkJLy9kZXNpZ249UmVwb3J0RGVzaWduCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERlc2lnbkFzc2lnbm1lbnRfMTQoKSB7IHJldHVybiBjRGVzaWduQXNzaWdubWVudF8xNDsgfQorCisJCS8vUmVwb3J0RGVzaWduCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXREZXNpZ25SZXBvcnREZXNpZ25QYXJzZXJSdWxlQ2FsbF8xNF8wKCkgeyByZXR1cm4gY0Rlc2lnblJlcG9ydERlc2lnblBhcnNlclJ1bGVDYWxsXzE0XzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMTUoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzE1OyB9CisJfQorCisJcHVibGljIGNsYXNzIFJlcG9ydERlc2lnbkVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSZXBvcnREZXNpZ24iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JlcG9ydERlc2lnbkZpbGVQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZXBvcnREZXNpZ25UZW1wbGF0ZVBhcnNlclJ1bGVDYWxsXzEgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1JlcG9ydERlc2lnbjoKKwkJLy8JUmVwb3J0RGVzaWduRmlsZSB8IFJlcG9ydERlc2lnblRlbXBsYXRlOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUmVwb3J0RGVzaWduRmlsZSB8IFJlcG9ydERlc2lnblRlbXBsYXRlCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vUmVwb3J0RGVzaWduRmlsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVwb3J0RGVzaWduRmlsZVBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjUmVwb3J0RGVzaWduRmlsZVBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvL1JlcG9ydERlc2lnblRlbXBsYXRlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUmVwb3J0RGVzaWduVGVtcGxhdGVQYXJzZXJSdWxlQ2FsbF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJlcG9ydERlc2lnbkZpbGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUmVwb3J0RGVzaWduRmlsZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGaWxlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUmVwb3J0RGVzaWduRmlsZToKKwkJLy8JImZpbGUiIG5hbWU9U1RSSU5HOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImZpbGUiIG5hbWU9U1RSSU5HCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImZpbGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEZpbGVLZXl3b3JkXzAoKSB7IHJldHVybiBjRmlsZUtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNOYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVwb3J0RGVzaWduVGVtcGxhdGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUmVwb3J0RGVzaWduVGVtcGxhdGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGVtcGxhdGVLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGVzY3JpYmVkQnlLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNHcm91cF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEZXNjcmlwdGlvblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8xXzAgPSAoUnVsZUNhbGwpY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlYWRlckFzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0hlYWRlclBhZ2VIZWFkZXJQYXJzZXJSdWxlQ2FsbF8zXzAgPSAoUnVsZUNhbGwpY0hlYWRlckFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGV0YWlsQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGV0YWlsUGFnZURldGFpbFBhcnNlclJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljRGV0YWlsQXNzaWdubWVudF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb290ZXJBc3NpZ25tZW50XzUgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb290ZXJQYWdlRm9vdGVyUGFyc2VyUnVsZUNhbGxfNV8wID0gKFJ1bGVDYWxsKWNGb290ZXJBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJCisJCS8vUmVwb3J0RGVzaWduVGVtcGxhdGU6CisJCS8vCSJ0ZW1wbGF0ZSIgInsiICgiZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvbj1TVFJJTkcpPyBoZWFkZXI9UGFnZUhlYWRlcj8gZGV0YWlsPVBhZ2VEZXRhaWwgZm9vdGVyPVBhZ2VGb290ZXI/ICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJ0ZW1wbGF0ZSIgInsiICgiZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvbj1TVFJJTkcpPyBoZWFkZXI9UGFnZUhlYWRlcj8gZGV0YWlsPVBhZ2VEZXRhaWwgZm9vdGVyPVBhZ2VGb290ZXI/ICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJ0ZW1wbGF0ZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VGVtcGxhdGVLZXl3b3JkXzAoKSB7IHJldHVybiBjVGVtcGxhdGVLZXl3b3JkXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzE7IH0KKworCQkvLygiZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvbj1TVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisKKwkJLy8iZGVzY3JpYmVkIGJ5IgorCQlwdWJsaWMgS2V5d29yZCBnZXREZXNjcmliZWRCeUtleXdvcmRfMl8wKCkgeyByZXR1cm4gY0Rlc2NyaWJlZEJ5S2V5d29yZF8yXzA7IH0KKworCQkvL2Rlc2NyaXB0aW9uPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfMl8xKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8yXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGVzY3JpcHRpb25TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzFfMDsgfQorCisJCS8vaGVhZGVyPVBhZ2VIZWFkZXI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlYWRlckFzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNIZWFkZXJBc3NpZ25tZW50XzM7IH0KKworCQkvL1BhZ2VIZWFkZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldEhlYWRlclBhZ2VIZWFkZXJQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjSGVhZGVyUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzNfMDsgfQorCisJCS8vZGV0YWlsPVBhZ2VEZXRhaWwKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGV0YWlsQXNzaWdubWVudF80KCkgeyByZXR1cm4gY0RldGFpbEFzc2lnbm1lbnRfNDsgfQorCisJCS8vUGFnZURldGFpbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGV0YWlsUGFnZURldGFpbFBhcnNlclJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNEZXRhaWxQYWdlRGV0YWlsUGFyc2VyUnVsZUNhbGxfNF8wOyB9CisKKwkJLy9mb290ZXI9UGFnZUZvb3Rlcj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9vdGVyQXNzaWdubWVudF81KCkgeyByZXR1cm4gY0Zvb3RlckFzc2lnbm1lbnRfNTsgfQorCisJCS8vUGFnZUZvb3RlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Rm9vdGVyUGFnZUZvb3RlclBhcnNlclJ1bGVDYWxsXzVfMCgpIHsgcmV0dXJuIGNGb290ZXJQYWdlRm9vdGVyUGFyc2VyUnVsZUNhbGxfNV8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzY7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ29udGFpbmVyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNvbnRhaW5lciIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFnZUhlYWRlclBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BhZ2VEZXRhaWxQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQYWdlRm9vdGVyUGFyc2VyUnVsZUNhbGxfMiA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjR3JpZENlbGxQYXJzZXJSdWxlQ2FsbF8zID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQkKKwkJLy9Db250YWluZXI6CisJCS8vCVBhZ2VIZWFkZXIgfCBQYWdlRGV0YWlsIHwgUGFnZUZvb3RlciB8IEdyaWRDZWxsOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUGFnZUhlYWRlciB8IFBhZ2VEZXRhaWwgfCBQYWdlRm9vdGVyIHwgR3JpZENlbGwKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9QYWdlSGVhZGVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQYWdlSGVhZGVyUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNQYWdlSGVhZGVyUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vUGFnZURldGFpbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFnZURldGFpbFBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUGFnZURldGFpbFBhcnNlclJ1bGVDYWxsXzE7IH0KKworCQkvL1BhZ2VGb290ZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFBhZ2VGb290ZXJQYXJzZXJSdWxlQ2FsbF8yKCkgeyByZXR1cm4gY1BhZ2VGb290ZXJQYXJzZXJSdWxlQ2FsbF8yOyB9CisKKwkJLy9HcmlkQ2VsbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0R3JpZENlbGxQYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY0dyaWRDZWxsUGFyc2VyUnVsZUNhbGxfMzsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQYWdlSGVhZGVyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBhZ2VIZWFkZXIiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNQYWdlSGVhZGVyQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSGVhZGVyS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTaG93T25GaXJzdEFzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU2hvd09uRmlyc3RTaG93T25GaXJzdEtleXdvcmRfM18wID0gKEtleXdvcmQpY1Nob3dPbkZpcnN0QXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIZWlnaHRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlaWdodFZhbHVlQXNzaWdubWVudF81ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSGVpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMCA9IChSdWxlQ2FsbCljSGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlaWdodFVuaXRBc3NpZ25tZW50XzYgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNIZWlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNIZWlnaHRVbml0QXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbGVtZW50c0Fzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCA9IChSdWxlQ2FsbCljRWxlbWVudHNBc3NpZ25tZW50XzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg4KTsKKwkJCisJCS8vUGFnZUhlYWRlcjoKKwkJLy8Je1BhZ2VIZWFkZXJ9ICJoZWFkZXIiICJ7IiBzaG93T25GaXJzdD89InNob3dPbkZpcnN0Ij8gImhlaWdodCIgaGVpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgaGVpZ2h0VW5pdD1Vbml0RW51bQorCQkvLwllbGVtZW50cys9RWxlbWVudCAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97UGFnZUhlYWRlcn0gImhlYWRlciIgInsiIHNob3dPbkZpcnN0Pz0ic2hvd09uRmlyc3QiPyAiaGVpZ2h0IiBoZWlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBoZWlnaHRVbml0PVVuaXRFbnVtCisJCS8vZWxlbWVudHMrPUVsZW1lbnQgIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BhZ2VIZWFkZXJ9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGFnZUhlYWRlckFjdGlvbl8wKCkgeyByZXR1cm4gY1BhZ2VIZWFkZXJBY3Rpb25fMDsgfQorCisJCS8vImhlYWRlciIKKwkJcHVibGljIEtleXdvcmQgZ2V0SGVhZGVyS2V5d29yZF8xKCkgeyByZXR1cm4gY0hlYWRlcktleXdvcmRfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vc2hvd09uRmlyc3Q/PSJzaG93T25GaXJzdCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNob3dPbkZpcnN0QXNzaWdubWVudF8zKCkgeyByZXR1cm4gY1Nob3dPbkZpcnN0QXNzaWdubWVudF8zOyB9CisKKwkJLy8ic2hvd09uRmlyc3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNob3dPbkZpcnN0U2hvd09uRmlyc3RLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTaG93T25GaXJzdFNob3dPbkZpcnN0S2V5d29yZF8zXzA7IH0KKworCQkvLyJoZWlnaHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhlaWdodEtleXdvcmRfNCgpIHsgcmV0dXJuIGNIZWlnaHRLZXl3b3JkXzQ7IH0KKworCQkvL2hlaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlaWdodFZhbHVlQXNzaWdubWVudF81KCkgeyByZXR1cm4gY0hlaWdodFZhbHVlQXNzaWdubWVudF81OyB9CisKKwkJLy9VbnNpZ25lZE51bWJlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGVpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMCgpIHsgcmV0dXJuIGNIZWlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNV8wOyB9CisKKwkJLy9oZWlnaHRVbml0PVVuaXRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlaWdodFVuaXRBc3NpZ25tZW50XzYoKSB7IHJldHVybiBjSGVpZ2h0VW5pdEFzc2lnbm1lbnRfNjsgfQorCisJCS8vVW5pdEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEhlaWdodFVuaXRVbml0RW51bUVudW1SdWxlQ2FsbF82XzAoKSB7IHJldHVybiBjSGVpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzZfMDsgfQorCisJCS8vZWxlbWVudHMrPUVsZW1lbnQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RWxlbWVudHNBc3NpZ25tZW50XzcoKSB7IHJldHVybiBjRWxlbWVudHNBc3NpZ25tZW50Xzc7IH0KKworCQkvL0VsZW1lbnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEVsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCgpIHsgcmV0dXJuIGNFbGVtZW50c0VsZW1lbnRQYXJzZXJSdWxlQ2FsbF83XzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfOCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfODsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBQYWdlRGV0YWlsRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBhZ2VEZXRhaWwiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNQYWdlRGV0YWlsQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGV0YWlsS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbGVtZW50c0Fzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljRWxlbWVudHNBc3NpZ25tZW50XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJCisJCS8vUGFnZURldGFpbDoKKwkJLy8Je1BhZ2VEZXRhaWx9ICJkZXRhaWwiICJ7IiBlbGVtZW50cys9RWxlbWVudCogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1BhZ2VEZXRhaWx9ICJkZXRhaWwiICJ7IiBlbGVtZW50cys9RWxlbWVudCogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1BhZ2VEZXRhaWx9CisJCXB1YmxpYyBBY3Rpb24gZ2V0UGFnZURldGFpbEFjdGlvbl8wKCkgeyByZXR1cm4gY1BhZ2VEZXRhaWxBY3Rpb25fMDsgfQorCisJCS8vImRldGFpbCIKKwkJcHVibGljIEtleXdvcmQgZ2V0RGV0YWlsS2V5d29yZF8xKCkgeyByZXR1cm4gY0RldGFpbEtleXdvcmRfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vZWxlbWVudHMrPUVsZW1lbnQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVsZW1lbnRzQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0VsZW1lbnRzQXNzaWdubWVudF8zOyB9CisKKwkJLy9FbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbGVtZW50c0VsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRWxlbWVudHNFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQ7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGFnZUZvb3RlckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJQYWdlRm9vdGVyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUGFnZUZvb3RlckFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Zvb3RlcktleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU2hvd09uTGFzdEFzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU2hvd09uTGFzdFNob3dPbkxhc3RLZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNTaG93T25MYXN0QXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIZWlnaHRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlaWdodFZhbHVlQXNzaWdubWVudF81ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSGVpZ2h0VmFsdWVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMCA9IChSdWxlQ2FsbCljSGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlaWdodFVuaXRBc3NpZ25tZW50XzYgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNIZWlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNl8wID0gKFJ1bGVDYWxsKWNIZWlnaHRVbml0QXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbGVtZW50c0Fzc2lnbm1lbnRfNyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMCA9IChSdWxlQ2FsbCljRWxlbWVudHNBc3NpZ25tZW50XzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg4KTsKKwkJCisJCS8vUGFnZUZvb3RlcjoKKwkJLy8Je1BhZ2VGb290ZXJ9ICJmb290ZXIiICJ7IiBzaG93T25MYXN0Pz0ic2hvd09uTGFzdCI/ICJoZWlnaHQiIGhlaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIGhlaWdodFVuaXQ9VW5pdEVudW0KKwkJLy8JZWxlbWVudHMrPUVsZW1lbnQgIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1BhZ2VGb290ZXJ9ICJmb290ZXIiICJ7IiBzaG93T25MYXN0Pz0ic2hvd09uTGFzdCI/ICJoZWlnaHQiIGhlaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIGhlaWdodFVuaXQ9VW5pdEVudW0KKwkJLy9lbGVtZW50cys9RWxlbWVudCAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97UGFnZUZvb3Rlcn0KKwkJcHVibGljIEFjdGlvbiBnZXRQYWdlRm9vdGVyQWN0aW9uXzAoKSB7IHJldHVybiBjUGFnZUZvb3RlckFjdGlvbl8wOyB9CisKKwkJLy8iZm9vdGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb290ZXJLZXl3b3JkXzEoKSB7IHJldHVybiBjRm9vdGVyS2V5d29yZF8xOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yOyB9CisKKwkJLy9zaG93T25MYXN0Pz0ic2hvd09uTGFzdCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNob3dPbkxhc3RBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjU2hvd09uTGFzdEFzc2lnbm1lbnRfMzsgfQorCisJCS8vInNob3dPbkxhc3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNob3dPbkxhc3RTaG93T25MYXN0S2V5d29yZF8zXzAoKSB7IHJldHVybiBjU2hvd09uTGFzdFNob3dPbkxhc3RLZXl3b3JkXzNfMDsgfQorCisJCS8vImhlaWdodCIKKwkJcHVibGljIEtleXdvcmQgZ2V0SGVpZ2h0S2V5d29yZF80KCkgeyByZXR1cm4gY0hlaWdodEtleXdvcmRfNDsgfQorCisJCS8vaGVpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SGVpZ2h0VmFsdWVBc3NpZ25tZW50XzUoKSB7IHJldHVybiBjSGVpZ2h0VmFsdWVBc3NpZ25tZW50XzU7IH0KKworCQkvL1Vuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRIZWlnaHRWYWx1ZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNV8wKCkgeyByZXR1cm4gY0hlaWdodFZhbHVlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF81XzA7IH0KKworCQkvL2hlaWdodFVuaXQ9VW5pdEVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SGVpZ2h0VW5pdEFzc2lnbm1lbnRfNigpIHsgcmV0dXJuIGNIZWlnaHRVbml0QXNzaWdubWVudF82OyB9CisKKwkJLy9Vbml0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGVpZ2h0VW5pdFVuaXRFbnVtRW51bVJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNIZWlnaHRVbml0VW5pdEVudW1FbnVtUnVsZUNhbGxfNl8wOyB9CisKKwkJLy9lbGVtZW50cys9RWxlbWVudAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbGVtZW50c0Fzc2lnbm1lbnRfNygpIHsgcmV0dXJuIGNFbGVtZW50c0Fzc2lnbm1lbnRfNzsgfQorCisJCS8vRWxlbWVudAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RWxlbWVudHNFbGVtZW50UGFyc2VyUnVsZUNhbGxfN18wKCkgeyByZXR1cm4gY0VsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzdfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF84OyB9CisJfQorCisJcHVibGljIGNsYXNzIEVsZW1lbnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiRWxlbWVudCIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGl0bGVQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTdWJUaXRsZVBhcnNlclJ1bGVDYWxsXzEgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N1YlN1YlRpdGxlUGFyc2VyUnVsZUNhbGxfMiA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTGFiZWxQYXJzZXJSdWxlQ2FsbF8zID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUZXh0UGFyc2VyUnVsZUNhbGxfNCA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQXV0b1RleHRQYXJzZXJSdWxlQ2FsbF81ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbWFnZVBhcnNlclJ1bGVDYWxsXzYgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0RhdGFtYXJ0VGFibGVQYXJzZXJSdWxlQ2FsbF83ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEYXRhbWFydFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF84ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNHcmlkUGFyc2VyUnVsZUNhbGxfOSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg5KTsKKwkJCisJCS8vLyAqIHwgVGFibGVEc2wgfCBDaGFydERzbCogLyBFbGVtZW50OgorCQkvLwlUaXRsZSB8IFN1YlRpdGxlIHwgU3ViU3ViVGl0bGUgfCBMYWJlbCB8IFRleHQgfCBBdXRvVGV4dCB8IEltYWdlIHwgRGF0YW1hcnRUYWJsZSB8IERhdGFtYXJ0VGFibGVQcm9wZXJ0eSB8IEdyaWQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9UaXRsZSB8IFN1YlRpdGxlIHwgU3ViU3ViVGl0bGUgfCBMYWJlbCB8IFRleHQgfCBBdXRvVGV4dCB8IEltYWdlIHwgRGF0YW1hcnRUYWJsZSB8IERhdGFtYXJ0VGFibGVQcm9wZXJ0eSB8IEdyaWQKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9UaXRsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGl0bGVQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1RpdGxlUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vU3ViVGl0bGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN1YlRpdGxlUGFyc2VyUnVsZUNhbGxfMSgpIHsgcmV0dXJuIGNTdWJUaXRsZVBhcnNlclJ1bGVDYWxsXzE7IH0KKworCQkvL1N1YlN1YlRpdGxlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdWJTdWJUaXRsZVBhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjU3ViU3ViVGl0bGVQYXJzZXJSdWxlQ2FsbF8yOyB9CisKKwkJLy9MYWJlbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TGFiZWxQYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY0xhYmVsUGFyc2VyUnVsZUNhbGxfMzsgfQorCisJCS8vVGV4dAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGV4dFBhcnNlclJ1bGVDYWxsXzQoKSB7IHJldHVybiBjVGV4dFBhcnNlclJ1bGVDYWxsXzQ7IH0KKworCQkvL0F1dG9UZXh0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRBdXRvVGV4dFBhcnNlclJ1bGVDYWxsXzUoKSB7IHJldHVybiBjQXV0b1RleHRQYXJzZXJSdWxlQ2FsbF81OyB9CisKKwkJLy9JbWFnZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1hZ2VQYXJzZXJSdWxlQ2FsbF82KCkgeyByZXR1cm4gY0ltYWdlUGFyc2VyUnVsZUNhbGxfNjsgfQorCisJCS8vRGF0YW1hcnRUYWJsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGF0YW1hcnRUYWJsZVBhcnNlclJ1bGVDYWxsXzcoKSB7IHJldHVybiBjRGF0YW1hcnRUYWJsZVBhcnNlclJ1bGVDYWxsXzc7IH0KKworCQkvL0RhdGFtYXJ0VGFibGVQcm9wZXJ0eQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfOCgpIHsgcmV0dXJuIGNEYXRhbWFydFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF84OyB9CisKKwkJLy9HcmlkCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRHcmlkUGFyc2VyUnVsZUNhbGxfOSgpIHsgcmV0dXJuIGNHcmlkUGFyc2VyUnVsZUNhbGxfOTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBHcmlkRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkdyaWQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNHcmlkQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjR3JpZEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzIgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBc0tleXdvcmRfMl8wID0gKEtleXdvcmQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY05hbWVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSb3dzQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUm93c0dyaWRSb3dQYXJzZXJSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1Jvd3NBc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJCisJCS8vR3JpZDoKKwkJLy8Je0dyaWR9ICJncmlkIiAoImFzIiBuYW1lPUlEKT8gInsiIHJvd3MrPUdyaWRSb3cqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tHcmlkfSAiZ3JpZCIgKCJhcyIgbmFtZT1JRCk/ICJ7IiByb3dzKz1HcmlkUm93KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97R3JpZH0KKwkJcHVibGljIEFjdGlvbiBnZXRHcmlkQWN0aW9uXzAoKSB7IHJldHVybiBjR3JpZEFjdGlvbl8wOyB9CisKKwkJLy8iZ3JpZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0R3JpZEtleXdvcmRfMSgpIHsgcmV0dXJuIGNHcmlkS2V5d29yZF8xOyB9CisKKwkJLy8oImFzIiBuYW1lPUlEKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzIoKSB7IHJldHVybiBjR3JvdXBfMjsgfQorCisJCS8vImFzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBc0tleXdvcmRfMl8wKCkgeyByZXR1cm4gY0FzS2V5d29yZF8yXzA7IH0KKworCQkvL25hbWU9SUQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzJfMTsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzAoKSB7IHJldHVybiBjTmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMzsgfQorCisJCS8vcm93cys9R3JpZFJvdyoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Um93c0Fzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNSb3dzQXNzaWdubWVudF80OyB9CisKKwkJLy9HcmlkUm93CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81OyB9CisJfQorCisJcHVibGljIGNsYXNzIEdyaWRSb3dFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiR3JpZFJvdyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0dyaWRSb3dBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSb3dLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQXNLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNHcm91cF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzAgPSAoUnVsZUNhbGwpY05hbWVBc3NpZ25tZW50XzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDZWxsc0Fzc2lnbm1lbnRfNSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NlbGxzR3JpZENlbGxQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY0NlbGxzQXNzaWdubWVudF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCQorCQkvL0dyaWRSb3c6CisJCS8vCXtHcmlkUm93fSAicm93IiAoImFzIiBuYW1lPUlEKT8gKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICJ7IiBjZWxscys9R3JpZENlbGwqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tHcmlkUm93fSAicm93IiAoImFzIiBuYW1lPUlEKT8gKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICJ7IiBjZWxscys9R3JpZENlbGwqICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tHcmlkUm93fQorCQlwdWJsaWMgQWN0aW9uIGdldEdyaWRSb3dBY3Rpb25fMCgpIHsgcmV0dXJuIGNHcmlkUm93QWN0aW9uXzA7IH0KKworCQkvLyJyb3ciCisJCXB1YmxpYyBLZXl3b3JkIGdldFJvd0tleXdvcmRfMSgpIHsgcmV0dXJuIGNSb3dLZXl3b3JkXzE7IH0KKworCQkvLygiYXMiIG5hbWU9SUQpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisKKwkJLy8iYXMiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFzS2V5d29yZF8yXzAoKSB7IHJldHVybiBjQXNLZXl3b3JkXzJfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMl8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wOyB9CisKKwkJLy8oInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzMoKSB7IHJldHVybiBjR3JvdXBfMzsgfQorCisJCS8vInN0eWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHlsZUtleXdvcmRfM18wKCkgeyByZXR1cm4gY1N0eWxlS2V5d29yZF8zXzA7IH0KKworCQkvL3N0eWxlPVtTdHlsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U3R5bGVBc3NpZ25tZW50XzNfMSgpIHsgcmV0dXJuIGNTdHlsZUFzc2lnbm1lbnRfM18xOyB9CisKKwkJLy9bU3R5bGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfM18xXzAoKSB7IHJldHVybiBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8zXzFfMF8xKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCisJCS8vY2VsbHMrPUdyaWRDZWxsKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDZWxsc0Fzc2lnbm1lbnRfNSgpIHsgcmV0dXJuIGNDZWxsc0Fzc2lnbm1lbnRfNTsgfQorCisJCS8vR3JpZENlbGwKKwkJcHVibGljIFJ1bGVDYWxsIGdldENlbGxzR3JpZENlbGxQYXJzZXJSdWxlQ2FsbF81XzAoKSB7IHJldHVybiBjQ2VsbHNHcmlkQ2VsbFBhcnNlclJ1bGVDYWxsXzVfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82OyB9CisJfQorCisJcHVibGljIGNsYXNzIEdyaWRDZWxsRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkdyaWRDZWxsIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjR3JpZENlbGxBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDZWxsS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FzS2V5d29yZF8yXzAgPSAoS2V5d29yZCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ29sdW1uc3BhbktleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NvbHVtbnNwYW5Bc3NpZ25tZW50XzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ29sdW1uc3BhbklOVFRlcm1pbmFsUnVsZUNhbGxfM18xXzAgPSAoUnVsZUNhbGwpY0NvbHVtbnNwYW5Bc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudHNBc3NpZ25tZW50XzUgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbGVtZW50c0VsZW1lbnRQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY0VsZW1lbnRzQXNzaWdubWVudF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCQorCQkvL0dyaWRDZWxsOgorCQkvLwl7R3JpZENlbGx9ICJjZWxsIiAoImFzIiBuYW1lPUlEKT8gKCJjb2x1bW5zcGFuIiBjb2x1bW5zcGFuPUlOVCk/ICJ7IiBlbGVtZW50cys9RWxlbWVudCogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0dyaWRDZWxsfSAiY2VsbCIgKCJhcyIgbmFtZT1JRCk/ICgiY29sdW1uc3BhbiIgY29sdW1uc3Bhbj1JTlQpPyAieyIgZWxlbWVudHMrPUVsZW1lbnQqICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tHcmlkQ2VsbH0KKwkJcHVibGljIEFjdGlvbiBnZXRHcmlkQ2VsbEFjdGlvbl8wKCkgeyByZXR1cm4gY0dyaWRDZWxsQWN0aW9uXzA7IH0KKworCQkvLyJjZWxsIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDZWxsS2V5d29yZF8xKCkgeyByZXR1cm4gY0NlbGxLZXl3b3JkXzE7IH0KKworCQkvLygiYXMiIG5hbWU9SUQpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisKKwkJLy8iYXMiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFzS2V5d29yZF8yXzAoKSB7IHJldHVybiBjQXNLZXl3b3JkXzJfMDsgfQorCisJCS8vbmFtZT1JRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMl8xOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMCgpIHsgcmV0dXJuIGNOYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wOyB9CisKKwkJLy8oImNvbHVtbnNwYW4iIGNvbHVtbnNwYW49SU5UKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzMoKSB7IHJldHVybiBjR3JvdXBfMzsgfQorCisJCS8vImNvbHVtbnNwYW4iCisJCXB1YmxpYyBLZXl3b3JkIGdldENvbHVtbnNwYW5LZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNDb2x1bW5zcGFuS2V5d29yZF8zXzA7IH0KKworCQkvL2NvbHVtbnNwYW49SU5UCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldENvbHVtbnNwYW5Bc3NpZ25tZW50XzNfMSgpIHsgcmV0dXJuIGNDb2x1bW5zcGFuQXNzaWdubWVudF8zXzE7IH0KKworCQkvL0lOVAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29sdW1uc3BhbklOVFRlcm1pbmFsUnVsZUNhbGxfM18xXzAoKSB7IHJldHVybiBjQ29sdW1uc3BhbklOVFRlcm1pbmFsUnVsZUNhbGxfM18xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80KCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQ7IH0KKworCQkvL2VsZW1lbnRzKz1FbGVtZW50KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbGVtZW50c0Fzc2lnbm1lbnRfNSgpIHsgcmV0dXJuIGNFbGVtZW50c0Fzc2lnbm1lbnRfNTsgfQorCisJCS8vRWxlbWVudAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RWxlbWVudHNFbGVtZW50UGFyc2VyUnVsZUNhbGxfNV8wKCkgeyByZXR1cm4gY0VsZW1lbnRzRWxlbWVudFBhcnNlclJ1bGVDYWxsXzVfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF82OyB9CisJfQorCisJcHVibGljIGNsYXNzIERhdGFtYXJ0VGFibGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiRGF0YW1hcnRUYWJsZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUYWJsZUtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfMV8wID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8xXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RldGFpbGhlYWRlckFzc2lnbm1lbnRfM18wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RldGFpbGhlYWRlckRldGFpbGhlYWRlcktleXdvcmRfM18wXzAgPSAoS2V5d29yZCljRGV0YWlsaGVhZGVyQXNzaWdubWVudF8zXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzEgPSAoR3JvdXApY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF8zXzFfMCA9IChLZXl3b3JkKWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlYWRlcnN0eWxlQXNzaWdubWVudF8zXzFfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNIZWFkZXJzdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfM18xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljSGVhZGVyc3R5bGVBc3NpZ25tZW50XzNfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wXzEgPSAoUnVsZUNhbGwpY0hlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNCA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RldGFpbGZvb3RlckFzc2lnbm1lbnRfNF8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfNF8wXzAgPSAoS2V5d29yZCljRGV0YWlsZm9vdGVyQXNzaWdubWVudF80XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF80XzEgPSAoR3JvdXApY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF80XzFfMCA9IChLZXl3b3JkKWNHcm91cF80XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Zvb3RlcnN0eWxlQXNzaWdubWVudF80XzFfMSA9IChBc3NpZ25tZW50KWNHcm91cF80XzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNGb290ZXJzdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfNF8xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRm9vdGVyc3R5bGVBc3NpZ25tZW50XzRfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9vdGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF80XzFfMV8wXzEgPSAoUnVsZUNhbGwpY0Zvb3RlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV80XzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNHcm91cHNBc3NpZ25tZW50XzUgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNHcm91cHNEYXRhbWFydFRhYmxlR3JvdXBQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY0dyb3Vwc0Fzc2lnbm1lbnRfNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGV0YWlsQXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGV0YWlsRGF0YW1hcnRUYWJsZURldGFpbFBhcnNlclJ1bGVDYWxsXzZfMCA9IChSdWxlQ2FsbCljRGV0YWlsQXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNyA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCQorCQkvL0RhdGFtYXJ0VGFibGU6CisJCS8vCSJ0YWJsZSIgLyAqZGF0YW1hcnRSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dICgnYXMnIG5hbWU9SUQpPyogLyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8gInsiCisJCS8vCShkZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiICgic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPyk/IChkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiCisJCS8vCWZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/IGdyb3Vwcys9RGF0YW1hcnRUYWJsZUdyb3VwKiBkZXRhaWw9RGF0YW1hcnRUYWJsZURldGFpbCAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8idGFibGUiIC8gKmRhdGFtYXJ0UmVmPVtkYXRhbWFydDo6RGF0YW1hcnREZWZpbml0aW9uXSAoJ2FzJyBuYW1lPUlEKT8qIC8gKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICJ7IgorCQkvLyhkZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiICgic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPyk/IChkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiCisJCS8vZm9vdGVyc3R5bGU9W1N0eWxlXSk/KT8gZ3JvdXBzKz1EYXRhbWFydFRhYmxlR3JvdXAqIGRldGFpbD1EYXRhbWFydFRhYmxlRGV0YWlsICJ9IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJ0YWJsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VGFibGVLZXl3b3JkXzAoKSB7IHJldHVybiBjVGFibGVLZXl3b3JkXzA7IH0KKworCQkvLygic3R5bGUiIHN0eWxlPVtTdHlsZV0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMSgpIHsgcmV0dXJuIGNHcm91cF8xOyB9CisKKwkJLy8ic3R5bGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlS2V5d29yZF8xXzAoKSB7IHJldHVybiBjU3R5bGVLZXl3b3JkXzFfMDsgfQorCisJCS8vc3R5bGU9W1N0eWxlXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTdHlsZUFzc2lnbm1lbnRfMV8xKCkgeyByZXR1cm4gY1N0eWxlQXNzaWdubWVudF8xXzE7IH0KKworCQkvL1tTdHlsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8xXzFfMCgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMV8wXzEoKSB7IHJldHVybiBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8xXzFfMF8xOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yOyB9CisKKwkJLy8oZGV0YWlsaGVhZGVyPz0iZGV0YWlsaGVhZGVyIiAoInN0eWxlIiBoZWFkZXJzdHlsZT1bU3R5bGVdKT8pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisKKwkJLy9kZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERldGFpbGhlYWRlckFzc2lnbm1lbnRfM18wKCkgeyByZXR1cm4gY0RldGFpbGhlYWRlckFzc2lnbm1lbnRfM18wOyB9CisKKwkJLy8iZGV0YWlsaGVhZGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXREZXRhaWxoZWFkZXJEZXRhaWxoZWFkZXJLZXl3b3JkXzNfMF8wKCkgeyByZXR1cm4gY0RldGFpbGhlYWRlckRldGFpbGhlYWRlcktleXdvcmRfM18wXzA7IH0KKworCQkvLygic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfM18xKCkgeyByZXR1cm4gY0dyb3VwXzNfMTsgfQorCisJCS8vInN0eWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHlsZUtleXdvcmRfM18xXzAoKSB7IHJldHVybiBjU3R5bGVLZXl3b3JkXzNfMV8wOyB9CisKKwkJLy9oZWFkZXJzdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlYWRlcnN0eWxlQXNzaWdubWVudF8zXzFfMSgpIHsgcmV0dXJuIGNIZWFkZXJzdHlsZUFzc2lnbm1lbnRfM18xXzE7IH0KKworCQkvL1tTdHlsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEhlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMV8wKCkgeyByZXR1cm4gY0hlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wXzEoKSB7IHJldHVybiBjSGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8zXzFfMV8wXzE7IH0KKworCQkvLyhkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiIGZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80KCkgeyByZXR1cm4gY0dyb3VwXzQ7IH0KKworCQkvL2RldGFpbGZvb3Rlcj89ImRldGFpbGZvb3RlciIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGV0YWlsZm9vdGVyQXNzaWdubWVudF80XzAoKSB7IHJldHVybiBjRGV0YWlsZm9vdGVyQXNzaWdubWVudF80XzA7IH0KKworCQkvLyJkZXRhaWxmb290ZXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldERldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfNF8wXzAoKSB7IHJldHVybiBjRGV0YWlsZm9vdGVyRGV0YWlsZm9vdGVyS2V5d29yZF80XzBfMDsgfQorCisJCS8vKCJzdHlsZSIgZm9vdGVyc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80XzEoKSB7IHJldHVybiBjR3JvdXBfNF8xOyB9CisKKwkJLy8ic3R5bGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlS2V5d29yZF80XzFfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfNF8xXzA7IH0KKworCQkvL2Zvb3RlcnN0eWxlPVtTdHlsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9vdGVyc3R5bGVBc3NpZ25tZW50XzRfMV8xKCkgeyByZXR1cm4gY0Zvb3RlcnN0eWxlQXNzaWdubWVudF80XzFfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0Rm9vdGVyc3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzRfMV8xXzAoKSB7IHJldHVybiBjRm9vdGVyc3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzRfMV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb290ZXJzdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzRfMV8xXzBfMSgpIHsgcmV0dXJuIGNGb290ZXJzdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzRfMV8xXzBfMTsgfQorCisJCS8vZ3JvdXBzKz1EYXRhbWFydFRhYmxlR3JvdXAqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyb3Vwc0Fzc2lnbm1lbnRfNSgpIHsgcmV0dXJuIGNHcm91cHNBc3NpZ25tZW50XzU7IH0KKworCQkvL0RhdGFtYXJ0VGFibGVHcm91cAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0R3JvdXBzRGF0YW1hcnRUYWJsZUdyb3VwUGFyc2VyUnVsZUNhbGxfNV8wKCkgeyByZXR1cm4gY0dyb3Vwc0RhdGFtYXJ0VGFibGVHcm91cFBhcnNlclJ1bGVDYWxsXzVfMDsgfQorCisJCS8vZGV0YWlsPURhdGFtYXJ0VGFibGVEZXRhaWwKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGV0YWlsQXNzaWdubWVudF82KCkgeyByZXR1cm4gY0RldGFpbEFzc2lnbm1lbnRfNjsgfQorCisJCS8vRGF0YW1hcnRUYWJsZURldGFpbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGV0YWlsRGF0YW1hcnRUYWJsZURldGFpbFBhcnNlclJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNEZXRhaWxEYXRhbWFydFRhYmxlRGV0YWlsUGFyc2VyUnVsZUNhbGxfNl8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzc7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgRGF0YW1hcnRUYWJsZUdyb3VwRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGFtYXJ0VGFibGVHcm91cCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHcm91cEtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCeUtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjR3JvdXBpbmdSZWZBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNHcm91cGluZ1JlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0dyb3VwaW5nUmVmQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjR3JvdXBpbmdSZWZEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xID0gKFJ1bGVDYWxsKWNHcm91cGluZ1JlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlYWRlckFzc2lnbm1lbnRfNSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0hlYWRlckRhdGFtYXJ0VGFibGVHcm91cEhlYWRlclBhcnNlclJ1bGVDYWxsXzVfMCA9IChSdWxlQ2FsbCljSGVhZGVyQXNzaWdubWVudF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RldGFpbGhlYWRlckRldGFpbGhlYWRlcktleXdvcmRfNl8wXzAgPSAoS2V5d29yZCljRGV0YWlsaGVhZGVyQXNzaWdubWVudF82XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF82XzEgPSAoR3JvdXApY0dyb3VwXzYuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF82XzFfMCA9IChLZXl3b3JkKWNHcm91cF82XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hlYWRlcnN0eWxlQXNzaWdubWVudF82XzFfMSA9IChBc3NpZ25tZW50KWNHcm91cF82XzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNIZWFkZXJzdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfNl8xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljSGVhZGVyc3R5bGVBc3NpZ25tZW50XzZfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMV8wXzEgPSAoUnVsZUNhbGwpY0hlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV82XzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RldGFpbGZvb3RlckFzc2lnbm1lbnRfN18wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfN18wXzAgPSAoS2V5d29yZCljRGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF83XzEgPSAoR3JvdXApY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF83XzFfMCA9IChLZXl3b3JkKWNHcm91cF83XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Zvb3RlcnN0eWxlQXNzaWdubWVudF83XzFfMSA9IChBc3NpZ25tZW50KWNHcm91cF83XzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNGb290ZXJzdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfN18xXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRm9vdGVyc3R5bGVBc3NpZ25tZW50XzdfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRm9vdGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF83XzFfMV8wXzEgPSAoUnVsZUNhbGwpY0Zvb3RlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV83XzFfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb290ZXJBc3NpZ25tZW50XzggPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb290ZXJEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJQYXJzZXJSdWxlQ2FsbF84XzAgPSAoUnVsZUNhbGwpY0Zvb3RlckFzc2lnbm1lbnRfOC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzkgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDkpOworCQkKKwkJLy9EYXRhbWFydFRhYmxlR3JvdXA6CisJCS8vCSJncm91cCIgbmFtZT1JRCAiYnkiIGdyb3VwaW5nUmVmPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0gInsiIGhlYWRlcj1EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI/CisJCS8vCShkZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiICgic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPyk/IChkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiCisJCS8vCWZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/IGZvb3Rlcj1EYXRhbWFydFRhYmxlR3JvdXBGb290ZXI/ICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJncm91cCIgbmFtZT1JRCAiYnkiIGdyb3VwaW5nUmVmPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0gInsiIGhlYWRlcj1EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI/CisJCS8vKGRldGFpbGhlYWRlcj89ImRldGFpbGhlYWRlciIgKCJzdHlsZSIgaGVhZGVyc3R5bGU9W1N0eWxlXSk/KT8gKGRldGFpbGZvb3Rlcj89ImRldGFpbGZvb3RlciIgKCJzdHlsZSIKKwkJLy9mb290ZXJzdHlsZT1bU3R5bGVdKT8pPyBmb290ZXI9RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyPyAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iZ3JvdXAiCisJCXB1YmxpYyBLZXl3b3JkIGdldEdyb3VwS2V5d29yZF8wKCkgeyByZXR1cm4gY0dyb3VwS2V5d29yZF8wOyB9CisKKwkJLy9uYW1lPUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE5hbWVBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMTsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY05hbWVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wOyB9CisKKwkJLy8iYnkiCisJCXB1YmxpYyBLZXl3b3JkIGdldEJ5S2V5d29yZF8yKCkgeyByZXR1cm4gY0J5S2V5d29yZF8yOyB9CisKKwkJLy9ncm91cGluZ1JlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyb3VwaW5nUmVmQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0dyb3VwaW5nUmVmQXNzaWdubWVudF8zOyB9CisKKwkJLy9bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRHcm91cGluZ1JlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAoKSB7IHJldHVybiBjR3JvdXBpbmdSZWZEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfM18wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0R3JvdXBpbmdSZWZEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xKCkgeyByZXR1cm4gY0dyb3VwaW5nUmVmRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCisJCS8vaGVhZGVyPURhdGFtYXJ0VGFibGVHcm91cEhlYWRlcj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SGVhZGVyQXNzaWdubWVudF81KCkgeyByZXR1cm4gY0hlYWRlckFzc2lnbm1lbnRfNTsgfQorCisJCS8vRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRIZWFkZXJEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJQYXJzZXJSdWxlQ2FsbF81XzAoKSB7IHJldHVybiBjSGVhZGVyRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyUGFyc2VyUnVsZUNhbGxfNV8wOyB9CisKKwkJLy8oZGV0YWlsaGVhZGVyPz0iZGV0YWlsaGVhZGVyIiAoInN0eWxlIiBoZWFkZXJzdHlsZT1bU3R5bGVdKT8pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNigpIHsgcmV0dXJuIGNHcm91cF82OyB9CisKKwkJLy9kZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wKCkgeyByZXR1cm4gY0RldGFpbGhlYWRlckFzc2lnbm1lbnRfNl8wOyB9CisKKwkJLy8iZGV0YWlsaGVhZGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXREZXRhaWxoZWFkZXJEZXRhaWxoZWFkZXJLZXl3b3JkXzZfMF8wKCkgeyByZXR1cm4gY0RldGFpbGhlYWRlckRldGFpbGhlYWRlcktleXdvcmRfNl8wXzA7IH0KKworCQkvLygic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNl8xKCkgeyByZXR1cm4gY0dyb3VwXzZfMTsgfQorCisJCS8vInN0eWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHlsZUtleXdvcmRfNl8xXzAoKSB7IHJldHVybiBjU3R5bGVLZXl3b3JkXzZfMV8wOyB9CisKKwkJLy9oZWFkZXJzdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhlYWRlcnN0eWxlQXNzaWdubWVudF82XzFfMSgpIHsgcmV0dXJuIGNIZWFkZXJzdHlsZUFzc2lnbm1lbnRfNl8xXzE7IH0KKworCQkvL1tTdHlsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldEhlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV82XzFfMV8wKCkgeyByZXR1cm4gY0hlYWRlcnN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV82XzFfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMV8wXzEoKSB7IHJldHVybiBjSGVhZGVyc3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF82XzFfMV8wXzE7IH0KKworCQkvLyhkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiIGZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF83KCkgeyByZXR1cm4gY0dyb3VwXzc7IH0KKworCQkvL2RldGFpbGZvb3Rlcj89ImRldGFpbGZvb3RlciIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzAoKSB7IHJldHVybiBjRGV0YWlsZm9vdGVyQXNzaWdubWVudF83XzA7IH0KKworCQkvLyJkZXRhaWxmb290ZXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldERldGFpbGZvb3RlckRldGFpbGZvb3RlcktleXdvcmRfN18wXzAoKSB7IHJldHVybiBjRGV0YWlsZm9vdGVyRGV0YWlsZm9vdGVyS2V5d29yZF83XzBfMDsgfQorCisJCS8vKCJzdHlsZSIgZm9vdGVyc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF83XzEoKSB7IHJldHVybiBjR3JvdXBfN18xOyB9CisKKwkJLy8ic3R5bGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlS2V5d29yZF83XzFfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfN18xXzA7IH0KKworCQkvL2Zvb3RlcnN0eWxlPVtTdHlsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9vdGVyc3R5bGVBc3NpZ25tZW50XzdfMV8xKCkgeyByZXR1cm4gY0Zvb3RlcnN0eWxlQXNzaWdubWVudF83XzFfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0Rm9vdGVyc3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzdfMV8xXzAoKSB7IHJldHVybiBjRm9vdGVyc3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzdfMV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb290ZXJzdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzdfMV8xXzBfMSgpIHsgcmV0dXJuIGNGb290ZXJzdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzdfMV8xXzBfMTsgfQorCisJCS8vZm9vdGVyPURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9vdGVyQXNzaWdubWVudF84KCkgeyByZXR1cm4gY0Zvb3RlckFzc2lnbm1lbnRfODsgfQorCisJCS8vRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb290ZXJEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJQYXJzZXJSdWxlQ2FsbF84XzAoKSB7IHJldHVybiBjRm9vdGVyRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyUGFyc2VyUnVsZUNhbGxfOF8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzkoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzk7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGFtYXJ0VGFibGVHcm91cEhlYWRlciIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlckFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0hlYWRlcktleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzIgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSb3dzQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUm93c0dyaWRSb3dQYXJzZXJSdWxlQ2FsbF80XzAgPSAoUnVsZUNhbGwpY1Jvd3NBc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJCisJCS8vRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOgorCQkvLwl7RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyfSAiaGVhZGVyIiAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8gInsiIHJvd3MrPUdyaWRSb3cqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJ9ICJoZWFkZXIiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAieyIgcm93cys9R3JpZFJvdyogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcn0KKwkJcHVibGljIEFjdGlvbiBnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY3Rpb25fMCgpIHsgcmV0dXJuIGNEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY3Rpb25fMDsgfQorCisJCS8vImhlYWRlciIKKwkJcHVibGljIEtleXdvcmQgZ2V0SGVhZGVyS2V5d29yZF8xKCkgeyByZXR1cm4gY0hlYWRlcktleXdvcmRfMTsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8yKCkgeyByZXR1cm4gY0dyb3VwXzI7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfMl8wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzJfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wXzE7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzM7IH0KKworCQkvL3Jvd3MrPUdyaWRSb3cqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJvd3NBc3NpZ25tZW50XzQoKSB7IHJldHVybiBjUm93c0Fzc2lnbm1lbnRfNDsgfQorCisJCS8vR3JpZFJvdworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um93c0dyaWRSb3dQYXJzZXJSdWxlQ2FsbF80XzAoKSB7IHJldHVybiBjUm93c0dyaWRSb3dQYXJzZXJSdWxlQ2FsbF80XzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNSgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRm9vdGVyS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF8yXzAgPSAoS2V5d29yZCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3R5bGVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNTdHlsZUFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMF8xID0gKFJ1bGVDYWxsKWNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Jvd3NBc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljUm93c0Fzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzUgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQkKKwkJLy9EYXRhbWFydFRhYmxlR3JvdXBGb290ZXI6CisJCS8vCXtEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJ9ICJmb290ZXIiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAieyIgcm93cys9R3JpZFJvdyogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0RhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcn0gImZvb3RlciIgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICJ7IiByb3dzKz1HcmlkUm93KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyfQorCQlwdWJsaWMgQWN0aW9uIGdldERhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjdGlvbl8wKCkgeyByZXR1cm4gY0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlckFjdGlvbl8wOyB9CisKKwkJLy8iZm9vdGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGb290ZXJLZXl3b3JkXzEoKSB7IHJldHVybiBjRm9vdGVyS2V5d29yZF8xOyB9CisKKwkJLy8oInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzIoKSB7IHJldHVybiBjR3JvdXBfMjsgfQorCisJCS8vInN0eWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHlsZUtleXdvcmRfMl8wKCkgeyByZXR1cm4gY1N0eWxlS2V5d29yZF8yXzA7IH0KKworCQkvL3N0eWxlPVtTdHlsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U3R5bGVBc3NpZ25tZW50XzJfMSgpIHsgcmV0dXJuIGNTdHlsZUFzc2lnbm1lbnRfMl8xOyB9CisKKwkJLy9bU3R5bGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAoKSB7IHJldHVybiBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMF8xKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMzsgfQorCisJCS8vcm93cys9R3JpZFJvdyoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Um93c0Fzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNSb3dzQXNzaWdubWVudF80OyB9CisKKwkJLy9HcmlkUm93CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNSb3dzR3JpZFJvd1BhcnNlclJ1bGVDYWxsXzRfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF81OyB9CisJfQorCisJcHVibGljIGNsYXNzIERhdGFtYXJ0VGFibGVEZXRhaWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiRGF0YW1hcnRUYWJsZURldGFpbCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0RhdGFtYXJ0VGFibGVEZXRhaWxBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEZXRhaWxzS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF8yXzAgPSAoS2V5d29yZCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3R5bGVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNTdHlsZUFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMF8xID0gKFJ1bGVDYWxsKWNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzXzMgPSAoQWx0ZXJuYXRpdmVzKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQWxsS2V5d29yZF8zXzAgPSAoS2V5d29yZCljQWx0ZXJuYXRpdmVzXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8zXzEgPSAoR3JvdXApY0FsdGVybmF0aXZlc18zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMCA9IChLZXl3b3JkKWNHcm91cF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NvbHVtbkZvcm1hdHRlcnNBc3NpZ25tZW50XzNfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NvbHVtbkZvcm1hdHRlcnNEYXRhbWFydFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF8zXzFfMV8wID0gKFJ1bGVDYWxsKWNDb2x1bW5Gb3JtYXR0ZXJzQXNzaWdubWVudF8zXzFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMV8yID0gKEtleXdvcmQpY0dyb3VwXzNfMS5lQ29udGVudHMoKS5nZXQoMik7CisJCQorCQkvL0RhdGFtYXJ0VGFibGVEZXRhaWw6CisJCS8vCXtEYXRhbWFydFRhYmxlRGV0YWlsfSAiZGV0YWlscyIgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICgiYWxsIiB8ICJ7IiBjb2x1bW5Gb3JtYXR0ZXJzKz1EYXRhbWFydFRhYmxlUHJvcGVydHkqICJ9Iik7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97RGF0YW1hcnRUYWJsZURldGFpbH0gImRldGFpbHMiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAoImFsbCIgfCAieyIgY29sdW1uRm9ybWF0dGVycys9RGF0YW1hcnRUYWJsZVByb3BlcnR5KiAifSIpCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0RhdGFtYXJ0VGFibGVEZXRhaWx9CisJCXB1YmxpYyBBY3Rpb24gZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjdGlvbl8wKCkgeyByZXR1cm4gY0RhdGFtYXJ0VGFibGVEZXRhaWxBY3Rpb25fMDsgfQorCisJCS8vImRldGFpbHMiCisJCXB1YmxpYyBLZXl3b3JkIGdldERldGFpbHNLZXl3b3JkXzEoKSB7IHJldHVybiBjRGV0YWlsc0tleXdvcmRfMTsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8yKCkgeyByZXR1cm4gY0dyb3VwXzI7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfMl8wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzJfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wXzE7IH0KKworCQkvLyJhbGwiIHwgInsiIGNvbHVtbkZvcm1hdHRlcnMrPURhdGFtYXJ0VGFibGVQcm9wZXJ0eSogIn0iCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzXzMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzXzM7IH0KKworCQkvLyJhbGwiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFsbEtleXdvcmRfM18wKCkgeyByZXR1cm4gY0FsbEtleXdvcmRfM18wOyB9CisKKwkJLy8ieyIgY29sdW1uRm9ybWF0dGVycys9RGF0YW1hcnRUYWJsZVByb3BlcnR5KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzNfMSgpIHsgcmV0dXJuIGNHcm91cF8zXzE7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMCgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMDsgfQorCisJCS8vY29sdW1uRm9ybWF0dGVycys9RGF0YW1hcnRUYWJsZVByb3BlcnR5KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDb2x1bW5Gb3JtYXR0ZXJzQXNzaWdubWVudF8zXzFfMSgpIHsgcmV0dXJuIGNDb2x1bW5Gb3JtYXR0ZXJzQXNzaWdubWVudF8zXzFfMTsgfQorCisJCS8vRGF0YW1hcnRUYWJsZVByb3BlcnR5CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDb2x1bW5Gb3JtYXR0ZXJzRGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpIHsgcmV0dXJuIGNDb2x1bW5Gb3JtYXR0ZXJzRGF0YW1hcnRUYWJsZVByb3BlcnR5UGFyc2VyUnVsZUNhbGxfM18xXzFfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzFfMigpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18xXzI7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgRGF0YW1hcnRUYWJsZVByb3BlcnR5RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGFtYXJ0VGFibGVQcm9wZXJ0eSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb2x1bW5Bc3NpZ25tZW50XzAgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb2x1bW5UYWJsZVZhbHVlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzBfMCA9IChSdWxlQ2FsbCljQ29sdW1uQXNzaWdubWVudF8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBVbm9yZGVyZWRHcm91cCBjVW5vcmRlcmVkR3JvdXBfMSA9IChVbm9yZGVyZWRHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8xXzAgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF8xXzBfMCA9IChLZXl3b3JkKWNHcm91cF8xXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8xXzBfMSA9IChBc3NpZ25tZW50KWNHcm91cF8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMV8wXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzFfMF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMV8wXzEgPSAoUnVsZUNhbGwpY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8xXzBfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMV8xID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNIYXNJbWFnZUFzc2lnbm1lbnRfMV8xXzAgPSAoQXNzaWdubWVudCljR3JvdXBfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIYXNJbWFnZUltYWdlS2V5d29yZF8xXzFfMF8wID0gKEtleXdvcmQpY0hhc0ltYWdlQXNzaWdubWVudF8xXzFfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1hZ2VBc3NpZ25tZW50XzFfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzFfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ltYWdlVGFibGVJbWFnZVBhcnNlclJ1bGVDYWxsXzFfMV8xXzAgPSAoUnVsZUNhbGwpY0ltYWdlQXNzaWdubWVudF8xXzFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzFfMiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMS5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSW50ZXJ2YWxzS2V5d29yZF8xXzJfMCA9IChLZXl3b3JkKWNHcm91cF8xXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hpZGVMYWJlbEludGVydmFsQXNzaWdubWVudF8xXzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8xXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0hpZGVMYWJlbEludGVydmFsSGlkZWxhYmVsS2V5d29yZF8xXzJfMV8wID0gKEtleXdvcmQpY0hpZGVMYWJlbEludGVydmFsQXNzaWdubWVudF8xXzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIgPSAoS2V5d29yZCljR3JvdXBfMV8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJbnRlcnZhbHNBc3NpZ25tZW50XzFfMl8zID0gKEFzc2lnbm1lbnQpY0dyb3VwXzFfMi5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ludGVydmFsc1RhYmxlSW50ZXJ2YWxQYXJzZXJSdWxlQ2FsbF8xXzJfM18wID0gKFJ1bGVDYWxsKWNJbnRlcnZhbHNBc3NpZ25tZW50XzFfMl8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQgPSAoS2V5d29yZCljR3JvdXBfMV8yLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMV8zID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8xLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMb29rdXBzS2V5d29yZF8xXzNfMCA9IChLZXl3b3JkKWNHcm91cF8xXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hpZGVMYWJlbExvb2t1cEFzc2lnbm1lbnRfMV8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMV8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIaWRlTGFiZWxMb29rdXBIaWRlbGFiZWxLZXl3b3JkXzFfM18xXzAgPSAoS2V5d29yZCljSGlkZUxhYmVsTG9va3VwQXNzaWdubWVudF8xXzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8zXzIgPSAoS2V5d29yZCljR3JvdXBfMV8zLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBzQXNzaWdubWVudF8xXzNfMyA9IChBc3NpZ25tZW50KWNHcm91cF8xXzMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMb29rdXBzVGFibGVMb29rdXBQYXJzZXJSdWxlQ2FsbF8xXzNfM18wID0gKFJ1bGVDYWxsKWNMb29rdXBzQXNzaWdubWVudF8xXzNfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180ID0gKEtleXdvcmQpY0dyb3VwXzFfMy5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvLy8gKiAhISEgY29weSBmcm9tIHRhYmxlZHNsIC4uLiAqIC8gRGF0YW1hcnRUYWJsZVByb3BlcnR5OgorCQkvLwljb2x1bW49VGFibGVWYWx1ZUVsZW1lbnQgKCgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAmIChoYXNJbWFnZT89ImltYWdlIiBpbWFnZT1UYWJsZUltYWdlKT8gJiAoImludGVydmFscyIKKwkJLy8JaGlkZUxhYmVsSW50ZXJ2YWw/PSJoaWRlbGFiZWwiPyAieyIgaW50ZXJ2YWxzKz1UYWJsZUludGVydmFsKiAifSIpPyAmICgibG9va3VwcyIgaGlkZUxhYmVsTG9va3VwPz0iaGlkZWxhYmVsIj8gInsiCisJCS8vCWxvb2t1cHMrPVRhYmxlTG9va3VwKiAifSIpPyk7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9jb2x1bW49VGFibGVWYWx1ZUVsZW1lbnQgKCgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAmIChoYXNJbWFnZT89ImltYWdlIiBpbWFnZT1UYWJsZUltYWdlKT8gJiAoImludGVydmFscyIKKwkJLy9oaWRlTGFiZWxJbnRlcnZhbD89ImhpZGVsYWJlbCI/ICJ7IiBpbnRlcnZhbHMrPVRhYmxlSW50ZXJ2YWwqICJ9Iik/ICYgKCJsb29rdXBzIiBoaWRlTGFiZWxMb29rdXA/PSJoaWRlbGFiZWwiPyAieyIKKwkJLy9sb29rdXBzKz1UYWJsZUxvb2t1cCogIn0iKT8pCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vY29sdW1uPVRhYmxlVmFsdWVFbGVtZW50CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldENvbHVtbkFzc2lnbm1lbnRfMCgpIHsgcmV0dXJuIGNDb2x1bW5Bc3NpZ25tZW50XzA7IH0KKworCQkvL1RhYmxlVmFsdWVFbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDb2x1bW5UYWJsZVZhbHVlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzBfMCgpIHsgcmV0dXJuIGNDb2x1bW5UYWJsZVZhbHVlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzBfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/ICYgKGhhc0ltYWdlPz0iaW1hZ2UiIGltYWdlPVRhYmxlSW1hZ2UpPyAmICgiaW50ZXJ2YWxzIiBoaWRlTGFiZWxJbnRlcnZhbD89ImhpZGVsYWJlbCI/ICJ7IgorCQkvL2ludGVydmFscys9VGFibGVJbnRlcnZhbCogIn0iKT8gJiAoImxvb2t1cHMiIGhpZGVMYWJlbExvb2t1cD89ImhpZGVsYWJlbCI/ICJ7IiBsb29rdXBzKz1UYWJsZUxvb2t1cCogIn0iKT8KKwkJcHVibGljIFVub3JkZXJlZEdyb3VwIGdldFVub3JkZXJlZEdyb3VwXzEoKSB7IHJldHVybiBjVW5vcmRlcmVkR3JvdXBfMTsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xXzAoKSB7IHJldHVybiBjR3JvdXBfMV8wOyB9CisKKwkJLy8ic3R5bGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlS2V5d29yZF8xXzBfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfMV8wXzA7IH0KKworCQkvL3N0eWxlPVtTdHlsZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U3R5bGVBc3NpZ25tZW50XzFfMF8xKCkgeyByZXR1cm4gY1N0eWxlQXNzaWdubWVudF8xXzBfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzFfMF8xXzAoKSB7IHJldHVybiBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzFfMF8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xXzBfMTsgfQorCisJCS8vKGhhc0ltYWdlPz0iaW1hZ2UiIGltYWdlPVRhYmxlSW1hZ2UpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMV8xKCkgeyByZXR1cm4gY0dyb3VwXzFfMTsgfQorCisJCS8vaGFzSW1hZ2U/PSJpbWFnZSIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SGFzSW1hZ2VBc3NpZ25tZW50XzFfMV8wKCkgeyByZXR1cm4gY0hhc0ltYWdlQXNzaWdubWVudF8xXzFfMDsgfQorCisJCS8vImltYWdlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRIYXNJbWFnZUltYWdlS2V5d29yZF8xXzFfMF8wKCkgeyByZXR1cm4gY0hhc0ltYWdlSW1hZ2VLZXl3b3JkXzFfMV8wXzA7IH0KKworCQkvL2ltYWdlPVRhYmxlSW1hZ2UKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SW1hZ2VBc3NpZ25tZW50XzFfMV8xKCkgeyByZXR1cm4gY0ltYWdlQXNzaWdubWVudF8xXzFfMTsgfQorCisJCS8vVGFibGVJbWFnZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1hZ2VUYWJsZUltYWdlUGFyc2VyUnVsZUNhbGxfMV8xXzFfMCgpIHsgcmV0dXJuIGNJbWFnZVRhYmxlSW1hZ2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wOyB9CisKKwkJLy8oImludGVydmFscyIgaGlkZUxhYmVsSW50ZXJ2YWw/PSJoaWRlbGFiZWwiPyAieyIgaW50ZXJ2YWxzKz1UYWJsZUludGVydmFsKiAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMV8yKCkgeyByZXR1cm4gY0dyb3VwXzFfMjsgfQorCisJCS8vImludGVydmFscyIKKwkJcHVibGljIEtleXdvcmQgZ2V0SW50ZXJ2YWxzS2V5d29yZF8xXzJfMCgpIHsgcmV0dXJuIGNJbnRlcnZhbHNLZXl3b3JkXzFfMl8wOyB9CisKKwkJLy9oaWRlTGFiZWxJbnRlcnZhbD89ImhpZGVsYWJlbCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhpZGVMYWJlbEludGVydmFsQXNzaWdubWVudF8xXzJfMSgpIHsgcmV0dXJuIGNIaWRlTGFiZWxJbnRlcnZhbEFzc2lnbm1lbnRfMV8yXzE7IH0KKworCQkvLyJoaWRlbGFiZWwiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhpZGVMYWJlbEludGVydmFsSGlkZWxhYmVsS2V5d29yZF8xXzJfMV8wKCkgeyByZXR1cm4gY0hpZGVMYWJlbEludGVydmFsSGlkZWxhYmVsS2V5d29yZF8xXzJfMV8wOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzI7IH0KKworCQkvL2ludGVydmFscys9VGFibGVJbnRlcnZhbCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SW50ZXJ2YWxzQXNzaWdubWVudF8xXzJfMygpIHsgcmV0dXJuIGNJbnRlcnZhbHNBc3NpZ25tZW50XzFfMl8zOyB9CisKKwkJLy9UYWJsZUludGVydmFsCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbnRlcnZhbHNUYWJsZUludGVydmFsUGFyc2VyUnVsZUNhbGxfMV8yXzNfMCgpIHsgcmV0dXJuIGNJbnRlcnZhbHNUYWJsZUludGVydmFsUGFyc2VyUnVsZUNhbGxfMV8yXzNfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzJfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMV8yXzQ7IH0KKworCQkvLygibG9va3VwcyIgaGlkZUxhYmVsTG9va3VwPz0iaGlkZWxhYmVsIj8gInsiIGxvb2t1cHMrPVRhYmxlTG9va3VwKiAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMV8zKCkgeyByZXR1cm4gY0dyb3VwXzFfMzsgfQorCisJCS8vImxvb2t1cHMiCisJCXB1YmxpYyBLZXl3b3JkIGdldExvb2t1cHNLZXl3b3JkXzFfM18wKCkgeyByZXR1cm4gY0xvb2t1cHNLZXl3b3JkXzFfM18wOyB9CisKKwkJLy9oaWRlTGFiZWxMb29rdXA/PSJoaWRlbGFiZWwiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRIaWRlTGFiZWxMb29rdXBBc3NpZ25tZW50XzFfM18xKCkgeyByZXR1cm4gY0hpZGVMYWJlbExvb2t1cEFzc2lnbm1lbnRfMV8zXzE7IH0KKworCQkvLyJoaWRlbGFiZWwiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhpZGVMYWJlbExvb2t1cEhpZGVsYWJlbEtleXdvcmRfMV8zXzFfMCgpIHsgcmV0dXJuIGNIaWRlTGFiZWxMb29rdXBIaWRlbGFiZWxLZXl3b3JkXzFfM18xXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfMjsgfQorCisJCS8vbG9va3Vwcys9VGFibGVMb29rdXAqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExvb2t1cHNBc3NpZ25tZW50XzFfM18zKCkgeyByZXR1cm4gY0xvb2t1cHNBc3NpZ25tZW50XzFfM18zOyB9CisKKwkJLy9UYWJsZUxvb2t1cAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TG9va3Vwc1RhYmxlTG9va3VwUGFyc2VyUnVsZUNhbGxfMV8zXzNfMCgpIHsgcmV0dXJuIGNMb29rdXBzVGFibGVMb29rdXBQYXJzZXJSdWxlQ2FsbF8xXzNfM18wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzFfM180KCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8xXzNfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZUZvcm1hdHRlckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZUZvcm1hdHRlciIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1RhYmxlRm9ybWF0dGVyQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRm9ybWF0dGVyS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNGb3JtYXRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNGb3JtYXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljRm9ybWF0QXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGFibGVGb3JtYXR0ZXI6CisJCS8vCXtUYWJsZUZvcm1hdHRlcn0gImZvcm1hdHRlciIgZm9ybWF0PVNUUklORzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tUYWJsZUZvcm1hdHRlcn0gImZvcm1hdHRlciIgZm9ybWF0PVNUUklORworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tUYWJsZUZvcm1hdHRlcn0KKwkJcHVibGljIEFjdGlvbiBnZXRUYWJsZUZvcm1hdHRlckFjdGlvbl8wKCkgeyByZXR1cm4gY1RhYmxlRm9ybWF0dGVyQWN0aW9uXzA7IH0KKworCQkvLyJmb3JtYXR0ZXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldEZvcm1hdHRlcktleXdvcmRfMSgpIHsgcmV0dXJuIGNGb3JtYXR0ZXJLZXl3b3JkXzE7IH0KKworCQkvL2Zvcm1hdD1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Rm9ybWF0QXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0Zvcm1hdEFzc2lnbm1lbnRfMjsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRGb3JtYXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNGb3JtYXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZUltYWdlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlSW1hZ2UiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNUYWJsZUltYWdlQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGF0aEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1hZ2VQYXRoUGF0dGVybkFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ltYWdlUGF0aFBhdHRlcm5TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljSW1hZ2VQYXRoUGF0dGVybkFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzMgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNIYXNQYXJhbWV0ZXJBc3NpZ25tZW50XzNfMCA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIYXNQYXJhbWV0ZXJEeW5hbWljS2V5d29yZF8zXzBfMCA9IChLZXl3b3JkKWNIYXNQYXJhbWV0ZXJBc3NpZ25tZW50XzNfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSGlkZUltYWdlTGFiZWxBc3NpZ25tZW50XzNfMSA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNIaWRlSW1hZ2VMYWJlbEhpZGVsYWJlbEtleXdvcmRfM18xXzAgPSAoS2V5d29yZCljSGlkZUltYWdlTGFiZWxBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzNfMiA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUmVzaXplQXNzaWdubWVudF8zXzJfMCA9IChBc3NpZ25tZW50KWNHcm91cF8zXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Jlc2l6ZVJlc2l6ZUtleXdvcmRfM18yXzBfMCA9IChLZXl3b3JkKWNSZXNpemVBc3NpZ25tZW50XzNfMl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSZXNpemVTdHJpbmdBc3NpZ25tZW50XzNfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzNfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1Jlc2l6ZVN0cmluZ1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMCA9IChSdWxlQ2FsbCljUmVzaXplU3RyaW5nQXNzaWdubWVudF8zXzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1RhYmxlSW1hZ2U6CisJCS8vCXtUYWJsZUltYWdlfSAicGF0aCIgaW1hZ2VQYXRoUGF0dGVybj1TVFJJTkcgKGhhc1BhcmFtZXRlcj89ImR5bmFtaWMiPyAmIGhpZGVJbWFnZUxhYmVsPz0iaGlkZWxhYmVsIj8gJgorCQkvLwkocmVzaXplPz0icmVzaXplIiByZXNpemVTdHJpbmc9U1RSSU5HKT8pOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1RhYmxlSW1hZ2V9ICJwYXRoIiBpbWFnZVBhdGhQYXR0ZXJuPVNUUklORyAoaGFzUGFyYW1ldGVyPz0iZHluYW1pYyI/ICYgaGlkZUltYWdlTGFiZWw/PSJoaWRlbGFiZWwiPyAmIChyZXNpemU/PSJyZXNpemUiCisJCS8vcmVzaXplU3RyaW5nPVNUUklORyk/KQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tUYWJsZUltYWdlfQorCQlwdWJsaWMgQWN0aW9uIGdldFRhYmxlSW1hZ2VBY3Rpb25fMCgpIHsgcmV0dXJuIGNUYWJsZUltYWdlQWN0aW9uXzA7IH0KKworCQkvLyJwYXRoIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYXRoS2V5d29yZF8xKCkgeyByZXR1cm4gY1BhdGhLZXl3b3JkXzE7IH0KKworCQkvL2ltYWdlUGF0aFBhdHRlcm49U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEltYWdlUGF0aFBhdHRlcm5Bc3NpZ25tZW50XzIoKSB7IHJldHVybiBjSW1hZ2VQYXRoUGF0dGVybkFzc2lnbm1lbnRfMjsgfQorCisJCS8vU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbWFnZVBhdGhQYXR0ZXJuU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjSW1hZ2VQYXRoUGF0dGVyblNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9oYXNQYXJhbWV0ZXI/PSJkeW5hbWljIj8gJiBoaWRlSW1hZ2VMYWJlbD89ImhpZGVsYWJlbCI/ICYgKHJlc2l6ZT89InJlc2l6ZSIgcmVzaXplU3RyaW5nPVNUUklORyk/CisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cF8zKCkgeyByZXR1cm4gY1Vub3JkZXJlZEdyb3VwXzM7IH0KKworCQkvL2hhc1BhcmFtZXRlcj89ImR5bmFtaWMiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRIYXNQYXJhbWV0ZXJBc3NpZ25tZW50XzNfMCgpIHsgcmV0dXJuIGNIYXNQYXJhbWV0ZXJBc3NpZ25tZW50XzNfMDsgfQorCisJCS8vImR5bmFtaWMiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhhc1BhcmFtZXRlckR5bmFtaWNLZXl3b3JkXzNfMF8wKCkgeyByZXR1cm4gY0hhc1BhcmFtZXRlckR5bmFtaWNLZXl3b3JkXzNfMF8wOyB9CisKKwkJLy9oaWRlSW1hZ2VMYWJlbD89ImhpZGVsYWJlbCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhpZGVJbWFnZUxhYmVsQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjSGlkZUltYWdlTGFiZWxBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vImhpZGVsYWJlbCIKKwkJcHVibGljIEtleXdvcmQgZ2V0SGlkZUltYWdlTGFiZWxIaWRlbGFiZWxLZXl3b3JkXzNfMV8wKCkgeyByZXR1cm4gY0hpZGVJbWFnZUxhYmVsSGlkZWxhYmVsS2V5d29yZF8zXzFfMDsgfQorCisJCS8vKHJlc2l6ZT89InJlc2l6ZSIgcmVzaXplU3RyaW5nPVNUUklORyk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zXzIoKSB7IHJldHVybiBjR3JvdXBfM18yOyB9CisKKwkJLy9yZXNpemU/PSJyZXNpemUiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlc2l6ZUFzc2lnbm1lbnRfM18yXzAoKSB7IHJldHVybiBjUmVzaXplQXNzaWdubWVudF8zXzJfMDsgfQorCisJCS8vInJlc2l6ZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmVzaXplUmVzaXplS2V5d29yZF8zXzJfMF8wKCkgeyByZXR1cm4gY1Jlc2l6ZVJlc2l6ZUtleXdvcmRfM18yXzBfMDsgfQorCisJCS8vcmVzaXplU3RyaW5nPVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSZXNpemVTdHJpbmdBc3NpZ25tZW50XzNfMl8xKCkgeyByZXR1cm4gY1Jlc2l6ZVN0cmluZ0Fzc2lnbm1lbnRfM18yXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmVzaXplU3RyaW5nU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8zXzJfMV8wKCkgeyByZXR1cm4gY1Jlc2l6ZVN0cmluZ1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfM18yXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZVZhbHVlRWxlbWVudEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZVZhbHVlRWxlbWVudCIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFibGVQcm9wZXJ0eVBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RhYmxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9UYWJsZVZhbHVlRWxlbWVudDoKKwkJLy8JVGFibGVQcm9wZXJ0eSB8IFRhYmxlQWdncmVnYXRpb247CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9UYWJsZVByb3BlcnR5IHwgVGFibGVBZ2dyZWdhdGlvbgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1RhYmxlUHJvcGVydHkKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1RhYmxlUHJvcGVydHlQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9UYWJsZUFnZ3JlZ2F0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMSgpIHsgcmV0dXJuIGNUYWJsZUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZVByb3BlcnR5RWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlUHJvcGVydHkiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUHJvcGVydHlLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1ZhbHVlUmVmQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVmFsdWVSZWZEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNWYWx1ZVJlZkFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1ZhbHVlUmVmRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSA9IChSdWxlQ2FsbCljVmFsdWVSZWZEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vLyAqfFRhYmxlQmluYXJ5QWdncmVnYXRpb258VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKiAvCisJCS8vLyAqVGFibGVNZWFzdXJlfFRhYmxlRGVyaXZlZHxUYWJsZUhpZXJhcmNoeXxUYWJsZU9yZGluYWx8VGFibGVDb2x1bW58VGFibGVUYXNrKiAvIFRhYmxlUHJvcGVydHk6CisJCS8vCSJwcm9wZXJ0eSIgdmFsdWVSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJwcm9wZXJ0eSIgdmFsdWVSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJwcm9wZXJ0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSB7IHJldHVybiBjUHJvcGVydHlLZXl3b3JkXzA7IH0KKworCQkvL3ZhbHVlUmVmPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VmFsdWVSZWZBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjVmFsdWVSZWZBc3NpZ25tZW50XzE7IH0KKworCQkvL1tkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFZhbHVlUmVmRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzFfMCgpIHsgcmV0dXJuIGNWYWx1ZVJlZkRhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRWYWx1ZVJlZkRhdGFtYXJ0UHJvcGVydHlJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSB7IHJldHVybiBjVmFsdWVSZWZEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlQWdncmVnYXRpb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVBZ2dyZWdhdGlvbiIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBZ2dyZWdhdGVLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWdncmVnYXRpb25UYWJsZUJhc2VBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljQWdncmVnYXRpb25Bc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFVub3JkZXJlZEdyb3VwIGNVbm9yZGVyZWRHcm91cF8yID0gKFVub3JkZXJlZEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzJfMCA9IChHcm91cCljVW5vcmRlcmVkR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT25Hcm91cEtleXdvcmRfMl8wXzAgPSAoS2V5d29yZCljR3JvdXBfMl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNPbkdyb3VwQXNzaWdubWVudF8yXzBfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNPbkdyb3VwRGF0YW1hcnRUYWJsZUdyb3VwQ3Jvc3NSZWZlcmVuY2VfMl8wXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljT25Hcm91cEFzc2lnbm1lbnRfMl8wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNPbkdyb3VwRGF0YW1hcnRUYWJsZUdyb3VwSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xXzBfMSA9IChSdWxlQ2FsbCljT25Hcm91cERhdGFtYXJ0VGFibGVHcm91cENyb3NzUmVmZXJlbmNlXzJfMF8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yXzEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RpdGxlS2V5d29yZF8yXzFfMCA9IChLZXl3b3JkKWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRBc3NpZ25tZW50XzJfMV8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzFfMV8wID0gKFJ1bGVDYWxsKWNUZXh0QXNzaWdubWVudF8yXzFfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1RhYmxlQWdncmVnYXRpb246CisJCS8vCSJhZ2dyZWdhdGUiIGFnZ3JlZ2F0aW9uPVRhYmxlQmFzZUFnZ3JlZ2F0aW9uICgoIm9uLWdyb3VwIiBvbkdyb3VwPVtEYXRhbWFydFRhYmxlR3JvdXBdKT8gJiAoInRpdGxlIgorCQkvLwl0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyk/KTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJhZ2dyZWdhdGUiIGFnZ3JlZ2F0aW9uPVRhYmxlQmFzZUFnZ3JlZ2F0aW9uICgoIm9uLWdyb3VwIiBvbkdyb3VwPVtEYXRhbWFydFRhYmxlR3JvdXBdKT8gJiAoInRpdGxlIgorCQkvL3RleHQ9VFJBTlNMQVRBQkxFU1RSSU5HKT8pCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImFnZ3JlZ2F0ZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0QWdncmVnYXRlS2V5d29yZF8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0ZUtleXdvcmRfMDsgfQorCisJCS8vYWdncmVnYXRpb249VGFibGVCYXNlQWdncmVnYXRpb24KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWdncmVnYXRpb25Bc3NpZ25tZW50XzEoKSB7IHJldHVybiBjQWdncmVnYXRpb25Bc3NpZ25tZW50XzE7IH0KKworCQkvL1RhYmxlQmFzZUFnZ3JlZ2F0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRBZ2dyZWdhdGlvblRhYmxlQmFzZUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uVGFibGVCYXNlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzA7IH0KKworCQkvLygib24tZ3JvdXAiIG9uR3JvdXA9W0RhdGFtYXJ0VGFibGVHcm91cF0pPyAmICgidGl0bGUiIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HKT8KKwkJcHVibGljIFVub3JkZXJlZEdyb3VwIGdldFVub3JkZXJlZEdyb3VwXzIoKSB7IHJldHVybiBjVW5vcmRlcmVkR3JvdXBfMjsgfQorCisJCS8vKCJvbi1ncm91cCIgb25Hcm91cD1bRGF0YW1hcnRUYWJsZUdyb3VwXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8yXzAoKSB7IHJldHVybiBjR3JvdXBfMl8wOyB9CisKKwkJLy8ib24tZ3JvdXAiCisJCXB1YmxpYyBLZXl3b3JkIGdldE9uR3JvdXBLZXl3b3JkXzJfMF8wKCkgeyByZXR1cm4gY09uR3JvdXBLZXl3b3JkXzJfMF8wOyB9CisKKwkJLy9vbkdyb3VwPVtEYXRhbWFydFRhYmxlR3JvdXBdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE9uR3JvdXBBc3NpZ25tZW50XzJfMF8xKCkgeyByZXR1cm4gY09uR3JvdXBBc3NpZ25tZW50XzJfMF8xOyB9CisKKwkJLy9bRGF0YW1hcnRUYWJsZUdyb3VwXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0T25Hcm91cERhdGFtYXJ0VGFibGVHcm91cENyb3NzUmVmZXJlbmNlXzJfMF8xXzAoKSB7IHJldHVybiBjT25Hcm91cERhdGFtYXJ0VGFibGVHcm91cENyb3NzUmVmZXJlbmNlXzJfMF8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRPbkdyb3VwRGF0YW1hcnRUYWJsZUdyb3VwSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xXzBfMSgpIHsgcmV0dXJuIGNPbkdyb3VwRGF0YW1hcnRUYWJsZUdyb3VwSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xXzBfMTsgfQorCisJCS8vKCJ0aXRsZSIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8xKCkgeyByZXR1cm4gY0dyb3VwXzJfMTsgfQorCisJCS8vInRpdGxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUaXRsZUtleXdvcmRfMl8xXzAoKSB7IHJldHVybiBjVGl0bGVLZXl3b3JkXzJfMV8wOyB9CisKKwkJLy90ZXh0PVRSQU5TTEFUQUJMRVNUUklORworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUZXh0QXNzaWdubWVudF8yXzFfMSgpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yXzFfMTsgfQorCisJCS8vVFJBTlNMQVRBQkxFU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8xXzFfMCgpIHsgcmV0dXJuIGNUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8xXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZUJhc2VBZ2dyZWdhdGlvbkVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZUJhc2VBZ2dyZWdhdGlvbiIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFibGVQdXJlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUYWJsZVVuYXJ5QWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUYWJsZU11bHRpcGxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8yID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMyA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJCisJCS8vVGFibGVCYXNlQWdncmVnYXRpb246CisJCS8vCVRhYmxlUHVyZUFnZ3JlZ2F0aW9uIHwgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIHwgVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIHwgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1RhYmxlUHVyZUFnZ3JlZ2F0aW9uIHwgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uIHwgVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIHwgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1RhYmxlUHVyZUFnZ3JlZ2F0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZVB1cmVBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVGFibGVQdXJlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9UYWJsZVVuYXJ5QWdncmVnYXRpb24KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjVGFibGVVbmFyeUFnZ3JlZ2F0aW9uUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8yKCkgeyByZXR1cm4gY1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvblBhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL1RhYmxlQmluYXJ5QWdncmVnYXRpb24KKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY1RhYmxlQmluYXJ5QWdncmVnYXRpb25QYXJzZXJSdWxlQ2FsbF8zOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlUHVyZUFnZ3JlZ2F0aW9uIik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQWdncmVnYXRpb25Bc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0FnZ3JlZ2F0aW9uUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljQWdncmVnYXRpb25Bc3NpZ25tZW50LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGFibGVQdXJlQWdncmVnYXRpb246CisJCS8vCWFnZ3JlZ2F0aW9uPVB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vYWdncmVnYXRpb249UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWdncmVnYXRpb25Bc3NpZ25tZW50KCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uQXNzaWdubWVudDsgfQorCisJCS8vUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEFnZ3JlZ2F0aW9uUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNBZ2dyZWdhdGlvblB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlVW5hcnlBZ2dyZWdhdGlvbiIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0FnZ3JlZ2F0aW9uVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMCA9IChSdWxlQ2FsbCljQWdncmVnYXRpb25Bc3NpZ25tZW50XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY09mS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNWYWx1ZVJlZnNBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfMl8wID0gKENyb3NzUmVmZXJlbmNlKWNWYWx1ZVJlZnNBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVGFibGVVbmFyeUFnZ3JlZ2F0aW9uOgorCQkvLwlhZ2dyZWdhdGlvbj1VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gIm9mIiB2YWx1ZVJlZnMrPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9hZ2dyZWdhdGlvbj1VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gIm9mIiB2YWx1ZVJlZnMrPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy9hZ2dyZWdhdGlvbj1VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWdncmVnYXRpb25Bc3NpZ25tZW50XzAoKSB7IHJldHVybiBjQWdncmVnYXRpb25Bc3NpZ25tZW50XzA7IH0KKworCQkvL1VuYXJ5QWdncmVnYXRpb25UeXBlRW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QWdncmVnYXRpb25VbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMDsgfQorCisJCS8vIm9mIgorCQlwdWJsaWMgS2V5d29yZCBnZXRPZktleXdvcmRfMSgpIHsgcmV0dXJuIGNPZktleXdvcmRfMTsgfQorCisJCS8vdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFZhbHVlUmVmc0Fzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNWYWx1ZVJlZnNBc3NpZ25tZW50XzI7IH0KKworCQkvL1tkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSB7IHJldHVybiBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZU11bHRpcGxlQWdncmVnYXRpb25FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8wID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWdncmVnYXRpb25NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wID0gKFJ1bGVDYWxsKWNBZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT2ZLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVmFsdWVSZWZzQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMCA9IChDcm9zc1JlZmVyZW5jZSljVmFsdWVSZWZzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMSA9IChSdWxlQ2FsbCljVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvL1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbjoKKwkJLy8JYWdncmVnYXRpb249TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtICJvZiIgIigiIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XSogIikiOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vYWdncmVnYXRpb249TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtICJvZiIgIigiIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XSogIikiCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vYWdncmVnYXRpb249TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudF8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8wOyB9CisKKwkJLy9NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEFnZ3JlZ2F0aW9uTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtRW51bVJ1bGVDYWxsXzBfMCgpIHsgcmV0dXJuIGNBZ2dyZWdhdGlvbk11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVudW1SdWxlQ2FsbF8wXzA7IH0KKworCQkvLyJvZiIKKwkJcHVibGljIEtleXdvcmQgZ2V0T2ZLZXl3b3JkXzEoKSB7IHJldHVybiBjT2ZLZXl3b3JkXzE7IH0KKworCQkvLyIoIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdFBhcmVudGhlc2lzS2V5d29yZF8yOyB9CisKKwkJLy92YWx1ZVJlZnMrPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0qCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFZhbHVlUmVmc0Fzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNWYWx1ZVJlZnNBc3NpZ25tZW50XzM7IH0KKworCQkvL1tkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlDcm9zc1JlZmVyZW5jZV8zXzAoKSB7IHJldHVybiBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFZhbHVlUmVmc0RhdGFtYXJ0UHJvcGVydHlJRFRlcm1pbmFsUnVsZUNhbGxfM18wXzEoKSB7IHJldHVybiBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMTsgfQorCisJCS8vIikiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSB7IHJldHVybiBjUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlQmluYXJ5QWdncmVnYXRpb24iKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQWdncmVnYXRpb25Bc3NpZ25tZW50XzAgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNBZ2dyZWdhdGlvbkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wID0gKFJ1bGVDYWxsKWNBZ2dyZWdhdGlvbkFzc2lnbm1lbnRfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT2ZLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVmFsdWVSZWZzQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMCA9IChDcm9zc1JlZmVyZW5jZSljVmFsdWVSZWZzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMSA9IChSdWxlQ2FsbCljVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVmFsdWVSZWZzQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzRfMCA9IChDcm9zc1JlZmVyZW5jZSljVmFsdWVSZWZzQXNzaWdubWVudF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF80XzBfMSA9IChSdWxlQ2FsbCljVmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzRfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCQorCQkvL1RhYmxlQmluYXJ5QWdncmVnYXRpb246CisJCS8vCWFnZ3JlZ2F0aW9uPUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gIm9mIiAiKCIgdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldCisJCS8vCXZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XSAiKSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9hZ2dyZWdhdGlvbj1CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtICJvZiIgIigiIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XQorCQkvL3ZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XSAiKSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy9hZ2dyZWdhdGlvbj1CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFnZ3JlZ2F0aW9uQXNzaWdubWVudF8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uQXNzaWdubWVudF8wOyB9CisKKwkJLy9CaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRBZ2dyZWdhdGlvbkJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1FbnVtUnVsZUNhbGxfMF8wKCkgeyByZXR1cm4gY0FnZ3JlZ2F0aW9uQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVudW1SdWxlQ2FsbF8wXzA7IH0KKworCQkvLyJvZiIKKwkJcHVibGljIEtleXdvcmQgZ2V0T2ZLZXl3b3JkXzEoKSB7IHJldHVybiBjT2ZLZXl3b3JkXzE7IH0KKworCQkvLyIoIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdFBhcmVudGhlc2lzS2V5d29yZF8yOyB9CisKKwkJLy92YWx1ZVJlZnMrPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VmFsdWVSZWZzQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY1ZhbHVlUmVmc0Fzc2lnbm1lbnRfMzsgfQorCisJCS8vW2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0VmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzNfMCgpIHsgcmV0dXJuIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfM18wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF8zXzBfMSgpIHsgcmV0dXJuIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzNfMF8xOyB9CisKKwkJLy92YWx1ZVJlZnMrPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VmFsdWVSZWZzQXNzaWdubWVudF80KCkgeyByZXR1cm4gY1ZhbHVlUmVmc0Fzc2lnbm1lbnRfNDsgfQorCisJCS8vW2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0VmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUNyb3NzUmVmZXJlbmNlXzRfMCgpIHsgcmV0dXJuIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5Q3Jvc3NSZWZlcmVuY2VfNF8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsdWVSZWZzRGF0YW1hcnRQcm9wZXJ0eUlEVGVybWluYWxSdWxlQ2FsbF80XzBfMSgpIHsgcmV0dXJuIGNWYWx1ZVJlZnNEYXRhbWFydFByb3BlcnR5SURUZXJtaW5hbFJ1bGVDYWxsXzRfMF8xOyB9CisKKwkJLy8iKSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNSgpIHsgcmV0dXJuIGNSaWdodFBhcmVudGhlc2lzS2V5d29yZF81OyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlSW50ZXJ2YWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVJbnRlcnZhbCIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFibGVOdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RhYmxlRGF0ZURheUludGVydmFsUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVGFibGVJbnRlcnZhbDoKKwkJLy8JVGFibGVOdW1iZXJJbnRlcnZhbCB8IFRhYmxlRGF0ZURheUludGVydmFsOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vVGFibGVOdW1iZXJJbnRlcnZhbCB8IFRhYmxlRGF0ZURheUludGVydmFsCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vVGFibGVOdW1iZXJJbnRlcnZhbAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGFibGVOdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVGFibGVOdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvL1RhYmxlRGF0ZURheUludGVydmFsCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjVGFibGVEYXRlRGF5SW50ZXJ2YWxQYXJzZXJSdWxlQ2FsbF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlTnVtYmVySW50ZXJ2YWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVOdW1iZXJJbnRlcnZhbCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1RhYmxlTnVtYmVySW50ZXJ2YWxBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVcFRvS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTnVtYmVySW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljTnVtYmVySW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOdW1iZXJSYW5nZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNOdW1iZXJSYW5nZUFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1RhYmxlTnVtYmVySW50ZXJ2YWw6CisJCS8vCXtUYWJsZU51bWJlckludGVydmFsfSAidXAgdG8iIG51bWJlckludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIG51bWJlclJhbmdlPVRhYmxlUmFuZ2VFbGVtZW50OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1RhYmxlTnVtYmVySW50ZXJ2YWx9ICJ1cCB0byIgbnVtYmVySW50ZXJ2YWxWYWx1ZT1TaWduZWROdW1iZXIgbnVtYmVyUmFuZ2U9VGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97VGFibGVOdW1iZXJJbnRlcnZhbH0KKwkJcHVibGljIEFjdGlvbiBnZXRUYWJsZU51bWJlckludGVydmFsQWN0aW9uXzAoKSB7IHJldHVybiBjVGFibGVOdW1iZXJJbnRlcnZhbEFjdGlvbl8wOyB9CisKKwkJLy8idXAgdG8iCisJCXB1YmxpYyBLZXl3b3JkIGdldFVwVG9LZXl3b3JkXzEoKSB7IHJldHVybiBjVXBUb0tleXdvcmRfMTsgfQorCisJCS8vbnVtYmVySW50ZXJ2YWxWYWx1ZT1TaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNOdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yOyB9CisKKwkJLy9TaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldE51bWJlckludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjTnVtYmVySW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vbnVtYmVyUmFuZ2U9VGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzM7IH0KKworCQkvL1RhYmxlUmFuZ2VFbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROdW1iZXJSYW5nZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY051bWJlclJhbmdlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGFibGVEYXRlRGF5SW50ZXJ2YWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVEYXRlRGF5SW50ZXJ2YWwiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNUYWJsZURhdGVEYXlJbnRlcnZhbEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RheXNJblBhc3RLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0RhdGVJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGF0ZUludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY0RhdGVJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEYXRlUmFuZ2VBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEYXRlUmFuZ2VUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljRGF0ZVJhbmdlQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGFibGVEYXRlRGF5SW50ZXJ2YWw6CisJCS8vCXtUYWJsZURhdGVEYXlJbnRlcnZhbH0gImRheXMgaW4gcGFzdCIgZGF0ZUludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIGRhdGVSYW5nZT1UYWJsZVJhbmdlRWxlbWVudDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tUYWJsZURhdGVEYXlJbnRlcnZhbH0gImRheXMgaW4gcGFzdCIgZGF0ZUludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIGRhdGVSYW5nZT1UYWJsZVJhbmdlRWxlbWVudAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tUYWJsZURhdGVEYXlJbnRlcnZhbH0KKwkJcHVibGljIEFjdGlvbiBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbEFjdGlvbl8wKCkgeyByZXR1cm4gY1RhYmxlRGF0ZURheUludGVydmFsQWN0aW9uXzA7IH0KKworCQkvLyJkYXlzIGluIHBhc3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldERheXNJblBhc3RLZXl3b3JkXzEoKSB7IHJldHVybiBjRGF5c0luUGFzdEtleXdvcmRfMTsgfQorCisJCS8vZGF0ZUludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldERhdGVJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0RhdGVJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yOyB9CisKKwkJLy9TaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldERhdGVJbnRlcnZhbFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY0RhdGVJbnRlcnZhbFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9kYXRlUmFuZ2U9VGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGF0ZVJhbmdlQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0RhdGVSYW5nZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vVGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERhdGVSYW5nZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY0RhdGVSYW5nZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlTG9va3VwRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRhYmxlTG9va3VwIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUYWJsZU51bWJlckxvb2t1cFBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RhYmxlU3RyaW5nTG9va3VwUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFibGVEYXRlRGF5TG9va3VwUGFyc2VyUnVsZUNhbGxfMiA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJCisJCS8vVGFibGVMb29rdXA6CisJCS8vCVRhYmxlTnVtYmVyTG9va3VwIHwgVGFibGVTdHJpbmdMb29rdXAgfCBUYWJsZURhdGVEYXlMb29rdXA7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9UYWJsZU51bWJlckxvb2t1cCB8IFRhYmxlU3RyaW5nTG9va3VwIHwgVGFibGVEYXRlRGF5TG9va3VwCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vVGFibGVOdW1iZXJMb29rdXAKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlTnVtYmVyTG9va3VwUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNUYWJsZU51bWJlckxvb2t1cFBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvL1RhYmxlU3RyaW5nTG9va3VwCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZVN0cmluZ0xvb2t1cFBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjVGFibGVTdHJpbmdMb29rdXBQYXJzZXJSdWxlQ2FsbF8xOyB9CisKKwkJLy9UYWJsZURhdGVEYXlMb29rdXAKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlRGF0ZURheUxvb2t1cFBhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjVGFibGVEYXRlRGF5TG9va3VwUGFyc2VyUnVsZUNhbGxfMjsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZU51bWJlckxvb2t1cEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZU51bWJlckxvb2t1cCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1RhYmxlTnVtYmVyTG9va3VwQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTnVtYmVyS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBWYWx1ZUFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0xvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNMb29rdXBWYWx1ZUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGlzY3JldGVBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEaXNjcmV0ZVRhYmxlUmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNEaXNjcmV0ZUFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1RhYmxlTnVtYmVyTG9va3VwOgorCQkvLwl7VGFibGVOdW1iZXJMb29rdXB9ICJudW1iZXIiIGxvb2t1cFZhbHVlPVNpZ25lZE51bWJlciBkaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tUYWJsZU51bWJlckxvb2t1cH0gIm51bWJlciIgbG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1RhYmxlTnVtYmVyTG9va3VwfQorCQlwdWJsaWMgQWN0aW9uIGdldFRhYmxlTnVtYmVyTG9va3VwQWN0aW9uXzAoKSB7IHJldHVybiBjVGFibGVOdW1iZXJMb29rdXBBY3Rpb25fMDsgfQorCisJCS8vIm51bWJlciIKKwkJcHVibGljIEtleXdvcmQgZ2V0TnVtYmVyS2V5d29yZF8xKCkgeyByZXR1cm4gY051bWJlcktleXdvcmRfMTsgfQorCisJCS8vbG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExvb2t1cFZhbHVlQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0xvb2t1cFZhbHVlQXNzaWdubWVudF8yOyB9CisKKwkJLy9TaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldExvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY0xvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9kaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREaXNjcmV0ZUFzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNEaXNjcmV0ZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vVGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRGlzY3JldGVUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZVN0cmluZ0xvb2t1cEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZVN0cmluZ0xvb2t1cCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1RhYmxlU3RyaW5nTG9va3VwQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU3RyaW5nS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMb29rdXBWYWx1ZUFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0xvb2t1cFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY0xvb2t1cFZhbHVlQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEaXNjcmV0ZUFzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0Rpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAgPSAoUnVsZUNhbGwpY0Rpc2NyZXRlQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGFibGVTdHJpbmdMb29rdXA6CisJCS8vCXtUYWJsZVN0cmluZ0xvb2t1cH0gInN0cmluZyIgbG9va3VwVmFsdWU9U1RSSU5HIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1RhYmxlU3RyaW5nTG9va3VwfSAic3RyaW5nIiBsb29rdXBWYWx1ZT1TVFJJTkcgZGlzY3JldGU9VGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97VGFibGVTdHJpbmdMb29rdXB9CisJCXB1YmxpYyBBY3Rpb24gZ2V0VGFibGVTdHJpbmdMb29rdXBBY3Rpb25fMCgpIHsgcmV0dXJuIGNUYWJsZVN0cmluZ0xvb2t1cEFjdGlvbl8wOyB9CisKKwkJLy8ic3RyaW5nIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdHJpbmdLZXl3b3JkXzEoKSB7IHJldHVybiBjU3RyaW5nS2V5d29yZF8xOyB9CisKKwkJLy9sb29rdXBWYWx1ZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TG9va3VwVmFsdWVBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjTG9va3VwVmFsdWVBc3NpZ25tZW50XzI7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TG9va3VwVmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNMb29rdXBWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9kaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREaXNjcmV0ZUFzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNEaXNjcmV0ZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vVGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRGlzY3JldGVUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZURhdGVEYXlMb29rdXBFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVEYXRlRGF5TG9va3VwIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjVGFibGVEYXRlRGF5TG9va3VwQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGF5c0luUGFzdEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTG9va3VwVmFsdWVBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMb29rdXBWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljTG9va3VwVmFsdWVBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Rpc2NyZXRlQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRGlzY3JldGVUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljRGlzY3JldGVBc3NpZ25tZW50XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9UYWJsZURhdGVEYXlMb29rdXA6CisJCS8vCXtUYWJsZURhdGVEYXlMb29rdXB9ICJkYXlzIGluIHBhc3QiIGxvb2t1cFZhbHVlPVNpZ25lZE51bWJlciBkaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tUYWJsZURhdGVEYXlMb29rdXB9ICJkYXlzIGluIHBhc3QiIGxvb2t1cFZhbHVlPVNpZ25lZE51bWJlciBkaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tUYWJsZURhdGVEYXlMb29rdXB9CisJCXB1YmxpYyBBY3Rpb24gZ2V0VGFibGVEYXRlRGF5TG9va3VwQWN0aW9uXzAoKSB7IHJldHVybiBjVGFibGVEYXRlRGF5TG9va3VwQWN0aW9uXzA7IH0KKworCQkvLyJkYXlzIGluIHBhc3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldERheXNJblBhc3RLZXl3b3JkXzEoKSB7IHJldHVybiBjRGF5c0luUGFzdEtleXdvcmRfMTsgfQorCisJCS8vbG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExvb2t1cFZhbHVlQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0xvb2t1cFZhbHVlQXNzaWdubWVudF8yOyB9CisKKwkJLy9TaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldExvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY0xvb2t1cFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wOyB9CisKKwkJLy9kaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREaXNjcmV0ZUFzc2lnbm1lbnRfMygpIHsgcmV0dXJuIGNEaXNjcmV0ZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vVGFibGVSYW5nZUVsZW1lbnQKKwkJcHVibGljIFJ1bGVDYWxsIGdldERpc2NyZXRlVGFibGVSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRGlzY3JldGVUYWJsZVJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZVJhbmdlRWxlbWVudEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZVJhbmdlRWxlbWVudCIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGFibGVUZXh0Q29sb3JQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUYWJsZUNlbGxDb2xvclBhcnNlclJ1bGVDYWxsXzEgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RhYmxlSWNvblBhcnNlclJ1bGVDYWxsXzIgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1RhYmxlVHJlbmRQYXJzZXJSdWxlQ2FsbF8zID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQkKKwkJLy9UYWJsZVJhbmdlRWxlbWVudDoKKwkJLy8JVGFibGVUZXh0Q29sb3IgfCBUYWJsZUNlbGxDb2xvciB8IFRhYmxlSWNvbiB8IFRhYmxlVHJlbmQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9UYWJsZVRleHRDb2xvciB8IFRhYmxlQ2VsbENvbG9yIHwgVGFibGVJY29uIHwgVGFibGVUcmVuZAorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1RhYmxlVGV4dENvbG9yCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZVRleHRDb2xvclBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVGFibGVUZXh0Q29sb3JQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9UYWJsZUNlbGxDb2xvcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VGFibGVDZWxsQ29sb3JQYXJzZXJSdWxlQ2FsbF8xKCkgeyByZXR1cm4gY1RhYmxlQ2VsbENvbG9yUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vVGFibGVJY29uCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUYWJsZUljb25QYXJzZXJSdWxlQ2FsbF8yKCkgeyByZXR1cm4gY1RhYmxlSWNvblBhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL1RhYmxlVHJlbmQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRhYmxlVHJlbmRQYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY1RhYmxlVHJlbmRQYXJzZXJSdWxlQ2FsbF8zOyB9CisJfQorCisJcHVibGljIGNsYXNzIFNpZ25lZE51bWJlckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJTaWduZWROdW1iZXIiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSHlwaGVuTWludXNLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOdW1iZXJQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1NpZ25lZE51bWJlciByZXR1cm5zIGVjb3JlOjpFRG91YmxlOgorCQkvLwkiLSI/IE51bWJlcjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyItIj8gTnVtYmVyCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vIi0iPworCQlwdWJsaWMgS2V5d29yZCBnZXRIeXBoZW5NaW51c0tleXdvcmRfMCgpIHsgcmV0dXJuIGNIeXBoZW5NaW51c0tleXdvcmRfMDsgfQorCisJCS8vTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROdW1iZXJQYXJzZXJSdWxlQ2FsbF8xKCkgeyByZXR1cm4gY051bWJlclBhcnNlclJ1bGVDYWxsXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGFibGVUZXh0Q29sb3JFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGFibGVUZXh0Q29sb3IiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGV4dGNvbG9yS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDb2xvckFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0NvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0NvbG9yQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSA9IChSdWxlQ2FsbCljQ29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1RhYmxlVGV4dENvbG9yOgorCQkvLwkidGV4dGNvbG9yIiBjb2xvcj1bQ29sb3JdOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vInRleHRjb2xvciIgY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJ0ZXh0Y29sb3IiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRjb2xvcktleXdvcmRfMCgpIHsgcmV0dXJuIGNUZXh0Y29sb3JLZXl3b3JkXzA7IH0KKworCQkvL2NvbG9yPVtDb2xvcl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29sb3JBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjQ29sb3JBc3NpZ25tZW50XzE7IH0KKworCQkvL1tDb2xvcl0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldENvbG9yQ29sb3JDcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjQ29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldENvbG9yQ29sb3JJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSB7IHJldHVybiBjQ29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUYWJsZUNlbGxDb2xvckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZUNlbGxDb2xvciIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDZWxsY29sb3JLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NvbG9yQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQ29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljQ29sb3JBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xID0gKFJ1bGVDYWxsKWNDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVGFibGVDZWxsQ29sb3I6CisJCS8vCSJjZWxsY29sb3IiIGNvbG9yPVtDb2xvcl07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iY2VsbGNvbG9yIiBjb2xvcj1bQ29sb3JdCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImNlbGxjb2xvciIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q2VsbGNvbG9yS2V5d29yZF8wKCkgeyByZXR1cm4gY0NlbGxjb2xvcktleXdvcmRfMDsgfQorCisJCS8vY29sb3I9W0NvbG9yXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDb2xvckFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNDb2xvckFzc2lnbm1lbnRfMTsgfQorCisJCS8vW0NvbG9yXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0Q29sb3JDb2xvckNyb3NzUmVmZXJlbmNlXzFfMCgpIHsgcmV0dXJuIGNDb2xvckNvbG9yQ3Jvc3NSZWZlcmVuY2VfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29sb3JDb2xvcklEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNDb2xvckNvbG9ySURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRhYmxlSWNvbkVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZUljb24iKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSWNvbktleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSWNvbkFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ljb25TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljSWNvbkFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1RhYmxlSWNvbjoKKwkJLy8JImljb24iIGljb249U1RSSU5HOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImljb24iIGljb249U1RSSU5HCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImljb24iCisJCXB1YmxpYyBLZXl3b3JkIGdldEljb25LZXl3b3JkXzAoKSB7IHJldHVybiBjSWNvbktleXdvcmRfMDsgfQorCisJCS8vaWNvbj1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SWNvbkFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNJY29uQXNzaWdubWVudF8xOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEljb25TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNJY29uU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGFibGVUcmVuZEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUYWJsZVRyZW5kIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RyZW5kS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJY29uQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSWNvblRyZW5kSWNvbkVudW1FbnVtUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNJY29uQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGFibGVUcmVuZDoKKwkJLy8JInRyZW5kIiBpY29uPVRyZW5kSWNvbkVudW07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8idHJlbmQiIGljb249VHJlbmRJY29uRW51bQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJ0cmVuZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0VHJlbmRLZXl3b3JkXzAoKSB7IHJldHVybiBjVHJlbmRLZXl3b3JkXzA7IH0KKworCQkvL2ljb249VHJlbmRJY29uRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJY29uQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0ljb25Bc3NpZ25tZW50XzE7IH0KKworCQkvL1RyZW5kSWNvbkVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEljb25UcmVuZEljb25FbnVtRW51bVJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNJY29uVHJlbmRJY29uRW51bUVudW1SdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGl0bGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVGl0bGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNUaXRsZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RpdGxlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0QXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljVGV4dEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vLyAqIC4uLiBjb3B5IGZyb20gdGFibGVkc2wgISEhICogLyAvL0NoYXJ0RHNsOgorCQkvLy8vCSdjaGFydCcgY2hhcnRSZWY9W2NoYXJ0OjpDaGFydF0gKCdhcycgbmFtZT1JRCk/OworCQkvLy8vCisJCS8vVGl0bGU6CisJCS8vCXtUaXRsZX0gInRpdGxlIiB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97VGl0bGV9ICJ0aXRsZSIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1RpdGxlfQorCQlwdWJsaWMgQWN0aW9uIGdldFRpdGxlQWN0aW9uXzAoKSB7IHJldHVybiBjVGl0bGVBY3Rpb25fMDsgfQorCisJCS8vInRpdGxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUaXRsZUtleXdvcmRfMSgpIHsgcmV0dXJuIGNUaXRsZUtleXdvcmRfMTsgfQorCisJCS8vdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfM18wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgU3ViVGl0bGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiU3ViVGl0bGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNTdWJUaXRsZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N1YnRpdGxlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0QXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljVGV4dEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vU3ViVGl0bGU6CisJCS8vCXtTdWJUaXRsZX0gInN1YnRpdGxlIiB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97U3ViVGl0bGV9ICJzdWJ0aXRsZSIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1N1YlRpdGxlfQorCQlwdWJsaWMgQWN0aW9uIGdldFN1YlRpdGxlQWN0aW9uXzAoKSB7IHJldHVybiBjU3ViVGl0bGVBY3Rpb25fMDsgfQorCisJCS8vInN1YnRpdGxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdWJ0aXRsZUtleXdvcmRfMSgpIHsgcmV0dXJuIGNTdWJ0aXRsZUtleXdvcmRfMTsgfQorCisJCS8vdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfM18wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgU3ViU3ViVGl0bGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiU3ViU3ViVGl0bGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNTdWJTdWJUaXRsZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N1YnN1YnRpdGxlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0QXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljVGV4dEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vU3ViU3ViVGl0bGU6CisJCS8vCXtTdWJTdWJUaXRsZX0gInN1YnN1YnRpdGxlIiB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97U3ViU3ViVGl0bGV9ICJzdWJzdWJ0aXRsZSIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1N1YlN1YlRpdGxlfQorCQlwdWJsaWMgQWN0aW9uIGdldFN1YlN1YlRpdGxlQWN0aW9uXzAoKSB7IHJldHVybiBjU3ViU3ViVGl0bGVBY3Rpb25fMDsgfQorCisJCS8vInN1YnN1YnRpdGxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTdWJzdWJ0aXRsZUtleXdvcmRfMSgpIHsgcmV0dXJuIGNTdWJzdWJ0aXRsZUtleXdvcmRfMTsgfQorCisJCS8vdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfM18wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgTGFiZWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiTGFiZWwiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNMYWJlbEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xhYmVsS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUZXh0QXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljVGV4dEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzMgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfM18wID0gKEtleXdvcmQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vTGFiZWw6CisJCS8vCXtMYWJlbH0gImxhYmVsIiB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97TGFiZWx9ICJsYWJlbCIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0xhYmVsfQorCQlwdWJsaWMgQWN0aW9uIGdldExhYmVsQWN0aW9uXzAoKSB7IHJldHVybiBjTGFiZWxBY3Rpb25fMDsgfQorCisJCS8vImxhYmVsIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMYWJlbEtleXdvcmRfMSgpIHsgcmV0dXJuIGNMYWJlbEtleXdvcmRfMTsgfQorCisJCS8vdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfM18wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGV4dEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUZXh0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjVGV4dEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RleHRLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RleHRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUZXh0VFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNUZXh0QXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0eWxlS2V5d29yZF8zXzAgPSAoS2V5d29yZCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3R5bGVBc3NpZ25tZW50XzNfMSA9IChBc3NpZ25tZW50KWNHcm91cF8zLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNTdHlsZUFzc2lnbm1lbnRfM18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8zXzFfMF8xID0gKFJ1bGVDYWxsKWNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfM18xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9UZXh0OgorCQkvLwl7VGV4dH0gInRleHQiIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tUZXh0fSAidGV4dCIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1RleHR9CisJCXB1YmxpYyBBY3Rpb24gZ2V0VGV4dEFjdGlvbl8wKCkgeyByZXR1cm4gY1RleHRBY3Rpb25fMDsgfQorCisJCS8vInRleHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRleHRLZXl3b3JkXzEoKSB7IHJldHVybiBjVGV4dEtleXdvcmRfMTsgfQorCisJCS8vdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGV4dEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNUZXh0QXNzaWdubWVudF8yOyB9CisKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFRleHRUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjVGV4dFRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8zKCkgeyByZXR1cm4gY0dyb3VwXzM7IH0KKworCQkvLyJzdHlsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3R5bGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTdHlsZUtleXdvcmRfM18wOyB9CisKKwkJLy9zdHlsZT1bU3R5bGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFN0eWxlQXNzaWdubWVudF8zXzEoKSB7IHJldHVybiBjU3R5bGVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vW1N0eWxlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0U3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzNfMV8wKCkgeyByZXR1cm4gY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8zXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldFN0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfM18xXzBfMSgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzNfMV8wXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQXV0b1RleHRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQXV0b1RleHQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQXV0b3RleHRLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1R5cGVBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUeXBlQXV0b1RleHRFbnVtRW51bVJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljVHlwZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzIgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdHlsZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1N0eWxlQXNzaWdubWVudF8yXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1N0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljU3R5bGVBc3NpZ25tZW50XzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1N0eWxlU3R5bGVJRFRlcm1pbmFsUnVsZUNhbGxfMl8xXzBfMSA9IChSdWxlQ2FsbCljU3R5bGVTdHlsZUNyb3NzUmVmZXJlbmNlXzJfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vQXV0b1RleHQ6CisJCS8vCSJhdXRvdGV4dCIgdHlwZT1BdXRvVGV4dEVudW0gKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImF1dG90ZXh0IiB0eXBlPUF1dG9UZXh0RW51bSAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iYXV0b3RleHQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEF1dG90ZXh0S2V5d29yZF8wKCkgeyByZXR1cm4gY0F1dG90ZXh0S2V5d29yZF8wOyB9CisKKwkJLy90eXBlPUF1dG9UZXh0RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUeXBlQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY1R5cGVBc3NpZ25tZW50XzE7IH0KKworCQkvL0F1dG9UZXh0RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VHlwZUF1dG9UZXh0RW51bUVudW1SdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjVHlwZUF1dG9UZXh0RW51bUVudW1SdWxlQ2FsbF8xXzA7IH0KKworCQkvLygic3R5bGUiIHN0eWxlPVtTdHlsZV0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisKKwkJLy8ic3R5bGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0eWxlS2V5d29yZF8yXzAoKSB7IHJldHVybiBjU3R5bGVLZXl3b3JkXzJfMDsgfQorCisJCS8vc3R5bGU9W1N0eWxlXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTdHlsZUFzc2lnbm1lbnRfMl8xKCkgeyByZXR1cm4gY1N0eWxlQXNzaWdubWVudF8yXzE7IH0KKworCQkvL1tTdHlsZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFN0eWxlU3R5bGVDcm9zc1JlZmVyZW5jZV8yXzFfMCgpIHsgcmV0dXJuIGNTdHlsZVN0eWxlQ3Jvc3NSZWZlcmVuY2VfMl8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTdHlsZVN0eWxlSURUZXJtaW5hbFJ1bGVDYWxsXzJfMV8wXzEoKSB7IHJldHVybiBjU3R5bGVTdHlsZUlEVGVybWluYWxSdWxlQ2FsbF8yXzFfMF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIEltYWdlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkltYWdlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ltYWdlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTaXplQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU2l6ZUltYWdlU2l6ZUVudW1FbnVtUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNTaXplQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NjYWxlS2V5d29yZF8yXzAgPSAoS2V5d29yZCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU2NhbGVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU2NhbGVVbnNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMV8wID0gKFJ1bGVDYWxsKWNTY2FsZUFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTb3VyY2VUeXBlQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU291cmNlVHlwZUltYWdlU291cmNlRW51bUVudW1SdWxlQ2FsbF8zXzAgPSAoUnVsZUNhbGwpY1NvdXJjZVR5cGVBc3NpZ25tZW50XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZpbGVuYW1lQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRmlsZW5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljRmlsZW5hbWVBc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9JbWFnZToKKwkJLy8JImltYWdlIiBzaXplPUltYWdlU2l6ZUVudW0gKCJzY2FsZSIgc2NhbGU9VW5zaWduZWROdW1iZXIpPyBzb3VyY2VUeXBlPUltYWdlU291cmNlRW51bSBmaWxlbmFtZT1TVFJJTkc7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iaW1hZ2UiIHNpemU9SW1hZ2VTaXplRW51bSAoInNjYWxlIiBzY2FsZT1VbnNpZ25lZE51bWJlcik/IHNvdXJjZVR5cGU9SW1hZ2VTb3VyY2VFbnVtIGZpbGVuYW1lPVNUUklORworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJpbWFnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0SW1hZ2VLZXl3b3JkXzAoKSB7IHJldHVybiBjSW1hZ2VLZXl3b3JkXzA7IH0KKworCQkvL3NpemU9SW1hZ2VTaXplRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTaXplQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY1NpemVBc3NpZ25tZW50XzE7IH0KKworCQkvL0ltYWdlU2l6ZUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFNpemVJbWFnZVNpemVFbnVtRW51bVJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNTaXplSW1hZ2VTaXplRW51bUVudW1SdWxlQ2FsbF8xXzA7IH0KKworCQkvLygic2NhbGUiIHNjYWxlPVVuc2lnbmVkTnVtYmVyKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzIoKSB7IHJldHVybiBjR3JvdXBfMjsgfQorCisJCS8vInNjYWxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTY2FsZUtleXdvcmRfMl8wKCkgeyByZXR1cm4gY1NjYWxlS2V5d29yZF8yXzA7IH0KKworCQkvL3NjYWxlPVVuc2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNjYWxlQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjU2NhbGVBc3NpZ25tZW50XzJfMTsgfQorCisJCS8vVW5zaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldFNjYWxlVW5zaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzFfMCgpIHsgcmV0dXJuIGNTY2FsZVVuc2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8xXzA7IH0KKworCQkvL3NvdXJjZVR5cGU9SW1hZ2VTb3VyY2VFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNvdXJjZVR5cGVBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjU291cmNlVHlwZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vSW1hZ2VTb3VyY2VFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRTb3VyY2VUeXBlSW1hZ2VTb3VyY2VFbnVtRW51bVJ1bGVDYWxsXzNfMCgpIHsgcmV0dXJuIGNTb3VyY2VUeXBlSW1hZ2VTb3VyY2VFbnVtRW51bVJ1bGVDYWxsXzNfMDsgfQorCisJCS8vZmlsZW5hbWU9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEZpbGVuYW1lQXNzaWdubWVudF80KCkgeyByZXR1cm4gY0ZpbGVuYW1lQXNzaWdubWVudF80OyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldEZpbGVuYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF80XzAoKSB7IHJldHVybiBjRmlsZW5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSZXBvcnRJbXBvcnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUmVwb3J0SW1wb3J0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ltcG9ydEtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRlZE5hbWVzcGFjZVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzAgPSAoUnVsZUNhbGwpY0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUmVwb3J0SW1wb3J0IHJldHVybnMgdHlwZXM6OkxJbXBvcnQ6CisJCS8vCSJpbXBvcnQiIGltcG9ydGVkTmFtZXNwYWNlPVJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vImltcG9ydCIKKwkJcHVibGljIEtleXdvcmQgZ2V0SW1wb3J0S2V5d29yZF8wKCkgeyByZXR1cm4gY0ltcG9ydEtleXdvcmRfMDsgfQorCisJCS8vaW1wb3J0ZWROYW1lc3BhY2U9UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMTsgfQorCisJCS8vUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1wb3J0ZWROYW1lc3BhY2VSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY0ltcG9ydGVkTmFtZXNwYWNlUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1F1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGdWxsU3RvcEtleXdvcmRfMV8wID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FzdGVyaXNrS2V5d29yZF8xXzEgPSAoS2V5d29yZCljR3JvdXBfMS5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1JlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ6CisJCS8vCVF1YWxpZmllZE5hbWUgKCIuIiAiKiIpPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1F1YWxpZmllZE5hbWUgKCIuIiAiKiIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL1F1YWxpZmllZE5hbWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1F1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy8oIi4iICIqIik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8xKCkgeyByZXR1cm4gY0dyb3VwXzE7IH0KKworCQkvLyIuIgorCQlwdWJsaWMgS2V5d29yZCBnZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY0Z1bGxTdG9wS2V5d29yZF8xXzA7IH0KKworCQkvLyIqIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkgeyByZXR1cm4gY0FzdGVyaXNrS2V5d29yZF8xXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVFJBTlNMQVRBQkxFU1RSSU5HRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRSQU5TTEFUQUJMRVNUUklORyIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsID0gKFJ1bGVDYWxsKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9UUkFOU0xBVEFCTEVTVFJJTkc6CisJCS8vCVNUUklORzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpIHsgcmV0dXJuIGNTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsOyB9CisJfQorCQorCQorCXB1YmxpYyBjbGFzcyBVbml0RW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJVbml0RW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNNTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01NTW1LZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNNTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDTUNtS2V5d29yZF8xXzAgPSAoS2V5d29yZCljQ01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1BURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUFRQdEtleXdvcmRfMl8wID0gKEtleXdvcmQpY1BURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNJTkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0lOSW5jaEtleXdvcmRfM18wID0gKEtleXdvcmQpY0lORW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNQQ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BDUGNLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNQQ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFTUVtS2V5d29yZF81XzAgPSAoS2V5d29yZCljRU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0VYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRVhFeEtleXdvcmRfNl8wID0gKEtleXdvcmQpY0VYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNQWEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BYUHhLZXl3b3JkXzdfMCA9IChLZXl3b3JkKWNQWEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUEVSQ0VOVEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BFUkNFTlRBR0VQZXJjZW50U2lnbktleXdvcmRfOF8wID0gKEtleXdvcmQpY1BFUkNFTlRBR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzguZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIFVuaXRFbnVtOgorCQkvLwlNTT0ibW0iIHwgQ009ImNtIiB8IFBUPSJwdCIgfCBJTj0iaW5jaCIgfCBQQz0icGMiIHwgRU09ImVtIiB8IEVYPSJleCIgfCBQWD0icHgiIHwgUEVSQ0VOVEFHRT0iJSI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vTU09Im1tIiB8IENNPSJjbSIgfCBQVD0icHQiIHwgSU49ImluY2giIHwgUEM9InBjIiB8IEVNPSJlbSIgfCBFWD0iZXgiIHwgUFg9InB4IiB8IFBFUkNFTlRBR0U9IiUiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vTU09Im1tIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRNTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNNTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vIm1tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRNTU1tS2V5d29yZF8wXzAoKSB7IHJldHVybiBjTU1NbUtleXdvcmRfMF8wOyB9CisKKwkJLy9DTT0iY20iCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY0NNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8iY20iCisJCXB1YmxpYyBLZXl3b3JkIGdldENNQ21LZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNDTUNtS2V5d29yZF8xXzA7IH0KKworCQkvL1BUPSJwdCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UFRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjUFRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJwdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UFRQdEtleXdvcmRfMl8wKCkgeyByZXR1cm4gY1BUUHRLZXl3b3JkXzJfMDsgfQorCisJCS8vSU49ImluY2giCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldElORW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0lORW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8iaW5jaCIKKwkJcHVibGljIEtleXdvcmQgZ2V0SU5JbmNoS2V5d29yZF8zXzAoKSB7IHJldHVybiBjSU5JbmNoS2V5d29yZF8zXzA7IH0KKworCQkvL1BDPSJwYyIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UENFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjUENFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJwYyIKKwkJcHVibGljIEtleXdvcmQgZ2V0UENQY0tleXdvcmRfNF8wKCkgeyByZXR1cm4gY1BDUGNLZXl3b3JkXzRfMDsgfQorCisJCS8vRU09ImVtIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRFTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpIHsgcmV0dXJuIGNFTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNTsgfQorCisJCS8vImVtIgorCQlwdWJsaWMgS2V5d29yZCBnZXRFTUVtS2V5d29yZF81XzAoKSB7IHJldHVybiBjRU1FbUtleXdvcmRfNV8wOyB9CisKKwkJLy9FWD0iZXgiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEVYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkgeyByZXR1cm4gY0VYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82OyB9CisKKwkJLy8iZXgiCisJCXB1YmxpYyBLZXl3b3JkIGdldEVYRXhLZXl3b3JkXzZfMCgpIHsgcmV0dXJuIGNFWEV4S2V5d29yZF82XzA7IH0KKworCQkvL1BYPSJweCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UFhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSB7IHJldHVybiBjUFhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzc7IH0KKworCQkvLyJweCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UFhQeEtleXdvcmRfN18wKCkgeyByZXR1cm4gY1BYUHhLZXl3b3JkXzdfMDsgfQorCisJCS8vUEVSQ0VOVEFHRT0iJSIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UEVSQ0VOVEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCgpIHsgcmV0dXJuIGNQRVJDRU5UQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl84OyB9CisKKwkJLy8iJSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UEVSQ0VOVEFHRVBlcmNlbnRTaWduS2V5d29yZF84XzAoKSB7IHJldHVybiBjUEVSQ0VOVEFHRVBlcmNlbnRTaWduS2V5d29yZF84XzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUGFnZVNpemVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBhZ2VTaXplRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNBNEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0E0QTRLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNBNEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBM0EzS2V5d29yZF8xXzAgPSAoS2V5d29yZCljQTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0E1RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQTVBNUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0E1RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNVU19MRVRURVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVU19MRVRURVJVc0xldHRlcktleXdvcmRfM18wID0gKEtleXdvcmQpY1VTX0xFVFRFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjVVNfTEVHQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVU19MRUdBTFVzTGVnYWxLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNVU19MRUdBTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjVVNfTEVER0VSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVVNfTEVER0VSVXNMZWRnZXJLZXl3b3JkXzVfMCA9IChLZXl3b3JkKWNVU19MRURHRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1VTX1NVUEVSX0JFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVU19TVVBFUl9CVXNTdXBlckJLZXl3b3JkXzZfMCA9IChLZXl3b3JkKWNVU19TVVBFUl9CRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBQYWdlU2l6ZUVudW06CisJCS8vCUE0PSJhNCIgfCBBMz0iYTMiIHwgQTU9ImE1IiB8IFVTX0xFVFRFUj0idXMtbGV0dGVyIiB8IFVTX0xFR0FMPSJ1cy1sZWdhbCIgfCBVU19MRURHRVI9InVzLWxlZGdlciIgfAorCQkvLwlVU19TVVBFUl9CPSJ1cy1zdXBlci1iIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9BND0iYTQiIHwgQTM9ImEzIiB8IEE1PSJhNSIgfCBVU19MRVRURVI9InVzLWxldHRlciIgfCBVU19MRUdBTD0idXMtbGVnYWwiIHwgVVNfTEVER0VSPSJ1cy1sZWRnZXIiIHwKKwkJLy9VU19TVVBFUl9CPSJ1cy1zdXBlci1iIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0E0PSJhNCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0QTRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjQTRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJhNCIKKwkJcHVibGljIEtleXdvcmQgZ2V0QTRBNEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0E0QTRLZXl3b3JkXzBfMDsgfQorCisJCS8vQTM9ImEzIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRBM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNBM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vImEzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBM0EzS2V5d29yZF8xXzAoKSB7IHJldHVybiBjQTNBM0tleXdvcmRfMV8wOyB9CisKKwkJLy9BNT0iYTUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEE1RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY0E1RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8iYTUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEE1QTVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNBNUE1S2V5d29yZF8yXzA7IH0KKworCQkvL1VTX0xFVFRFUj0idXMtbGV0dGVyIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRVU19MRVRURVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjVVNfTEVUVEVSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8idXMtbGV0dGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVU19MRVRURVJVc0xldHRlcktleXdvcmRfM18wKCkgeyByZXR1cm4gY1VTX0xFVFRFUlVzTGV0dGVyS2V5d29yZF8zXzA7IH0KKworCQkvL1VTX0xFR0FMPSJ1cy1sZWdhbCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0VVNfTEVHQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjVVNfTEVHQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJ1cy1sZWdhbCIKKwkJcHVibGljIEtleXdvcmQgZ2V0VVNfTEVHQUxVc0xlZ2FsS2V5d29yZF80XzAoKSB7IHJldHVybiBjVVNfTEVHQUxVc0xlZ2FsS2V5d29yZF80XzA7IH0KKworCQkvL1VTX0xFREdFUj0idXMtbGVkZ2VyIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRVU19MRURHRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSB7IHJldHVybiBjVVNfTEVER0VSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81OyB9CisKKwkJLy8idXMtbGVkZ2VyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVU19MRURHRVJVc0xlZGdlcktleXdvcmRfNV8wKCkgeyByZXR1cm4gY1VTX0xFREdFUlVzTGVkZ2VyS2V5d29yZF81XzA7IH0KKworCQkvL1VTX1NVUEVSX0I9InVzLXN1cGVyLWIiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFVTX1NVUEVSX0JFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSB7IHJldHVybiBjVVNfU1VQRVJfQkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNjsgfQorCisJCS8vInVzLXN1cGVyLWIiCisJCXB1YmxpYyBLZXl3b3JkIGdldFVTX1NVUEVSX0JVc1N1cGVyQktleXdvcmRfNl8wKCkgeyByZXR1cm4gY1VTX1NVUEVSX0JVc1N1cGVyQktleXdvcmRfNl8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIE9yaWVudGF0aW9uRW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJPcmllbnRhdGlvbkVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUE9SVFJBSVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQT1JUUkFJVFBvcnRyYWl0S2V5d29yZF8wXzAgPSAoS2V5d29yZCljUE9SVFJBSVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0xBTkRTQ0FQRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xBTkRTQ0FQRUxhbmRzY2FwZUtleXdvcmRfMV8wID0gKEtleXdvcmQpY0xBTkRTQ0FQRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gT3JpZW50YXRpb25FbnVtOgorCQkvLwlQT1JUUkFJVD0icG9ydHJhaXQiIHwgTEFORFNDQVBFPSJsYW5kc2NhcGUiOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1BPUlRSQUlUPSJwb3J0cmFpdCIgfCBMQU5EU0NBUEU9ImxhbmRzY2FwZSIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9QT1JUUkFJVD0icG9ydHJhaXQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFBPUlRSQUlURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY1BPUlRSQUlURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8icG9ydHJhaXQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBPUlRSQUlUUG9ydHJhaXRLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNQT1JUUkFJVFBvcnRyYWl0S2V5d29yZF8wXzA7IH0KKworCQkvL0xBTkRTQ0FQRT0ibGFuZHNjYXBlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRMQU5EU0NBUEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjTEFORFNDQVBFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8ibGFuZHNjYXBlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMQU5EU0NBUEVMYW5kc2NhcGVLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNMQU5EU0NBUEVMYW5kc2NhcGVLZXl3b3JkXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBGb250U3R5bGVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkZvbnRTdHlsZUVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjTk9STUFMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTk9STUFMTm9ybWFsS2V5d29yZF8wXzAgPSAoS2V5d29yZCljTk9STUFMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNJVEFMSUNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJVEFMSUNJdGFsaWNLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNJVEFMSUNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY09CTElRVUVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNPQkxJUVVFT2JsaXF1ZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY09CTElRVUVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIEZvbnRTdHlsZUVudW06CisJCS8vCU5PUk1BTD0ibm9ybWFsIiB8IElUQUxJQz0iaXRhbGljIiB8IE9CTElRVUU9Im9ibGlxdWUiOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL05PUk1BTD0ibm9ybWFsIiB8IElUQUxJQz0iaXRhbGljIiB8IE9CTElRVUU9Im9ibGlxdWUiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vTk9STUFMPSJub3JtYWwiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNOT1JNQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJub3JtYWwiCisJCXB1YmxpYyBLZXl3b3JkIGdldE5PUk1BTE5vcm1hbEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY05PUk1BTE5vcm1hbEtleXdvcmRfMF8wOyB9CisKKwkJLy9JVEFMSUM9Iml0YWxpYyIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0SVRBTElDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY0lUQUxJQ0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vIml0YWxpYyIKKwkJcHVibGljIEtleXdvcmQgZ2V0SVRBTElDSXRhbGljS2V5d29yZF8xXzAoKSB7IHJldHVybiBjSVRBTElDSXRhbGljS2V5d29yZF8xXzA7IH0KKworCQkvL09CTElRVUU9Im9ibGlxdWUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldE9CTElRVUVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjT0JMSVFVRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vIm9ibGlxdWUiCisJCXB1YmxpYyBLZXl3b3JkIGdldE9CTElRVUVPYmxpcXVlS2V5d29yZF8yXzAoKSB7IHJldHVybiBjT0JMSVFVRU9ibGlxdWVLZXl3b3JkXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBCdWlsZEluRm9udEZhbWlseUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQnVpbGRJbkZvbnRGYW1pbHlFbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY01PTk9TUEFDRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01PTk9TUEFDRU1vbm9zcGFjZUtleXdvcmRfMF8wID0gKEtleXdvcmQpY01PTk9TUEFDRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjU0FOU19TRVJJRkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NBTlNfU0VSSUZTYW5zU2VyaWZLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNTQU5TX1NFUklGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTRVJJRkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NFUklGU2VyaWZLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNTRVJJRkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gQnVpbGRJbkZvbnRGYW1pbHlFbnVtOgorCQkvLwlNT05PU1BBQ0U9Im1vbm9zcGFjZSIgfCBTQU5TX1NFUklGPSJzYW5zLXNlcmlmIiB8IFNFUklGPSJzZXJpZiI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vTU9OT1NQQUNFPSJtb25vc3BhY2UiIHwgU0FOU19TRVJJRj0ic2Fucy1zZXJpZiIgfCBTRVJJRj0ic2VyaWYiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vTU9OT1NQQUNFPSJtb25vc3BhY2UiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldE1PTk9TUEFDRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNNT05PU1BBQ0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJtb25vc3BhY2UiCisJCXB1YmxpYyBLZXl3b3JkIGdldE1PTk9TUEFDRU1vbm9zcGFjZUtleXdvcmRfMF8wKCkgeyByZXR1cm4gY01PTk9TUEFDRU1vbm9zcGFjZUtleXdvcmRfMF8wOyB9CisKKwkJLy9TQU5TX1NFUklGPSJzYW5zLXNlcmlmIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRTQU5TX1NFUklGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY1NBTlNfU0VSSUZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJzYW5zLXNlcmlmIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTQU5TX1NFUklGU2Fuc1NlcmlmS2V5d29yZF8xXzAoKSB7IHJldHVybiBjU0FOU19TRVJJRlNhbnNTZXJpZktleXdvcmRfMV8wOyB9CisKKwkJLy9TRVJJRj0ic2VyaWYiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFNFUklGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY1NFUklGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8ic2VyaWYiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNFUklGU2VyaWZLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNTRVJJRlNlcmlmS2V5d29yZF8yXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGV4dEFsaWduRW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUZXh0QWxpZ25FbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0xFRlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMRUZUTGVmdEtleXdvcmRfMF8wID0gKEtleXdvcmQpY0xFRlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NFTlRFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NFTlRFUkNlbnRlcktleXdvcmRfMV8wID0gKEtleXdvcmQpY0NFTlRFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUklHSFRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSSUdIVFJpZ2h0S2V5d29yZF8yXzAgPSAoS2V5d29yZCljUklHSFRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIFRleHRBbGlnbkVudW06CisJCS8vCUxFRlQ9ImxlZnQiIHwgQ0VOVEVSPSJjZW50ZXIiIHwgUklHSFQ9InJpZ2h0IjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9MRUZUPSJsZWZ0IiB8IENFTlRFUj0iY2VudGVyIiB8IFJJR0hUPSJyaWdodCIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9MRUZUPSJsZWZ0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRMRUZURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY0xFRlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJsZWZ0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMRUZUTGVmdEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0xFRlRMZWZ0S2V5d29yZF8wXzA7IH0KKworCQkvL0NFTlRFUj0iY2VudGVyIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRDRU5URVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjQ0VOVEVSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8iY2VudGVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDRU5URVJDZW50ZXJLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNDRU5URVJDZW50ZXJLZXl3b3JkXzFfMDsgfQorCisJCS8vUklHSFQ9InJpZ2h0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRSSUdIVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNSSUdIVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vInJpZ2h0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSSUdIVFJpZ2h0S2V5d29yZF8yXzAoKSB7IHJldHVybiBjUklHSFRSaWdodEtleXdvcmRfMl8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIE51bWJlckZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjVU5GT1JNQVRURURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVTkZPUk1BVFRFRFVuZm9ybWF0dGVkS2V5d29yZF8wXzAgPSAoS2V5d29yZCljVU5GT1JNQVRURURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0dFTkVSQUxfTlVNQkVSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjR0VORVJBTF9OVU1CRVJHZW5lcmFsTnVtYmVyS2V5d29yZF8xXzAgPSAoS2V5d29yZCljR0VORVJBTF9OVU1CRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0ZJWEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRklYRURGaXhlZEtleXdvcmRfMl8wID0gKEtleXdvcmQpY0ZJWEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNQRVJDRU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUEVSQ0VOVFBlcmNlbnRLZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNQRVJDRU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTQ0lFTlRJRklDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU0NJRU5USUZJQ1NjaWVudGlmaWNLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNTQ0lFTlRJRklDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDVVNUT01DdXN0b21LZXl3b3JkXzVfMCA9IChLZXl3b3JkKWNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIE51bWJlckZvcm1hdENhdGVnb3J5RW51bToKKwkJLy8JVU5GT1JNQVRURUQ9InVuZm9ybWF0dGVkIiB8IEdFTkVSQUxfTlVNQkVSPSJnZW5lcmFsLW51bWJlciIgfCBGSVhFRD0iZml4ZWQiIHwgUEVSQ0VOVD0icGVyY2VudCIgfAorCQkvLwlTQ0lFTlRJRklDPSJzY2llbnRpZmljIiB8IENVU1RPTT0iY3VzdG9tIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9VTkZPUk1BVFRFRD0idW5mb3JtYXR0ZWQiIHwgR0VORVJBTF9OVU1CRVI9ImdlbmVyYWwtbnVtYmVyIiB8IEZJWEVEPSJmaXhlZCIgfCBQRVJDRU5UPSJwZXJjZW50IiB8CisJCS8vU0NJRU5USUZJQz0ic2NpZW50aWZpYyIgfCBDVVNUT009ImN1c3RvbSIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9VTkZPUk1BVFRFRD0idW5mb3JtYXR0ZWQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFVORk9STUFUVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY1VORk9STUFUVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8idW5mb3JtYXR0ZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFVORk9STUFUVEVEVW5mb3JtYXR0ZWRLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNVTkZPUk1BVFRFRFVuZm9ybWF0dGVkS2V5d29yZF8wXzA7IH0KKworCQkvL0dFTkVSQUxfTlVNQkVSPSJnZW5lcmFsLW51bWJlciIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0R0VORVJBTF9OVU1CRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjR0VORVJBTF9OVU1CRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJnZW5lcmFsLW51bWJlciIKKwkJcHVibGljIEtleXdvcmQgZ2V0R0VORVJBTF9OVU1CRVJHZW5lcmFsTnVtYmVyS2V5d29yZF8xXzAoKSB7IHJldHVybiBjR0VORVJBTF9OVU1CRVJHZW5lcmFsTnVtYmVyS2V5d29yZF8xXzA7IH0KKworCQkvL0ZJWEVEPSJmaXhlZCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0RklYRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjRklYRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJmaXhlZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0RklYRURGaXhlZEtleXdvcmRfMl8wKCkgeyByZXR1cm4gY0ZJWEVERml4ZWRLZXl3b3JkXzJfMDsgfQorCisJCS8vUEVSQ0VOVD0icGVyY2VudCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UEVSQ0VOVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpIHsgcmV0dXJuIGNQRVJDRU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8icGVyY2VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UEVSQ0VOVFBlcmNlbnRLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNQRVJDRU5UUGVyY2VudEtleXdvcmRfM18wOyB9CisKKwkJLy9TQ0lFTlRJRklDPSJzY2llbnRpZmljIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRTQ0lFTlRJRklDRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkgeyByZXR1cm4gY1NDSUVOVElGSUNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJzY2llbnRpZmljIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTQ0lFTlRJRklDU2NpZW50aWZpY0tleXdvcmRfNF8wKCkgeyByZXR1cm4gY1NDSUVOVElGSUNTY2llbnRpZmljS2V5d29yZF80XzA7IH0KKworCQkvL0NVU1RPTT0iY3VzdG9tIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSB7IHJldHVybiBjQ1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81OyB9CisKKwkJLy8iY3VzdG9tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDVVNUT01DdXN0b21LZXl3b3JkXzVfMCgpIHsgcmV0dXJuIGNDVVNUT01DdXN0b21LZXl3b3JkXzVfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNVTkZPUk1BVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1VORk9STUFUVEVEVW5mb3JtYXR0ZWRLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNVTkZPUk1BVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ1VSUkVOQ1lFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDVVJSRU5DWUN1cnJlbmN5S2V5d29yZF8xXzAgPSAoS2V5d29yZCljQ1VSUkVOQ1lFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NVU1RPTUN1c3RvbUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0NVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW06CisJCS8vCVVORk9STUFUVEVEPSJ1bmZvcm1hdHRlZCIgfCBDVVJSRU5DWT0iY3VycmVuY3kiIHwgQ1VTVE9NPSJjdXN0b20iOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1VORk9STUFUVEVEPSJ1bmZvcm1hdHRlZCIgfCBDVVJSRU5DWT0iY3VycmVuY3kiIHwgQ1VTVE9NPSJjdXN0b20iCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vVU5GT1JNQVRURUQ9InVuZm9ybWF0dGVkIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRVTkZPUk1BVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNVTkZPUk1BVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vInVuZm9ybWF0dGVkIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVTkZPUk1BVFRFRFVuZm9ybWF0dGVkS2V5d29yZF8wXzAoKSB7IHJldHVybiBjVU5GT1JNQVRURURVbmZvcm1hdHRlZEtleXdvcmRfMF8wOyB9CisKKwkJLy9DVVJSRU5DWT0iY3VycmVuY3kiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENVUlJFTkNZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY0NVUlJFTkNZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8iY3VycmVuY3kiCisJCXB1YmxpYyBLZXl3b3JkIGdldENVUlJFTkNZQ3VycmVuY3lLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNDVVJSRU5DWUN1cnJlbmN5S2V5d29yZF8xXzA7IH0KKworCQkvL0NVU1RPTT0iY3VzdG9tIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjQ1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8iY3VzdG9tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDVVNUT01DdXN0b21LZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNDVVNUT01DdXN0b21LZXl3b3JkXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGVGb3JtYXRDYXRlZ29yeUVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ1VTVE9NQ3VzdG9tS2V5d29yZF8wID0gKEtleXdvcmQpY0NVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb24uZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIERhdGVGb3JtYXRDYXRlZ29yeUVudW06CisJCS8vCUNVU1RPTT0iY3VzdG9tIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DVVNUT009ImN1c3RvbSIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Q1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpIHsgcmV0dXJuIGNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uOyB9CisKKwkJLy8iY3VzdG9tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRDVVNUT01DdXN0b21LZXl3b3JkXzAoKSB7IHJldHVybiBjQ1VTVE9NQ3VzdG9tS2V5d29yZF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkRhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NVU1RPTUN1c3RvbUtleXdvcmRfMCA9IChLZXl3b3JkKWNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bToKKwkJLy8JQ1VTVE9NPSJjdXN0b20iOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0NVU1RPTT0iY3VzdG9tIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkgeyByZXR1cm4gY0NVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb247IH0KKworCQkvLyJjdXN0b20iCisJCXB1YmxpYyBLZXl3b3JkIGdldENVU1RPTUN1c3RvbUtleXdvcmRfMCgpIHsgcmV0dXJuIGNDVVNUT01DdXN0b21LZXl3b3JkXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGltZUZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIik7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NVU1RPTUN1c3RvbUtleXdvcmRfMCA9IChLZXl3b3JkKWNDVVNUT01FbnVtTGl0ZXJhbERlY2xhcmF0aW9uLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtOgorCQkvLwlDVVNUT009ImN1c3RvbSI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vQ1VTVE9NPSJjdXN0b20iCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENVU1RPTUVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSB7IHJldHVybiBjQ1VTVE9NRW51bUxpdGVyYWxEZWNsYXJhdGlvbjsgfQorCisJCS8vImN1c3RvbSIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q1VTVE9NQ3VzdG9tS2V5d29yZF8wKCkgeyByZXR1cm4gY0NVU1RPTUN1c3RvbUtleXdvcmRfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSZW5kZXJpbmdFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJlbmRlcmluZ0VudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjSFRNTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0hUTUxIdG1sS2V5d29yZF8wXzAgPSAoS2V5d29yZCljSFRNTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUERGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUERGUGRmS2V5d29yZF8xXzAgPSAoS2V5d29yZCljUERGRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBSZW5kZXJpbmdFbnVtOgorCQkvLwlIVE1MPSJodG1sIiB8IFBERj0icGRmIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9IVE1MPSJodG1sIiB8IFBERj0icGRmIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0hUTUw9Imh0bWwiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEhUTUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjSFRNTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vImh0bWwiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhUTUxIdG1sS2V5d29yZF8wXzAoKSB7IHJldHVybiBjSFRNTEh0bWxLZXl3b3JkXzBfMDsgfQorCisJCS8vUERGPSJwZGYiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFBERkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNQREZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJwZGYiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBERlBkZktleXdvcmRfMV8wKCkgeyByZXR1cm4gY1BERlBkZktleXdvcmRfMV8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ09VTlRDb3VudEtleXdvcmRfMF8wID0gKEtleXdvcmQpY0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNSVU5OSU5HQ09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSVU5OSU5HQ09VTlRSdW5uaW5nQ291bnRLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNSVU5OSU5HQ09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtOgorCQkvLwlDT1VOVD0iY291bnQiIHwgUlVOTklOR0NPVU5UPSJydW5uaW5nLWNvdW50IjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DT1VOVD0iY291bnQiIHwgUlVOTklOR0NPVU5UPSJydW5uaW5nLWNvdW50IgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0NPVU5UPSJjb3VudCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Q09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjQ09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJjb3VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q09VTlRDb3VudEtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0NPVU5UQ291bnRLZXl3b3JkXzBfMDsgfQorCisJCS8vUlVOTklOR0NPVU5UPSJydW5uaW5nLWNvdW50IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRSVU5OSU5HQ09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjUlVOTklOR0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8icnVubmluZy1jb3VudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UlVOTklOR0NPVU5UUnVubmluZ0NvdW50S2V5d29yZF8xXzAoKSB7IHJldHVybiBjUlVOTklOR0NPVU5UUnVubmluZ0NvdW50S2V5d29yZF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTVU1TdW1LZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0FWRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FWRUF2ZXJhZ2VLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNBVkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY01JTkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01JTk1pbmltdW1LZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNNSU5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY01BWEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY01BWE1heGltdW1LZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNNQVhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1JVTk5JTkdTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSVU5OSU5HU1VNUnVubmluZ1N1bUtleXdvcmRfNF8wID0gKEtleXdvcmQpY1JVTk5JTkdTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIFVuYXJ5QWdncmVnYXRpb25UeXBlRW51bToKKwkJLy8JU1VNPSJzdW0iIHwgQVZFPSJhdmVyYWdlIiB8IE1JTj0ibWluaW11bSIgfCBNQVg9Im1heGltdW0iIHwgUlVOTklOR1NVTT0icnVubmluZy1zdW0iOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1NVTT0ic3VtIiB8IEFWRT0iYXZlcmFnZSIgfCBNSU49Im1pbmltdW0iIHwgTUFYPSJtYXhpbXVtIiB8IFJVTk5JTkdTVU09InJ1bm5pbmctc3VtIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1NVTT0ic3VtIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjU1VNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8ic3VtIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTVU1TdW1LZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNTVU1TdW1LZXl3b3JkXzBfMDsgfQorCisJCS8vQVZFPSJhdmVyYWdlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRBVkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjQVZFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8iYXZlcmFnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0QVZFQXZlcmFnZUtleXdvcmRfMV8wKCkgeyByZXR1cm4gY0FWRUF2ZXJhZ2VLZXl3b3JkXzFfMDsgfQorCisJCS8vTUlOPSJtaW5pbXVtIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRNSU5FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjTUlORW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8ibWluaW11bSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TUlOTWluaW11bUtleXdvcmRfMl8wKCkgeyByZXR1cm4gY01JTk1pbmltdW1LZXl3b3JkXzJfMDsgfQorCisJCS8vTUFYPSJtYXhpbXVtIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRNQVhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjTUFYRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8ibWF4aW11bSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TUFYTWF4aW11bUtleXdvcmRfM18wKCkgeyByZXR1cm4gY01BWE1heGltdW1LZXl3b3JkXzNfMDsgfQorCisJCS8vUlVOTklOR1NVTT0icnVubmluZy1zdW0iCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFJVTk5JTkdTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjUlVOTklOR1NVTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNDsgfQorCisJCS8vInJ1bm5pbmctc3VtIgorCQlwdWJsaWMgS2V5d29yZCBnZXRSVU5OSU5HU1VNUnVubmluZ1N1bUtleXdvcmRfNF8wKCkgeyByZXR1cm4gY1JVTk5JTkdTVU1SdW5uaW5nU3VtS2V5d29yZF80XzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtIik7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRElWRW51bUxpdGVyYWxEZWNsYXJhdGlvbiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RJVkRpdmlkZUtleXdvcmRfMCA9IChLZXl3b3JkKWNESVZFbnVtTGl0ZXJhbERlY2xhcmF0aW9uLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtOgorCQkvLwlESVY9ImRpdmlkZSI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vRElWPSJkaXZpZGUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldERJVkVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSB7IHJldHVybiBjRElWRW51bUxpdGVyYWxEZWNsYXJhdGlvbjsgfQorCisJCS8vImRpdmlkZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RElWRGl2aWRlS2V5d29yZF8wKCkgeyByZXR1cm4gY0RJVkRpdmlkZUtleXdvcmRfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtIik7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ09OQ0FURW51bUxpdGVyYWxEZWNsYXJhdGlvbiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NPTkNBVENvbmNhdEtleXdvcmRfMCA9IChLZXl3b3JkKWNDT05DQVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW06CisJCS8vCUNPTkNBVD0iY29uY2F0IjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DT05DQVQ9ImNvbmNhdCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Q09OQ0FURW51bUxpdGVyYWxEZWNsYXJhdGlvbigpIHsgcmV0dXJuIGNDT05DQVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uOyB9CisKKwkJLy8iY29uY2F0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRDT05DQVRDb25jYXRLZXl3b3JkXzAoKSB7IHJldHVybiBjQ09OQ0FUQ29uY2F0S2V5d29yZF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRyZW5kSWNvbkVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVHJlbmRJY29uRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNSSVNJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSSVNJTkdSaXNpbmdLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNSSVNJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0JBRFJJU0lOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0JBRFJJU0lOR0JhZFJpc2luZ0tleXdvcmRfMV8wID0gKEtleXdvcmQpY0JBRFJJU0lOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjU0xPUElOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NMT1BJTkdTbG9waW5nS2V5d29yZF8yXzAgPSAoS2V5d29yZCljU0xPUElOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjR09PRFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHT09EU0xPUElOR0dvb2RTbG9waW5nS2V5d29yZF8zXzAgPSAoS2V5d29yZCljR09PRFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1NUQUdOQVRJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTVEFHTkFUSU5HU3RhZ25hdGluZ0tleXdvcmRfNF8wID0gKEtleXdvcmQpY1NUQUdOQVRJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIFRyZW5kSWNvbkVudW06CisJCS8vCVJJU0lORz0icmlzaW5nIiB8IEJBRFJJU0lORz0iYmFkLXJpc2luZyIgfCBTTE9QSU5HPSJzbG9waW5nIiB8IEdPT0RTTE9QSU5HPSJnb29kLXNsb3BpbmciIHwgU1RBR05BVElORz0ic3RhZ25hdGluZyI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUklTSU5HPSJyaXNpbmciIHwgQkFEUklTSU5HPSJiYWQtcmlzaW5nIiB8IFNMT1BJTkc9InNsb3BpbmciIHwgR09PRFNMT1BJTkc9Imdvb2Qtc2xvcGluZyIgfCBTVEFHTkFUSU5HPSJzdGFnbmF0aW5nIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1JJU0lORz0icmlzaW5nIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRSSVNJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjUklTSU5HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8icmlzaW5nIgorCQlwdWJsaWMgS2V5d29yZCBnZXRSSVNJTkdSaXNpbmdLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNSSVNJTkdSaXNpbmdLZXl3b3JkXzBfMDsgfQorCisJCS8vQkFEUklTSU5HPSJiYWQtcmlzaW5nIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRCQURSSVNJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjQkFEUklTSU5HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8iYmFkLXJpc2luZyIKKwkJcHVibGljIEtleXdvcmQgZ2V0QkFEUklTSU5HQmFkUmlzaW5nS2V5d29yZF8xXzAoKSB7IHJldHVybiBjQkFEUklTSU5HQmFkUmlzaW5nS2V5d29yZF8xXzA7IH0KKworCQkvL1NMT1BJTkc9InNsb3BpbmciCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjU0xPUElOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vInNsb3BpbmciCisJCXB1YmxpYyBLZXl3b3JkIGdldFNMT1BJTkdTbG9waW5nS2V5d29yZF8yXzAoKSB7IHJldHVybiBjU0xPUElOR1Nsb3BpbmdLZXl3b3JkXzJfMDsgfQorCisJCS8vR09PRFNMT1BJTkc9Imdvb2Qtc2xvcGluZyIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0R09PRFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjR09PRFNMT1BJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzM7IH0KKworCQkvLyJnb29kLXNsb3BpbmciCisJCXB1YmxpYyBLZXl3b3JkIGdldEdPT0RTTE9QSU5HR29vZFNsb3BpbmdLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNHT09EU0xPUElOR0dvb2RTbG9waW5nS2V5d29yZF8zXzA7IH0KKworCQkvL1NUQUdOQVRJTkc9InN0YWduYXRpbmciCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFNUQUdOQVRJTkdFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjU1RBR05BVElOR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNDsgfQorCisJCS8vInN0YWduYXRpbmciCisJCXB1YmxpYyBLZXl3b3JkIGdldFNUQUdOQVRJTkdTdGFnbmF0aW5nS2V5d29yZF80XzAoKSB7IHJldHVybiBjU1RBR05BVElOR1N0YWduYXRpbmdLZXl3b3JkXzRfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBCb3JkZXJUeXBlRW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJCb3JkZXJUeXBlRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNOT05FRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTk9ORU5vbmVLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNOT05FRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTT0xJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NPTElEU29saWRLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNTT0xJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRE9UVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRE9UVEVERG90dGVkS2V5d29yZF8yXzAgPSAoS2V5d29yZCljRE9UVEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNEQVNIRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEQVNIRUREYXNoZWRLZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNEQVNIRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0RPVUJMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RPVUJMRURvdWJsZUtleXdvcmRfNF8wID0gKEtleXdvcmQpY0RPVUJMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjR1JPT1ZFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjR1JPT1ZFR3Jvb3ZlS2V5d29yZF81XzAgPSAoS2V5d29yZCljR1JPT1ZFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNSSURHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JJREdFUmlkZ2VLZXl3b3JkXzZfMCA9IChLZXl3b3JkKWNSSURHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjSU5TRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJTlNFVEluc2V0S2V5d29yZF83XzAgPSAoS2V5d29yZCljSU5TRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY09VVFNFVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDgpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY09VVFNFVE91dHNldEtleXdvcmRfOF8wID0gKEtleXdvcmQpY09VVFNFVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fOC5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gQm9yZGVyVHlwZUVudW06CisJCS8vCU5PTkU9Im5vbmUiIHwgU09MSUQ9InNvbGlkIiB8IERPVFRFRD0iZG90dGVkIiB8IERBU0hFRD0iZGFzaGVkIiB8IERPVUJMRT0iZG91YmxlIiB8IEdST09WRT0iZ3Jvb3ZlIiB8IFJJREdFPSJyaWRnZSIgfAorCQkvLwlJTlNFVD0iaW5zZXQiIHwgT1VUU0VUPSJvdXRzZXQiOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL05PTkU9Im5vbmUiIHwgU09MSUQ9InNvbGlkIiB8IERPVFRFRD0iZG90dGVkIiB8IERBU0hFRD0iZGFzaGVkIiB8IERPVUJMRT0iZG91YmxlIiB8IEdST09WRT0iZ3Jvb3ZlIiB8IFJJREdFPSJyaWRnZSIgfAorCQkvL0lOU0VUPSJpbnNldCIgfCBPVVRTRVQ9Im91dHNldCIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9OT05FPSJub25lIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROT05FRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY05PTkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJub25lIgorCQlwdWJsaWMgS2V5d29yZCBnZXROT05FTm9uZUtleXdvcmRfMF8wKCkgeyByZXR1cm4gY05PTkVOb25lS2V5d29yZF8wXzA7IH0KKworCQkvL1NPTElEPSJzb2xpZCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0U09MSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjU09MSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJzb2xpZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U09MSURTb2xpZEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY1NPTElEU29saWRLZXl3b3JkXzFfMDsgfQorCisJCS8vRE9UVEVEPSJkb3R0ZWQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldERPVFRFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNET1RURURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJkb3R0ZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldERPVFRFRERvdHRlZEtleXdvcmRfMl8wKCkgeyByZXR1cm4gY0RPVFRFRERvdHRlZEtleXdvcmRfMl8wOyB9CisKKwkJLy9EQVNIRUQ9ImRhc2hlZCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0REFTSEVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0RBU0hFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMzsgfQorCisJCS8vImRhc2hlZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0REFTSEVERGFzaGVkS2V5d29yZF8zXzAoKSB7IHJldHVybiBjREFTSEVERGFzaGVkS2V5d29yZF8zXzA7IH0KKworCQkvL0RPVUJMRT0iZG91YmxlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRET1VCTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjRE9VQkxFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80OyB9CisKKwkJLy8iZG91YmxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRET1VCTEVEb3VibGVLZXl3b3JkXzRfMCgpIHsgcmV0dXJuIGNET1VCTEVEb3VibGVLZXl3b3JkXzRfMDsgfQorCisJCS8vR1JPT1ZFPSJncm9vdmUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEdST09WRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpIHsgcmV0dXJuIGNHUk9PVkVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzU7IH0KKworCQkvLyJncm9vdmUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEdST09WRUdyb292ZUtleXdvcmRfNV8wKCkgeyByZXR1cm4gY0dST09WRUdyb292ZUtleXdvcmRfNV8wOyB9CisKKwkJLy9SSURHRT0icmlkZ2UiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFJJREdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkgeyByZXR1cm4gY1JJREdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82OyB9CisKKwkJLy8icmlkZ2UiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJJREdFUmlkZ2VLZXl3b3JkXzZfMCgpIHsgcmV0dXJuIGNSSURHRVJpZGdlS2V5d29yZF82XzA7IH0KKworCQkvL0lOU0VUPSJpbnNldCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0SU5TRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSB7IHJldHVybiBjSU5TRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzc7IH0KKworCQkvLyJpbnNldCIKKwkJcHVibGljIEtleXdvcmQgZ2V0SU5TRVRJbnNldEtleXdvcmRfN18wKCkgeyByZXR1cm4gY0lOU0VUSW5zZXRLZXl3b3JkXzdfMDsgfQorCisJCS8vT1VUU0VUPSJvdXRzZXQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldE9VVFNFVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fOCgpIHsgcmV0dXJuIGNPVVRTRVRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzg7IH0KKworCQkvLyJvdXRzZXQiCisJCXB1YmxpYyBLZXl3b3JkIGdldE9VVFNFVE91dHNldEtleXdvcmRfOF8wKCkgeyByZXR1cm4gY09VVFNFVE91dHNldEtleXdvcmRfOF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIEF1dG9UZXh0RW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJBdXRvVGV4dEVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUEFHRV9OVU1CRVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQQUdFX05VTUJFUlBhZ2VOdW1iZXJLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNQQUdFX05VTUJFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjVE9UQUxfUEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RPVEFMX1BBR0VUb3RhbFBhZ2VLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNUT1RBTF9QQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNQQUdFX05VTUJFUl9VTkZJTFRFUkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUEFHRV9OVU1CRVJfVU5GSUxURVJFRFBhZ2VOdW1iZXJVbmZpbHRlcmVkS2V5d29yZF8yXzAgPSAoS2V5d29yZCljUEFHRV9OVU1CRVJfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjVE9UQUxfUEFHRV9VTkZJTFRFUkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVE9UQUxfUEFHRV9VTkZJTFRFUkVEVG90YWxQYWdlVW5maWx0ZXJlZEtleXdvcmRfM18wID0gKEtleXdvcmQpY1RPVEFMX1BBR0VfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjUEFHRV9WQVJJQUJMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BBR0VfVkFSSUFCTEVQYWdlVmFyaWFibGVLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNQQUdFX1ZBUklBQkxFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBBdXRvVGV4dEVudW06CisJCS8vCVBBR0VfTlVNQkVSPSJwYWdlLW51bWJlciIgfCBUT1RBTF9QQUdFPSJ0b3RhbC1wYWdlIiB8IFBBR0VfTlVNQkVSX1VORklMVEVSRUQ9InBhZ2UtbnVtYmVyLXVuZmlsdGVyZWQiIHwKKwkJLy8JVE9UQUxfUEFHRV9VTkZJTFRFUkVEPSJ0b3RhbC1wYWdlLXVuZmlsdGVyZWQiIHwgUEFHRV9WQVJJQUJMRT0icGFnZS12YXJpYWJsZSI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUEFHRV9OVU1CRVI9InBhZ2UtbnVtYmVyIiB8IFRPVEFMX1BBR0U9InRvdGFsLXBhZ2UiIHwgUEFHRV9OVU1CRVJfVU5GSUxURVJFRD0icGFnZS1udW1iZXItdW5maWx0ZXJlZCIgfAorCQkvL1RPVEFMX1BBR0VfVU5GSUxURVJFRD0idG90YWwtcGFnZS11bmZpbHRlcmVkIiB8IFBBR0VfVkFSSUFCTEU9InBhZ2UtdmFyaWFibGUiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vUEFHRV9OVU1CRVI9InBhZ2UtbnVtYmVyIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRQQUdFX05VTUJFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNQQUdFX05VTUJFUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vInBhZ2UtbnVtYmVyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQQUdFX05VTUJFUlBhZ2VOdW1iZXJLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNQQUdFX05VTUJFUlBhZ2VOdW1iZXJLZXl3b3JkXzBfMDsgfQorCisJCS8vVE9UQUxfUEFHRT0idG90YWwtcGFnZSIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0VE9UQUxfUEFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNUT1RBTF9QQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8idG90YWwtcGFnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VE9UQUxfUEFHRVRvdGFsUGFnZUtleXdvcmRfMV8wKCkgeyByZXR1cm4gY1RPVEFMX1BBR0VUb3RhbFBhZ2VLZXl3b3JkXzFfMDsgfQorCisJCS8vUEFHRV9OVU1CRVJfVU5GSUxURVJFRD0icGFnZS1udW1iZXItdW5maWx0ZXJlZCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0UEFHRV9OVU1CRVJfVU5GSUxURVJFREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNQQUdFX05VTUJFUl9VTkZJTFRFUkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8icGFnZS1udW1iZXItdW5maWx0ZXJlZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0UEFHRV9OVU1CRVJfVU5GSUxURVJFRFBhZ2VOdW1iZXJVbmZpbHRlcmVkS2V5d29yZF8yXzAoKSB7IHJldHVybiBjUEFHRV9OVU1CRVJfVU5GSUxURVJFRFBhZ2VOdW1iZXJVbmZpbHRlcmVkS2V5d29yZF8yXzA7IH0KKworCQkvL1RPVEFMX1BBR0VfVU5GSUxURVJFRD0idG90YWwtcGFnZS11bmZpbHRlcmVkIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRUT1RBTF9QQUdFX1VORklMVEVSRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjVE9UQUxfUEFHRV9VTkZJTFRFUkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8idG90YWwtcGFnZS11bmZpbHRlcmVkIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUT1RBTF9QQUdFX1VORklMVEVSRURUb3RhbFBhZ2VVbmZpbHRlcmVkS2V5d29yZF8zXzAoKSB7IHJldHVybiBjVE9UQUxfUEFHRV9VTkZJTFRFUkVEVG90YWxQYWdlVW5maWx0ZXJlZEtleXdvcmRfM18wOyB9CisKKwkJLy9QQUdFX1ZBUklBQkxFPSJwYWdlLXZhcmlhYmxlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRQQUdFX1ZBUklBQkxFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkgeyByZXR1cm4gY1BBR0VfVkFSSUFCTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJwYWdlLXZhcmlhYmxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQQUdFX1ZBUklBQkxFUGFnZVZhcmlhYmxlS2V5d29yZF80XzAoKSB7IHJldHVybiBjUEFHRV9WQVJJQUJMRVBhZ2VWYXJpYWJsZUtleXdvcmRfNF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIEltYWdlU2l6ZUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiSW1hZ2VTaXplRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTSVpFX1RPX0lNQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU0laRV9UT19JTUFHRVNpemVUb0ltYWdlS2V5d29yZF8wXzAgPSAoS2V5d29yZCljU0laRV9UT19JTUFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjU0NBTEVfVE9fSVRFTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NDQUxFX1RPX0lURU1TY2FsZVRvSXRlbUtleXdvcmRfMV8wID0gKEtleXdvcmQpY1NDQUxFX1RPX0lURU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NMSVBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDTElQQ2xpcEtleXdvcmRfMl8wID0gKEtleXdvcmQpY0NMSVBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIEltYWdlU2l6ZUVudW06CisJCS8vCVNJWkVfVE9fSU1BR0U9InNpemUtdG8taW1hZ2UiIHwgU0NBTEVfVE9fSVRFTT0ic2NhbGUtdG8taXRlbSIgfCBDTElQPSJjbGlwIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9TSVpFX1RPX0lNQUdFPSJzaXplLXRvLWltYWdlIiB8IFNDQUxFX1RPX0lURU09InNjYWxlLXRvLWl0ZW0iIHwgQ0xJUD0iY2xpcCIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9TSVpFX1RPX0lNQUdFPSJzaXplLXRvLWltYWdlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRTSVpFX1RPX0lNQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY1NJWkVfVE9fSU1BR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJzaXplLXRvLWltYWdlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTSVpFX1RPX0lNQUdFU2l6ZVRvSW1hZ2VLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNTSVpFX1RPX0lNQUdFU2l6ZVRvSW1hZ2VLZXl3b3JkXzBfMDsgfQorCisJCS8vU0NBTEVfVE9fSVRFTT0ic2NhbGUtdG8taXRlbSIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0U0NBTEVfVE9fSVRFTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNTQ0FMRV9UT19JVEVNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8ic2NhbGUtdG8taXRlbSIKKwkJcHVibGljIEtleXdvcmQgZ2V0U0NBTEVfVE9fSVRFTVNjYWxlVG9JdGVtS2V5d29yZF8xXzAoKSB7IHJldHVybiBjU0NBTEVfVE9fSVRFTVNjYWxlVG9JdGVtS2V5d29yZF8xXzA7IH0KKworCQkvL0NMSVA9ImNsaXAiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENMSVBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjQ0xJUEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vImNsaXAiCisJCXB1YmxpYyBLZXl3b3JkIGdldENMSVBDbGlwS2V5d29yZF8yXzAoKSB7IHJldHVybiBjQ0xJUENsaXBLZXl3b3JkXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBJbWFnZVNvdXJjZUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiSW1hZ2VTb3VyY2VFbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0ZJTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGSUxFRmlsZUtleXdvcmRfMF8wID0gKEtleXdvcmQpY0ZJTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1VSTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1VSTFVybEtleXdvcmRfMV8wID0gKEtleXdvcmQpY1VSTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRU1CRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFTUJFREVtYmVkS2V5d29yZF8yXzAgPSAoS2V5d29yZCljRU1CRURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIEltYWdlU291cmNlRW51bToKKwkJLy8JRklMRT0iZmlsZSIgfCBVUkw9InVybCIgfCBFTUJFRD0iZW1iZWQiOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0ZJTEU9ImZpbGUiIHwgVVJMPSJ1cmwiIHwgRU1CRUQ9ImVtYmVkIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0ZJTEU9ImZpbGUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEZJTEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjRklMRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vImZpbGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEZJTEVGaWxlS2V5d29yZF8wXzAoKSB7IHJldHVybiBjRklMRUZpbGVLZXl3b3JkXzBfMDsgfQorCisJCS8vVVJMPSJ1cmwiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFVSTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNVUkxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJ1cmwiCisJCXB1YmxpYyBLZXl3b3JkIGdldFVSTFVybEtleXdvcmRfMV8wKCkgeyByZXR1cm4gY1VSTFVybEtleXdvcmRfMV8wOyB9CisKKwkJLy9FTUJFRD0iZW1iZWQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEVNQkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY0VNQkVERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8iZW1iZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEVNQkVERW1iZWRLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNFTUJFREVtYmVkS2V5d29yZF8yXzA7IH0KKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBSZXBvcnRNb2RlbEVsZW1lbnRzIHBSZXBvcnRNb2RlbDsKKwlwcml2YXRlIGZpbmFsIFJlcG9ydFBhY2thZ2VFbGVtZW50cyBwUmVwb3J0UGFja2FnZTsKKwlwcml2YXRlIGZpbmFsIFBhZ2VUZW1wbGF0ZXNFbGVtZW50cyBwUGFnZVRlbXBsYXRlczsKKwlwcml2YXRlIGZpbmFsIFNvbWVGb3JtYXRzRWxlbWVudHMgcFNvbWVGb3JtYXRzOworCXByaXZhdGUgZmluYWwgQ29sb3JzRWxlbWVudHMgcENvbG9yczsKKwlwcml2YXRlIGZpbmFsIEZvbnRzRWxlbWVudHMgcEZvbnRzOworCXByaXZhdGUgZmluYWwgTWVkaWFzRWxlbWVudHMgcE1lZGlhczsKKwlwcml2YXRlIGZpbmFsIE1lZGlhRWxlbWVudHMgcE1lZGlhOworCXByaXZhdGUgZmluYWwgU3R5bGVzRWxlbWVudHMgcFN0eWxlczsKKwlwcml2YXRlIGZpbmFsIFBhZ2VUZW1wbGF0ZUVsZW1lbnRzIHBQYWdlVGVtcGxhdGU7CisJcHJpdmF0ZSBmaW5hbCBVbnNpZ25lZE51bWJlckVsZW1lbnRzIHBVbnNpZ25lZE51bWJlcjsKKwlwcml2YXRlIGZpbmFsIFVuaXRFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVVbml0RW51bTsKKwlwcml2YXRlIGZpbmFsIFBhZ2VTaXplRW51bUVsZW1lbnRzIHVua25vd25SdWxlUGFnZVNpemVFbnVtOworCXByaXZhdGUgZmluYWwgT3JpZW50YXRpb25FbnVtRWxlbWVudHMgdW5rbm93blJ1bGVPcmllbnRhdGlvbkVudW07CisJcHJpdmF0ZSBmaW5hbCBDb2xvckVsZW1lbnRzIHBDb2xvcjsKKwlwcml2YXRlIGZpbmFsIEZvbnRFbGVtZW50cyBwRm9udDsKKwlwcml2YXRlIGZpbmFsIEZvbnRTdHlsZUVudW1FbGVtZW50cyB1bmtub3duUnVsZUZvbnRTdHlsZUVudW07CisJcHJpdmF0ZSBmaW5hbCBGb250RmFtaWx5RWxlbWVudHMgcEZvbnRGYW1pbHk7CisJcHJpdmF0ZSBmaW5hbCBCdWlsZEluRm9udEZhbWlseUVsZW1lbnRzIHBCdWlsZEluRm9udEZhbWlseTsKKwlwcml2YXRlIGZpbmFsIEJ1aWxkSW5Gb250RmFtaWx5RW51bUVsZW1lbnRzIHVua25vd25SdWxlQnVpbGRJbkZvbnRGYW1pbHlFbnVtOworCXByaXZhdGUgZmluYWwgQ3VzdG9tRm9udEZhbWlseUVsZW1lbnRzIHBDdXN0b21Gb250RmFtaWx5OworCXByaXZhdGUgZmluYWwgQm9yZGVyU3R5bGVFbGVtZW50cyBwQm9yZGVyU3R5bGU7CisJcHJpdmF0ZSBmaW5hbCBTdHlsZUVsZW1lbnRzIHBTdHlsZTsKKwlwcml2YXRlIGZpbmFsIE1lZGlhU3R5bGVFbGVtZW50cyBwTWVkaWFTdHlsZTsKKwlwcml2YXRlIGZpbmFsIFRleHRBbGlnbkVudW1FbGVtZW50cyB1bmtub3duUnVsZVRleHRBbGlnbkVudW07CisJcHJpdmF0ZSBmaW5hbCBTb21lRm9ybWF0RWxlbWVudHMgcFNvbWVGb3JtYXQ7CisJcHJpdmF0ZSBmaW5hbCBVb21vRm9ybWF0RWxlbWVudHMgcFVvbW9Gb3JtYXQ7CisJcHJpdmF0ZSBmaW5hbCBOdW1iZXJGb3JtYXRFbGVtZW50cyBwTnVtYmVyRm9ybWF0OworCXByaXZhdGUgZmluYWwgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW07CisJcHJpdmF0ZSBmaW5hbCBDdXJyZW5jeUZvcm1hdEVsZW1lbnRzIHBDdXJyZW5jeUZvcm1hdDsKKwlwcml2YXRlIGZpbmFsIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bTsKKwlwcml2YXRlIGZpbmFsIERhdGVGb3JtYXRFbGVtZW50cyBwRGF0ZUZvcm1hdDsKKwlwcml2YXRlIGZpbmFsIERhdGVGb3JtYXRDYXRlZ29yeUVudW1FbGVtZW50cyB1bmtub3duUnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW07CisJcHJpdmF0ZSBmaW5hbCBEYXRlVGltZUZvcm1hdEVsZW1lbnRzIHBEYXRlVGltZUZvcm1hdDsKKwlwcml2YXRlIGZpbmFsIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVEYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bTsKKwlwcml2YXRlIGZpbmFsIFRpbWVGb3JtYXRFbGVtZW50cyBwVGltZUZvcm1hdDsKKwlwcml2YXRlIGZpbmFsIFRpbWVGb3JtYXRDYXRlZ29yeUVudW1FbGVtZW50cyB1bmtub3duUnVsZVRpbWVGb3JtYXRDYXRlZ29yeUVudW07CisJcHJpdmF0ZSBmaW5hbCBSZXBvcnRFbGVtZW50cyBwUmVwb3J0OworCXByaXZhdGUgZmluYWwgUmVuZGVyaW5nRW51bUVsZW1lbnRzIHVua25vd25SdWxlUmVuZGVyaW5nRW51bTsKKwlwcml2YXRlIGZpbmFsIFJlcG9ydERlc2lnbkVsZW1lbnRzIHBSZXBvcnREZXNpZ247CisJcHJpdmF0ZSBmaW5hbCBSZXBvcnREZXNpZ25GaWxlRWxlbWVudHMgcFJlcG9ydERlc2lnbkZpbGU7CisJcHJpdmF0ZSBmaW5hbCBSZXBvcnREZXNpZ25UZW1wbGF0ZUVsZW1lbnRzIHBSZXBvcnREZXNpZ25UZW1wbGF0ZTsKKwlwcml2YXRlIGZpbmFsIENvbnRhaW5lckVsZW1lbnRzIHBDb250YWluZXI7CisJcHJpdmF0ZSBmaW5hbCBQYWdlSGVhZGVyRWxlbWVudHMgcFBhZ2VIZWFkZXI7CisJcHJpdmF0ZSBmaW5hbCBQYWdlRGV0YWlsRWxlbWVudHMgcFBhZ2VEZXRhaWw7CisJcHJpdmF0ZSBmaW5hbCBQYWdlRm9vdGVyRWxlbWVudHMgcFBhZ2VGb290ZXI7CisJcHJpdmF0ZSBmaW5hbCBFbGVtZW50RWxlbWVudHMgcEVsZW1lbnQ7CisJcHJpdmF0ZSBmaW5hbCBHcmlkRWxlbWVudHMgcEdyaWQ7CisJcHJpdmF0ZSBmaW5hbCBHcmlkUm93RWxlbWVudHMgcEdyaWRSb3c7CisJcHJpdmF0ZSBmaW5hbCBHcmlkQ2VsbEVsZW1lbnRzIHBHcmlkQ2VsbDsKKwlwcml2YXRlIGZpbmFsIERhdGFtYXJ0VGFibGVFbGVtZW50cyBwRGF0YW1hcnRUYWJsZTsKKwlwcml2YXRlIGZpbmFsIERhdGFtYXJ0VGFibGVHcm91cEVsZW1lbnRzIHBEYXRhbWFydFRhYmxlR3JvdXA7CisJcHJpdmF0ZSBmaW5hbCBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFbGVtZW50cyBwRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOworCXByaXZhdGUgZmluYWwgRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyRWxlbWVudHMgcERhdGFtYXJ0VGFibGVHcm91cEZvb3RlcjsKKwlwcml2YXRlIGZpbmFsIERhdGFtYXJ0VGFibGVEZXRhaWxFbGVtZW50cyBwRGF0YW1hcnRUYWJsZURldGFpbDsKKwlwcml2YXRlIGZpbmFsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eUVsZW1lbnRzIHBEYXRhbWFydFRhYmxlUHJvcGVydHk7CisJcHJpdmF0ZSBmaW5hbCBQdXJlQWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzIHVua25vd25SdWxlUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJcHJpdmF0ZSBmaW5hbCBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1FbGVtZW50cyB1bmtub3duUnVsZVVuYXJ5QWdncmVnYXRpb25UeXBlRW51bTsKKwlwcml2YXRlIGZpbmFsIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1FbGVtZW50cyB1bmtub3duUnVsZUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJcHJpdmF0ZSBmaW5hbCBNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbGVtZW50cyB1bmtub3duUnVsZU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bTsKKwlwcml2YXRlIGZpbmFsIFRhYmxlRm9ybWF0dGVyRWxlbWVudHMgcFRhYmxlRm9ybWF0dGVyOworCXByaXZhdGUgZmluYWwgVGFibGVJbWFnZUVsZW1lbnRzIHBUYWJsZUltYWdlOworCXByaXZhdGUgZmluYWwgVGFibGVWYWx1ZUVsZW1lbnRFbGVtZW50cyBwVGFibGVWYWx1ZUVsZW1lbnQ7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZVByb3BlcnR5RWxlbWVudHMgcFRhYmxlUHJvcGVydHk7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZUFnZ3JlZ2F0aW9uRWxlbWVudHMgcFRhYmxlQWdncmVnYXRpb247CisJcHJpdmF0ZSBmaW5hbCBUYWJsZUJhc2VBZ2dyZWdhdGlvbkVsZW1lbnRzIHBUYWJsZUJhc2VBZ2dyZWdhdGlvbjsKKwlwcml2YXRlIGZpbmFsIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uRWxlbWVudHMgcFRhYmxlUHVyZUFnZ3JlZ2F0aW9uOworCXByaXZhdGUgZmluYWwgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMgcFRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKKwlwcml2YXRlIGZpbmFsIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkVsZW1lbnRzIHBUYWJsZU11bHRpcGxlQWdncmVnYXRpb247CisJcHJpdmF0ZSBmaW5hbCBUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMgcFRhYmxlQmluYXJ5QWdncmVnYXRpb247CisJcHJpdmF0ZSBmaW5hbCBUYWJsZUludGVydmFsRWxlbWVudHMgcFRhYmxlSW50ZXJ2YWw7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZU51bWJlckludGVydmFsRWxlbWVudHMgcFRhYmxlTnVtYmVySW50ZXJ2YWw7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZURhdGVEYXlJbnRlcnZhbEVsZW1lbnRzIHBUYWJsZURhdGVEYXlJbnRlcnZhbDsKKwlwcml2YXRlIGZpbmFsIFRhYmxlTG9va3VwRWxlbWVudHMgcFRhYmxlTG9va3VwOworCXByaXZhdGUgZmluYWwgVGFibGVOdW1iZXJMb29rdXBFbGVtZW50cyBwVGFibGVOdW1iZXJMb29rdXA7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZVN0cmluZ0xvb2t1cEVsZW1lbnRzIHBUYWJsZVN0cmluZ0xvb2t1cDsKKwlwcml2YXRlIGZpbmFsIFRhYmxlRGF0ZURheUxvb2t1cEVsZW1lbnRzIHBUYWJsZURhdGVEYXlMb29rdXA7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZVJhbmdlRWxlbWVudEVsZW1lbnRzIHBUYWJsZVJhbmdlRWxlbWVudDsKKwlwcml2YXRlIGZpbmFsIFNpZ25lZE51bWJlckVsZW1lbnRzIHBTaWduZWROdW1iZXI7CisJcHJpdmF0ZSBmaW5hbCBUYWJsZVRleHRDb2xvckVsZW1lbnRzIHBUYWJsZVRleHRDb2xvcjsKKwlwcml2YXRlIGZpbmFsIFRhYmxlQ2VsbENvbG9yRWxlbWVudHMgcFRhYmxlQ2VsbENvbG9yOworCXByaXZhdGUgZmluYWwgVGFibGVJY29uRWxlbWVudHMgcFRhYmxlSWNvbjsKKwlwcml2YXRlIGZpbmFsIFRhYmxlVHJlbmRFbGVtZW50cyBwVGFibGVUcmVuZDsKKwlwcml2YXRlIGZpbmFsIFRyZW5kSWNvbkVudW1FbGVtZW50cyB1bmtub3duUnVsZVRyZW5kSWNvbkVudW07CisJcHJpdmF0ZSBmaW5hbCBUaXRsZUVsZW1lbnRzIHBUaXRsZTsKKwlwcml2YXRlIGZpbmFsIFN1YlRpdGxlRWxlbWVudHMgcFN1YlRpdGxlOworCXByaXZhdGUgZmluYWwgU3ViU3ViVGl0bGVFbGVtZW50cyBwU3ViU3ViVGl0bGU7CisJcHJpdmF0ZSBmaW5hbCBMYWJlbEVsZW1lbnRzIHBMYWJlbDsKKwlwcml2YXRlIGZpbmFsIFRleHRFbGVtZW50cyBwVGV4dDsKKwlwcml2YXRlIGZpbmFsIEF1dG9UZXh0RWxlbWVudHMgcEF1dG9UZXh0OworCXByaXZhdGUgZmluYWwgQm9yZGVyVHlwZUVudW1FbGVtZW50cyB1bmtub3duUnVsZUJvcmRlclR5cGVFbnVtOworCXByaXZhdGUgZmluYWwgQXV0b1RleHRFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVBdXRvVGV4dEVudW07CisJcHJpdmF0ZSBmaW5hbCBJbWFnZUVsZW1lbnRzIHBJbWFnZTsKKwlwcml2YXRlIGZpbmFsIEltYWdlU2l6ZUVudW1FbGVtZW50cyB1bmtub3duUnVsZUltYWdlU2l6ZUVudW07CisJcHJpdmF0ZSBmaW5hbCBJbWFnZVNvdXJjZUVudW1FbGVtZW50cyB1bmtub3duUnVsZUltYWdlU291cmNlRW51bTsKKwlwcml2YXRlIGZpbmFsIFJlcG9ydEltcG9ydEVsZW1lbnRzIHBSZXBvcnRJbXBvcnQ7CisJcHJpdmF0ZSBmaW5hbCBSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkRWxlbWVudHMgcFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJcHJpdmF0ZSBmaW5hbCBUUkFOU0xBVEFCTEVTVFJJTkdFbGVtZW50cyBwVFJBTlNMQVRBQkxFU1RSSU5HOworCQorCXByaXZhdGUgZmluYWwgR3JhbW1hciBncmFtbWFyOworCisJcHJpdmF0ZSBmaW5hbCBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MgZ2FYYmFzZVdpdGhBbm5vdGF0aW9uczsKKworCUBJbmplY3QKKwlwdWJsaWMgUmVwb3J0RFNMR3JhbW1hckFjY2VzcyhHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyLAorCQlYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MgZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucykgeworCQl0aGlzLmdyYW1tYXIgPSBpbnRlcm5hbEZpbmRHcmFtbWFyKGdyYW1tYXJQcm92aWRlcik7CisJCXRoaXMuZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucyA9IGdhWGJhc2VXaXRoQW5ub3RhdGlvbnM7CisJCXRoaXMucFJlcG9ydE1vZGVsID0gbmV3IFJlcG9ydE1vZGVsRWxlbWVudHMoKTsKKwkJdGhpcy5wUmVwb3J0UGFja2FnZSA9IG5ldyBSZXBvcnRQYWNrYWdlRWxlbWVudHMoKTsKKwkJdGhpcy5wUGFnZVRlbXBsYXRlcyA9IG5ldyBQYWdlVGVtcGxhdGVzRWxlbWVudHMoKTsKKwkJdGhpcy5wU29tZUZvcm1hdHMgPSBuZXcgU29tZUZvcm1hdHNFbGVtZW50cygpOworCQl0aGlzLnBDb2xvcnMgPSBuZXcgQ29sb3JzRWxlbWVudHMoKTsKKwkJdGhpcy5wRm9udHMgPSBuZXcgRm9udHNFbGVtZW50cygpOworCQl0aGlzLnBNZWRpYXMgPSBuZXcgTWVkaWFzRWxlbWVudHMoKTsKKwkJdGhpcy5wTWVkaWEgPSBuZXcgTWVkaWFFbGVtZW50cygpOworCQl0aGlzLnBTdHlsZXMgPSBuZXcgU3R5bGVzRWxlbWVudHMoKTsKKwkJdGhpcy5wUGFnZVRlbXBsYXRlID0gbmV3IFBhZ2VUZW1wbGF0ZUVsZW1lbnRzKCk7CisJCXRoaXMucFVuc2lnbmVkTnVtYmVyID0gbmV3IFVuc2lnbmVkTnVtYmVyRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVVuaXRFbnVtID0gbmV3IFVuaXRFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVBhZ2VTaXplRW51bSA9IG5ldyBQYWdlU2l6ZUVudW1FbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlT3JpZW50YXRpb25FbnVtID0gbmV3IE9yaWVudGF0aW9uRW51bUVsZW1lbnRzKCk7CisJCXRoaXMucENvbG9yID0gbmV3IENvbG9yRWxlbWVudHMoKTsKKwkJdGhpcy5wRm9udCA9IG5ldyBGb250RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZUZvbnRTdHlsZUVudW0gPSBuZXcgRm9udFN0eWxlRW51bUVsZW1lbnRzKCk7CisJCXRoaXMucEZvbnRGYW1pbHkgPSBuZXcgRm9udEZhbWlseUVsZW1lbnRzKCk7CisJCXRoaXMucEJ1aWxkSW5Gb250RmFtaWx5ID0gbmV3IEJ1aWxkSW5Gb250RmFtaWx5RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZUJ1aWxkSW5Gb250RmFtaWx5RW51bSA9IG5ldyBCdWlsZEluRm9udEZhbWlseUVudW1FbGVtZW50cygpOworCQl0aGlzLnBDdXN0b21Gb250RmFtaWx5ID0gbmV3IEN1c3RvbUZvbnRGYW1pbHlFbGVtZW50cygpOworCQl0aGlzLnBCb3JkZXJTdHlsZSA9IG5ldyBCb3JkZXJTdHlsZUVsZW1lbnRzKCk7CisJCXRoaXMucFN0eWxlID0gbmV3IFN0eWxlRWxlbWVudHMoKTsKKwkJdGhpcy5wTWVkaWFTdHlsZSA9IG5ldyBNZWRpYVN0eWxlRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVRleHRBbGlnbkVudW0gPSBuZXcgVGV4dEFsaWduRW51bUVsZW1lbnRzKCk7CisJCXRoaXMucFNvbWVGb3JtYXQgPSBuZXcgU29tZUZvcm1hdEVsZW1lbnRzKCk7CisJCXRoaXMucFVvbW9Gb3JtYXQgPSBuZXcgVW9tb0Zvcm1hdEVsZW1lbnRzKCk7CisJCXRoaXMucE51bWJlckZvcm1hdCA9IG5ldyBOdW1iZXJGb3JtYXRFbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtID0gbmV3IE51bWJlckZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzKCk7CisJCXRoaXMucEN1cnJlbmN5Rm9ybWF0ID0gbmV3IEN1cnJlbmN5Rm9ybWF0RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZUN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtID0gbmV3IEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0ZUZvcm1hdCA9IG5ldyBEYXRlRm9ybWF0RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZURhdGVGb3JtYXRDYXRlZ29yeUVudW0gPSBuZXcgRGF0ZUZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzKCk7CisJCXRoaXMucERhdGVUaW1lRm9ybWF0ID0gbmV3IERhdGVUaW1lRm9ybWF0RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtID0gbmV3IERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy5wVGltZUZvcm1hdCA9IG5ldyBUaW1lRm9ybWF0RWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gPSBuZXcgVGltZUZvcm1hdENhdGVnb3J5RW51bUVsZW1lbnRzKCk7CisJCXRoaXMucFJlcG9ydCA9IG5ldyBSZXBvcnRFbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlUmVuZGVyaW5nRW51bSA9IG5ldyBSZW5kZXJpbmdFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy5wUmVwb3J0RGVzaWduID0gbmV3IFJlcG9ydERlc2lnbkVsZW1lbnRzKCk7CisJCXRoaXMucFJlcG9ydERlc2lnbkZpbGUgPSBuZXcgUmVwb3J0RGVzaWduRmlsZUVsZW1lbnRzKCk7CisJCXRoaXMucFJlcG9ydERlc2lnblRlbXBsYXRlID0gbmV3IFJlcG9ydERlc2lnblRlbXBsYXRlRWxlbWVudHMoKTsKKwkJdGhpcy5wQ29udGFpbmVyID0gbmV3IENvbnRhaW5lckVsZW1lbnRzKCk7CisJCXRoaXMucFBhZ2VIZWFkZXIgPSBuZXcgUGFnZUhlYWRlckVsZW1lbnRzKCk7CisJCXRoaXMucFBhZ2VEZXRhaWwgPSBuZXcgUGFnZURldGFpbEVsZW1lbnRzKCk7CisJCXRoaXMucFBhZ2VGb290ZXIgPSBuZXcgUGFnZUZvb3RlckVsZW1lbnRzKCk7CisJCXRoaXMucEVsZW1lbnQgPSBuZXcgRWxlbWVudEVsZW1lbnRzKCk7CisJCXRoaXMucEdyaWQgPSBuZXcgR3JpZEVsZW1lbnRzKCk7CisJCXRoaXMucEdyaWRSb3cgPSBuZXcgR3JpZFJvd0VsZW1lbnRzKCk7CisJCXRoaXMucEdyaWRDZWxsID0gbmV3IEdyaWRDZWxsRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YW1hcnRUYWJsZSA9IG5ldyBEYXRhbWFydFRhYmxlRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YW1hcnRUYWJsZUdyb3VwID0gbmV3IERhdGFtYXJ0VGFibGVHcm91cEVsZW1lbnRzKCk7CisJCXRoaXMucERhdGFtYXJ0VGFibGVHcm91cEhlYWRlciA9IG5ldyBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFbGVtZW50cygpOworCQl0aGlzLnBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgPSBuZXcgRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YW1hcnRUYWJsZURldGFpbCA9IG5ldyBEYXRhbWFydFRhYmxlRGV0YWlsRWxlbWVudHMoKTsKKwkJdGhpcy5wRGF0YW1hcnRUYWJsZVByb3BlcnR5ID0gbmV3IERhdGFtYXJ0VGFibGVQcm9wZXJ0eUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVQdXJlQWdncmVnYXRpb25UeXBlRW51bSA9IG5ldyBQdXJlQWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gPSBuZXcgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gPSBuZXcgQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVNdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gPSBuZXcgTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVGb3JtYXR0ZXIgPSBuZXcgVGFibGVGb3JtYXR0ZXJFbGVtZW50cygpOworCQl0aGlzLnBUYWJsZUltYWdlID0gbmV3IFRhYmxlSW1hZ2VFbGVtZW50cygpOworCQl0aGlzLnBUYWJsZVZhbHVlRWxlbWVudCA9IG5ldyBUYWJsZVZhbHVlRWxlbWVudEVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlUHJvcGVydHkgPSBuZXcgVGFibGVQcm9wZXJ0eUVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlQWdncmVnYXRpb24gPSBuZXcgVGFibGVBZ2dyZWdhdGlvbkVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlQmFzZUFnZ3JlZ2F0aW9uID0gbmV3IFRhYmxlQmFzZUFnZ3JlZ2F0aW9uRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVQdXJlQWdncmVnYXRpb24gPSBuZXcgVGFibGVQdXJlQWdncmVnYXRpb25FbGVtZW50cygpOworCQl0aGlzLnBUYWJsZVVuYXJ5QWdncmVnYXRpb24gPSBuZXcgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uID0gbmV3IFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlQmluYXJ5QWdncmVnYXRpb24gPSBuZXcgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlSW50ZXJ2YWwgPSBuZXcgVGFibGVJbnRlcnZhbEVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlTnVtYmVySW50ZXJ2YWwgPSBuZXcgVGFibGVOdW1iZXJJbnRlcnZhbEVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlRGF0ZURheUludGVydmFsID0gbmV3IFRhYmxlRGF0ZURheUludGVydmFsRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVMb29rdXAgPSBuZXcgVGFibGVMb29rdXBFbGVtZW50cygpOworCQl0aGlzLnBUYWJsZU51bWJlckxvb2t1cCA9IG5ldyBUYWJsZU51bWJlckxvb2t1cEVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlU3RyaW5nTG9va3VwID0gbmV3IFRhYmxlU3RyaW5nTG9va3VwRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVEYXRlRGF5TG9va3VwID0gbmV3IFRhYmxlRGF0ZURheUxvb2t1cEVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlUmFuZ2VFbGVtZW50ID0gbmV3IFRhYmxlUmFuZ2VFbGVtZW50RWxlbWVudHMoKTsKKwkJdGhpcy5wU2lnbmVkTnVtYmVyID0gbmV3IFNpZ25lZE51bWJlckVsZW1lbnRzKCk7CisJCXRoaXMucFRhYmxlVGV4dENvbG9yID0gbmV3IFRhYmxlVGV4dENvbG9yRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVDZWxsQ29sb3IgPSBuZXcgVGFibGVDZWxsQ29sb3JFbGVtZW50cygpOworCQl0aGlzLnBUYWJsZUljb24gPSBuZXcgVGFibGVJY29uRWxlbWVudHMoKTsKKwkJdGhpcy5wVGFibGVUcmVuZCA9IG5ldyBUYWJsZVRyZW5kRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVRyZW5kSWNvbkVudW0gPSBuZXcgVHJlbmRJY29uRW51bUVsZW1lbnRzKCk7CisJCXRoaXMucFRpdGxlID0gbmV3IFRpdGxlRWxlbWVudHMoKTsKKwkJdGhpcy5wU3ViVGl0bGUgPSBuZXcgU3ViVGl0bGVFbGVtZW50cygpOworCQl0aGlzLnBTdWJTdWJUaXRsZSA9IG5ldyBTdWJTdWJUaXRsZUVsZW1lbnRzKCk7CisJCXRoaXMucExhYmVsID0gbmV3IExhYmVsRWxlbWVudHMoKTsKKwkJdGhpcy5wVGV4dCA9IG5ldyBUZXh0RWxlbWVudHMoKTsKKwkJdGhpcy5wQXV0b1RleHQgPSBuZXcgQXV0b1RleHRFbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlQm9yZGVyVHlwZUVudW0gPSBuZXcgQm9yZGVyVHlwZUVudW1FbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlQXV0b1RleHRFbnVtID0gbmV3IEF1dG9UZXh0RW51bUVsZW1lbnRzKCk7CisJCXRoaXMucEltYWdlID0gbmV3IEltYWdlRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZUltYWdlU2l6ZUVudW0gPSBuZXcgSW1hZ2VTaXplRW51bUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVJbWFnZVNvdXJjZUVudW0gPSBuZXcgSW1hZ2VTb3VyY2VFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy5wUmVwb3J0SW1wb3J0ID0gbmV3IFJlcG9ydEltcG9ydEVsZW1lbnRzKCk7CisJCXRoaXMucFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgPSBuZXcgUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEVsZW1lbnRzKCk7CisJCXRoaXMucFRSQU5TTEFUQUJMRVNUUklORyA9IG5ldyBUUkFOU0xBVEFCTEVTVFJJTkdFbGVtZW50cygpOworCX0KKwkKKwlwcm90ZWN0ZWQgR3JhbW1hciBpbnRlcm5hbEZpbmRHcmFtbWFyKEdyYW1tYXJQcm92aWRlciBncmFtbWFyUHJvdmlkZXIpIHsKKwkJR3JhbW1hciBncmFtbWFyID0gZ3JhbW1hclByb3ZpZGVyLmdldEdyYW1tYXIodGhpcyk7CisJCXdoaWxlIChncmFtbWFyICE9IG51bGwpIHsKKwkJCWlmICgib3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIi5lcXVhbHMoZ3JhbW1hci5nZXROYW1lKCkpKSB7CisJCQkJcmV0dXJuIGdyYW1tYXI7CisJCQl9CisJCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZ3JhbW1hci5nZXRVc2VkR3JhbW1hcnMoKTsKKwkJCWlmICghZ3JhbW1hcnMuaXNFbXB0eSgpKSB7CisJCQkJZ3JhbW1hciA9IGdyYW1tYXJzLml0ZXJhdG9yKCkubmV4dCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JhbW1hcjsKKwl9CisJCisJCisJcHVibGljIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKwkJcmV0dXJuIGdyYW1tYXI7CisJfQorCQorCisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2VzcyBnZXRYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zOworCX0KKworCQorCS8vUmVwb3J0TW9kZWw6CisJLy8JcGNrZys9UmVwb3J0UGFja2FnZSo7CisJcHVibGljIFJlcG9ydE1vZGVsRWxlbWVudHMgZ2V0UmVwb3J0TW9kZWxBY2Nlc3MoKSB7CisJCXJldHVybiBwUmVwb3J0TW9kZWw7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJlcG9ydE1vZGVsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJlcG9ydE1vZGVsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUmVwb3J0UGFja2FnZToKKwkvLwl7UmVwb3J0UGFja2FnZX0gInBhY2thZ2UiIG5hbWU9UXVhbGlmaWVkTmFtZSAieyIgaW1wb3J0cys9UmVwb3J0SW1wb3J0KiAoImxheW91dC1kYXRhIiAieyIgKCJleHRlcm5hbENzc1VSSSIKKwkvLwlleHRlcm5hbENzc1VSST1TVFJJTkcgKCJmcm9tIGJ1bmRsZSIgZXh0ZXJuYWxDc3NVUklCdW5kbGU9U1RSSU5HKT8pPyBwYWdldGVtcGxhdGVzPVBhZ2VUZW1wbGF0ZXMKKwkvLwlmb3JtYXR0ZXJzPVNvbWVGb3JtYXRzIGNvbG9ycz1Db2xvcnMgZm9udHM9Rm9udHMgbWVkaWFzPU1lZGlhcyBzdHlsZXM9U3R5bGVzICJ9Iik/IHJlcG9ydHMrPVJlcG9ydCogIn0iOworCXB1YmxpYyBSZXBvcnRQYWNrYWdlRWxlbWVudHMgZ2V0UmVwb3J0UGFja2FnZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSZXBvcnRQYWNrYWdlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSZXBvcnRQYWNrYWdlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJlcG9ydFBhY2thZ2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QYWdlVGVtcGxhdGVzOgorCS8vCXtQYWdlVGVtcGxhdGVzfSBwYWdldGVtcGxhdGVzKz1QYWdlVGVtcGxhdGUqOworCXB1YmxpYyBQYWdlVGVtcGxhdGVzRWxlbWVudHMgZ2V0UGFnZVRlbXBsYXRlc0FjY2VzcygpIHsKKwkJcmV0dXJuIHBQYWdlVGVtcGxhdGVzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQYWdlVGVtcGxhdGVzUnVsZSgpIHsKKwkJcmV0dXJuIGdldFBhZ2VUZW1wbGF0ZXNBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Tb21lRm9ybWF0czoKKwkvLwl7U29tZUZvcm1hdHN9ICJmb3JtYXR0ZXJzIiAieyIgZm9ybWF0dGVycys9U29tZUZvcm1hdCogIn0iOworCXB1YmxpYyBTb21lRm9ybWF0c0VsZW1lbnRzIGdldFNvbWVGb3JtYXRzQWNjZXNzKCkgeworCQlyZXR1cm4gcFNvbWVGb3JtYXRzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRTb21lRm9ybWF0c1J1bGUoKSB7CisJCXJldHVybiBnZXRTb21lRm9ybWF0c0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NvbG9yczoKKwkvLwl7Q29sb3JzfSAiY29sb3JzIiAieyIgY29sb3JzKz1Db2xvciogIn0iOworCXB1YmxpYyBDb2xvcnNFbGVtZW50cyBnZXRDb2xvcnNBY2Nlc3MoKSB7CisJCXJldHVybiBwQ29sb3JzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDb2xvcnNSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q29sb3JzQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRm9udHM6CisJLy8Je0ZvbnRzfSAiZm9udHMiICJ7IiBmb250cys9Rm9udCogIn0iOworCXB1YmxpYyBGb250c0VsZW1lbnRzIGdldEZvbnRzQWNjZXNzKCkgeworCQlyZXR1cm4gcEZvbnRzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRGb250c1J1bGUoKSB7CisJCXJldHVybiBnZXRGb250c0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL01lZGlhczoKKwkvLwl7TWVkaWFzfSAibWVkaWFzIiAieyIgbWVkaWFzKz1NZWRpYSogIn0iOworCXB1YmxpYyBNZWRpYXNFbGVtZW50cyBnZXRNZWRpYXNBY2Nlc3MoKSB7CisJCXJldHVybiBwTWVkaWFzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRNZWRpYXNSdWxlKCkgeworCQlyZXR1cm4gZ2V0TWVkaWFzQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vTWVkaWE6CisJLy8JIm1lZGlhIiBuYW1lPUlEOworCXB1YmxpYyBNZWRpYUVsZW1lbnRzIGdldE1lZGlhQWNjZXNzKCkgeworCQlyZXR1cm4gcE1lZGlhOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRNZWRpYVJ1bGUoKSB7CisJCXJldHVybiBnZXRNZWRpYUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1N0eWxlczoKKwkvLwl7U3R5bGVzfSAic3R5bGVzIiAieyIgc3R5bGVzKz1TdHlsZSogIn0iOworCXB1YmxpYyBTdHlsZXNFbGVtZW50cyBnZXRTdHlsZXNBY2Nlc3MoKSB7CisJCXJldHVybiBwU3R5bGVzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRTdHlsZXNSdWxlKCkgeworCQlyZXR1cm4gZ2V0U3R5bGVzQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUGFnZVRlbXBsYXRlOgorCS8vCSJwYWdldGVtcGxhdGUiIG5hbWU9SUQgInsiICJ0eXBlIiBzaXplPVBhZ2VTaXplRW51bSAib3JpZW50YXRpb24iIG9yaWVudGF0aW9uPU9yaWVudGF0aW9uRW51bSAidG9wbWFyZ2luIgorCS8vCXRvcE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIHRvcE1hcmdpblVuaXQ9VW5pdEVudW0gImxlZnRtYXJnaW4iIGxlZnRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlcgorCS8vCWxlZnRNYXJnaW5Vbml0PVVuaXRFbnVtICJib3R0b21tYXJnaW4iIGJvdHRvbU1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIGJvdHRvbU1hcmdpblVuaXQ9VW5pdEVudW0gInJpZ2h0bWFyZ2luIgorCS8vCXJpZ2h0TWFyZ2luVmFsdWU9VW5zaWduZWROdW1iZXIgcmlnaHRNYXJnaW5Vbml0PVVuaXRFbnVtIGhlYWRlcj1QYWdlSGVhZGVyPyBmb290ZXI9UGFnZUZvb3Rlcj8gIn0iOworCXB1YmxpYyBQYWdlVGVtcGxhdGVFbGVtZW50cyBnZXRQYWdlVGVtcGxhdGVBY2Nlc3MoKSB7CisJCXJldHVybiBwUGFnZVRlbXBsYXRlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQYWdlVGVtcGxhdGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGFnZVRlbXBsYXRlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVW5zaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKwkvLwlOdW1iZXI7CisJcHVibGljIFVuc2lnbmVkTnVtYmVyRWxlbWVudHMgZ2V0VW5zaWduZWROdW1iZXJBY2Nlc3MoKSB7CisJCXJldHVybiBwVW5zaWduZWROdW1iZXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFVuc2lnbmVkTnVtYmVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFVuc2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBVbml0RW51bToKKwkvLwlNTT0ibW0iIHwgQ009ImNtIiB8IFBUPSJwdCIgfCBJTj0iaW5jaCIgfCBQQz0icGMiIHwgRU09ImVtIiB8IEVYPSJleCIgfCBQWD0icHgiIHwgUEVSQ0VOVEFHRT0iJSI7CisJcHVibGljIFVuaXRFbnVtRWxlbWVudHMgZ2V0VW5pdEVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZVVuaXRFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0VW5pdEVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0VW5pdEVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIFBhZ2VTaXplRW51bToKKwkvLwlBND0iYTQiIHwgQTM9ImEzIiB8IEE1PSJhNSIgfCBVU19MRVRURVI9InVzLWxldHRlciIgfCBVU19MRUdBTD0idXMtbGVnYWwiIHwgVVNfTEVER0VSPSJ1cy1sZWRnZXIiIHwKKwkvLwlVU19TVVBFUl9CPSJ1cy1zdXBlci1iIjsKKwlwdWJsaWMgUGFnZVNpemVFbnVtRWxlbWVudHMgZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVQYWdlU2l6ZUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRQYWdlU2l6ZUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0UGFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBPcmllbnRhdGlvbkVudW06CisJLy8JUE9SVFJBSVQ9InBvcnRyYWl0IiB8IExBTkRTQ0FQRT0ibGFuZHNjYXBlIjsKKwlwdWJsaWMgT3JpZW50YXRpb25FbnVtRWxlbWVudHMgZ2V0T3JpZW50YXRpb25FbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVPcmllbnRhdGlvbkVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRPcmllbnRhdGlvbkVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0T3JpZW50YXRpb25FbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ29sb3I6CisJLy8JImNvbG9yIiBuYW1lPUlEIChjb2xvcj1TVFJJTkcgfCAiZGFya2VucyIgYmFzZWNvbG9yPVtDb2xvcl0gImJ5LXBlcmNlbnQiIGRhcmtlbnNieT1JTlQgfCAibGlnaHRlbnMiIGJhc2Vjb2xvcj1bQ29sb3JdCisJLy8JImJ5LXBlcmNlbnQiIGxpZ2h0ZW5zYnk9SU5UIHwgInRyYW5zZm9ybXMiIGJhc2Vjb2xvcj1bQ29sb3JdICJieS1wZXJjZW50IiB0cmFuc2Zvcm1zYnk9SU5UICJ0b3dhcmRzIgorCS8vCXRhcmdldGNvbG9yPVtDb2xvcl0pOworCXB1YmxpYyBDb2xvckVsZW1lbnRzIGdldENvbG9yQWNjZXNzKCkgeworCQlyZXR1cm4gcENvbG9yOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDb2xvclJ1bGUoKSB7CisJCXJldHVybiBnZXRDb2xvckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0ZvbnQ6CisJLy8JImZvbnQiIG5hbWU9SUQgInsiICgiZXh0ZW5kcyIgZXh0ZW5kcz1bRm9udF0pPyAoImZhbWlseSIgZmFtaWx5PUZvbnRGYW1pbHkpPyAmIHN0eWxlPUZvbnRTdHlsZUVudW0/ICYgYm9sZD89ImJvbGQiPyAmCisJLy8JKCJzaXplIiBzaXpldmFsdWU9VW5zaWduZWROdW1iZXIgc2l6ZXVuaXQ9VW5pdEVudW0pPyAifSI7CisJcHVibGljIEZvbnRFbGVtZW50cyBnZXRGb250QWNjZXNzKCkgeworCQlyZXR1cm4gcEZvbnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEZvbnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0Rm9udEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gRm9udFN0eWxlRW51bToKKwkvLwlOT1JNQUw9Im5vcm1hbCIgfCBJVEFMSUM9Iml0YWxpYyIgfCBPQkxJUVVFPSJvYmxpcXVlIjsKKwlwdWJsaWMgRm9udFN0eWxlRW51bUVsZW1lbnRzIGdldEZvbnRTdHlsZUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZUZvbnRTdHlsZUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRGb250U3R5bGVFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldEZvbnRTdHlsZUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Gb250RmFtaWx5OgorCS8vCUJ1aWxkSW5Gb250RmFtaWx5IHwgQ3VzdG9tRm9udEZhbWlseTsKKwlwdWJsaWMgRm9udEZhbWlseUVsZW1lbnRzIGdldEZvbnRGYW1pbHlBY2Nlc3MoKSB7CisJCXJldHVybiBwRm9udEZhbWlseTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Rm9udEZhbWlseVJ1bGUoKSB7CisJCXJldHVybiBnZXRGb250RmFtaWx5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQnVpbGRJbkZvbnRGYW1pbHk6CisJLy8JY3VzdG9tPUJ1aWxkSW5Gb250RmFtaWx5RW51bTsKKwlwdWJsaWMgQnVpbGRJbkZvbnRGYW1pbHlFbGVtZW50cyBnZXRCdWlsZEluRm9udEZhbWlseUFjY2VzcygpIHsKKwkJcmV0dXJuIHBCdWlsZEluRm9udEZhbWlseTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0QnVpbGRJbkZvbnRGYW1pbHlSdWxlKCkgeworCQlyZXR1cm4gZ2V0QnVpbGRJbkZvbnRGYW1pbHlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIEJ1aWxkSW5Gb250RmFtaWx5RW51bToKKwkvLwlNT05PU1BBQ0U9Im1vbm9zcGFjZSIgfCBTQU5TX1NFUklGPSJzYW5zLXNlcmlmIiB8IFNFUklGPSJzZXJpZiI7CisJcHVibGljIEJ1aWxkSW5Gb250RmFtaWx5RW51bUVsZW1lbnRzIGdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlQnVpbGRJbkZvbnRGYW1pbHlFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0QnVpbGRJbkZvbnRGYW1pbHlFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldEJ1aWxkSW5Gb250RmFtaWx5RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0N1c3RvbUZvbnRGYW1pbHk6CisJLy8JY3VzdG9tPVNUUklORzsKKwlwdWJsaWMgQ3VzdG9tRm9udEZhbWlseUVsZW1lbnRzIGdldEN1c3RvbUZvbnRGYW1pbHlBY2Nlc3MoKSB7CisJCXJldHVybiBwQ3VzdG9tRm9udEZhbWlseTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q3VzdG9tRm9udEZhbWlseVJ1bGUoKSB7CisJCXJldHVybiBnZXRDdXN0b21Gb250RmFtaWx5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQm9yZGVyU3R5bGU6CisJLy8JdHlwZT1Cb3JkZXJUeXBlRW51bSB3aWR0aHZhbHVlPVVuc2lnbmVkTnVtYmVyIHdpZHRodW5pdD1Vbml0RW51bSBjb2xvcj1bQ29sb3JdOworCXB1YmxpYyBCb3JkZXJTdHlsZUVsZW1lbnRzIGdldEJvcmRlclN0eWxlQWNjZXNzKCkgeworCQlyZXR1cm4gcEJvcmRlclN0eWxlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRCb3JkZXJTdHlsZVJ1bGUoKSB7CisJCXJldHVybiBnZXRCb3JkZXJTdHlsZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1N0eWxlOgorCS8vCSJzdHlsZSIgbmFtZT1JRCAieyIgKCJleHRlbmRzIiBleHRlbmRzPVtTdHlsZV0pPyAoKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmICgiZm9udCIgZm9udD1bRm9udF0pPyAmCisJLy8JKCJiYWNrZ3JvdW5kY29sb3IiIGJhY2tncm91bmRjb2xvcj1bQ29sb3JdICgiYWx0ZXJuYXRlIiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPyk/ICYgKCJ0ZXh0Y29sb3IiCisJLy8JdGV4dGNvbG9yPVtDb2xvcl0pPyAmICgidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSk/ICYgKCJib3JkZXItdG9wIiBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmCisJLy8JKCJib3JkZXItYm90dG9tIiBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWxlZnQiIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLXJpZ2h0IgorCS8vCWJvcmRlclJpZ2h0PUJvcmRlclN0eWxlKT8gJiAoInBhZGRpbmctdG9wIiBwYWRkaW5nVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPyAmCisJLy8JKCJwYWRkaW5nLWJvdHRvbSIgcGFkZGluZ0JvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctbGVmdCIKKwkvLwlwYWRkaW5nTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdMZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLXJpZ2h0IiBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCS8vCXBhZGRpbmdSaWdodFVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLXRvcCIgbWFyZ2luVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tYm90dG9tIgorCS8vCW1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCS8vCW1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1yaWdodCIgbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPykKKwkvLwltZWRpYXN0eWxlcys9TWVkaWFTdHlsZSogIn0iOworCXB1YmxpYyBTdHlsZUVsZW1lbnRzIGdldFN0eWxlQWNjZXNzKCkgeworCQlyZXR1cm4gcFN0eWxlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRTdHlsZVJ1bGUoKSB7CisJCXJldHVybiBnZXRTdHlsZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL01lZGlhU3R5bGU6CisJLy8JIm1lZGlhIiBtZWRpYT1bTWVkaWFdICJ7IiAoKCJmb3JtYXR0ZXIiIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmICgiZm9udCIgZm9udD1bRm9udF0pPyAmICgiYmFja2dyb3VuZGNvbG9yIgorCS8vCWJhY2tncm91bmRjb2xvcj1bQ29sb3JdICgiYWx0ZXJuYXRlIiBiYWNrZ3JvdW5kY29sb3JfYWx0ZXJuYXRlPVtDb2xvcl0pPyk/ICYgKCJ0ZXh0Y29sb3IiIHRleHRjb2xvcj1bQ29sb3JdKT8gJgorCS8vCSgidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSk/ICYgKCJib3JkZXItdG9wIiBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWJvdHRvbSIKKwkvLwlib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLWxlZnQiIGJvcmRlckxlZnQ9Qm9yZGVyU3R5bGUpPyAmICgiYm9yZGVyLXJpZ2h0IiBib3JkZXJSaWdodD1Cb3JkZXJTdHlsZSk/ICYKKwkvLwkoInBhZGRpbmctdG9wIiBwYWRkaW5nVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgcGFkZGluZ1RvcFVuaXQ9VW5pdEVudW0pPyAmICgicGFkZGluZy1ib3R0b20iCisJLy8JcGFkZGluZ0JvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdCb3R0b21Vbml0PVVuaXRFbnVtKT8gJiAoInBhZGRpbmctbGVmdCIgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCS8vCXBhZGRpbmdMZWZ0VW5pdD1Vbml0RW51bSk/ICYgKCJwYWRkaW5nLXJpZ2h0IiBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8gJgorCS8vCSgibWFyZ2luLXRvcCIgbWFyZ2luVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYgKCJtYXJnaW4tYm90dG9tIgorCS8vCW1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmICgibWFyZ2luLWxlZnQiIG1hcmdpbkxlZnRWYWx1ZT1VbnNpZ25lZE51bWJlcgorCS8vCW1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJiAoIm1hcmdpbi1yaWdodCIgbWFyZ2luUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBtYXJnaW5SaWdodFVuaXQ9VW5pdEVudW0pPykgIn0iOworCXB1YmxpYyBNZWRpYVN0eWxlRWxlbWVudHMgZ2V0TWVkaWFTdHlsZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBNZWRpYVN0eWxlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRNZWRpYVN0eWxlUnVsZSgpIHsKKwkJcmV0dXJuIGdldE1lZGlhU3R5bGVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIFRleHRBbGlnbkVudW06CisJLy8JTEVGVD0ibGVmdCIgfCBDRU5URVI9ImNlbnRlciIgfCBSSUdIVD0icmlnaHQiOworCXB1YmxpYyBUZXh0QWxpZ25FbnVtRWxlbWVudHMgZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlVGV4dEFsaWduRW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldFRleHRBbGlnbkVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0VGV4dEFsaWduRW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1NvbWVGb3JtYXQ6CisJLy8JVW9tb0Zvcm1hdCB8IE51bWJlckZvcm1hdCB8IEN1cnJlbmN5Rm9ybWF0IHwgRGF0ZUZvcm1hdCB8IERhdGVUaW1lRm9ybWF0IHwgVGltZUZvcm1hdDsKKwlwdWJsaWMgU29tZUZvcm1hdEVsZW1lbnRzIGdldFNvbWVGb3JtYXRBY2Nlc3MoKSB7CisJCXJldHVybiBwU29tZUZvcm1hdDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0U29tZUZvcm1hdFJ1bGUoKSB7CisJCXJldHVybiBnZXRTb21lRm9ybWF0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVW9tb0Zvcm1hdDoKKwkvLwkidW9tbyIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfcGF0dGVybj1TVFJJTkcgInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCXB1YmxpYyBVb21vRm9ybWF0RWxlbWVudHMgZ2V0VW9tb0Zvcm1hdEFjY2VzcygpIHsKKwkJcmV0dXJuIHBVb21vRm9ybWF0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRVb21vRm9ybWF0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFVvbW9Gb3JtYXRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9OdW1iZXJGb3JtYXQ6CisJLy8JIm51bWJlciIgbmFtZT1JRCAieyIgInVpIiB1aV9wYXR0ZXJuPVNUUklORyAicmVwb3J0IiByZXBvcnRfY2F0ZWdvcnk9TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORworCS8vCSJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtICJ9IjsKKwlwdWJsaWMgTnVtYmVyRm9ybWF0RWxlbWVudHMgZ2V0TnVtYmVyRm9ybWF0QWNjZXNzKCkgeworCQlyZXR1cm4gcE51bWJlckZvcm1hdDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0TnVtYmVyRm9ybWF0UnVsZSgpIHsKKwkJcmV0dXJuIGdldE51bWJlckZvcm1hdEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtOgorCS8vCVVORk9STUFUVEVEPSJ1bmZvcm1hdHRlZCIgfCBHRU5FUkFMX05VTUJFUj0iZ2VuZXJhbC1udW1iZXIiIHwgRklYRUQ9ImZpeGVkIiB8IFBFUkNFTlQ9InBlcmNlbnQiIHwKKwkvLwlTQ0lFTlRJRklDPSJzY2llbnRpZmljIiB8IENVU1RPTT0iY3VzdG9tIjsKKwlwdWJsaWMgTnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXROdW1iZXJGb3JtYXRDYXRlZ29yeUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnlFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ3VycmVuY3lGb3JtYXQ6CisJLy8JImN1cnJlbmN5IiBuYW1lPUlEICJ7IiAidWkiIHVpX3BhdHRlcm49U1RSSU5HICJyZXBvcnQiIHJlcG9ydF9jYXRlZ29yeT1DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bQorCS8vCXJlcG9ydF9wYXR0ZXJuPVNUUklORyAidGV4dGFsaWduIiB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAifSI7CisJcHVibGljIEN1cnJlbmN5Rm9ybWF0RWxlbWVudHMgZ2V0Q3VycmVuY3lGb3JtYXRBY2Nlc3MoKSB7CisJCXJldHVybiBwQ3VycmVuY3lGb3JtYXQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEN1cnJlbmN5Rm9ybWF0UnVsZSgpIHsKKwkJcmV0dXJuIGdldEN1cnJlbmN5Rm9ybWF0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bToKKwkvLwlVTkZPUk1BVFRFRD0idW5mb3JtYXR0ZWQiIHwgQ1VSUkVOQ1k9ImN1cnJlbmN5IiB8IENVU1RPTT0iY3VzdG9tIjsKKwlwdWJsaWMgQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW1FbGVtZW50cyBnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlQ3VycmVuY3lGb3JtYXRDYXRlZ29yeUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRDdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0RhdGVGb3JtYXQ6CisJLy8JImRhdGUiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PURhdGVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HCisJLy8JInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCXB1YmxpYyBEYXRlRm9ybWF0RWxlbWVudHMgZ2V0RGF0ZUZvcm1hdEFjY2VzcygpIHsKKwkJcmV0dXJuIHBEYXRlRm9ybWF0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRlRm9ybWF0UnVsZSgpIHsKKwkJcmV0dXJuIGdldERhdGVGb3JtYXRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIERhdGVGb3JtYXRDYXRlZ29yeUVudW06CisJLy8JQ1VTVE9NPSJjdXN0b20iOworCXB1YmxpYyBEYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgZ2V0RGF0ZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlRGF0ZUZvcm1hdENhdGVnb3J5RW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldERhdGVGb3JtYXRDYXRlZ29yeUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0ZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0RhdGVUaW1lRm9ybWF0OgorCS8vCSJkYXRlK3RpbWUiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtCisJLy8JcmVwb3J0X3BhdHRlcm49U1RSSU5HICJ0ZXh0YWxpZ24iIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtICJ9IjsKKwlwdWJsaWMgRGF0ZVRpbWVGb3JtYXRFbGVtZW50cyBnZXREYXRlVGltZUZvcm1hdEFjY2VzcygpIHsKKwkJcmV0dXJuIHBEYXRlVGltZUZvcm1hdDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RGF0ZVRpbWVGb3JtYXRSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0ZVRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtOgorCS8vCUNVU1RPTT0iY3VzdG9tIjsKKwlwdWJsaWMgRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW1FbGVtZW50cyBnZXREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXREYXRlVGltZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RpbWVGb3JtYXQ6CisJLy8JInRpbWUiIG5hbWU9SUQgInsiICJ1aSIgdWlfcGF0dGVybj1TVFJJTkcgInJlcG9ydCIgcmVwb3J0X2NhdGVnb3J5PVRpbWVGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HCisJLy8JInRleHRhbGlnbiIgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gIn0iOworCXB1YmxpYyBUaW1lRm9ybWF0RWxlbWVudHMgZ2V0VGltZUZvcm1hdEFjY2VzcygpIHsKKwkJcmV0dXJuIHBUaW1lRm9ybWF0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUaW1lRm9ybWF0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFRpbWVGb3JtYXRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIFRpbWVGb3JtYXRDYXRlZ29yeUVudW06CisJLy8JQ1VTVE9NPSJjdXN0b20iOworCXB1YmxpYyBUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtRWxlbWVudHMgZ2V0VGltZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlVGltZUZvcm1hdENhdGVnb3J5RW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldFRpbWVGb3JtYXRDYXRlZ29yeUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0VGltZUZvcm1hdENhdGVnb3J5RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JlcG9ydDoKKwkvLwkicmVwb3J0IiBuYW1lPUlEIChkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPyAoInRvb2xiYXIiCisJLy8JdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXSk/ICJ7IiAiZGF0YW1hcnQiIGRhdGFtYXJ0UmVmPVtkYXRhbWFydDo6RGF0YW1hcnREZWZpbml0aW9uXSAicmVuZGVyaW5nIgorCS8vCXJlbmRlcmluZz1SZW5kZXJpbmdFbnVtICgiZXh0ZXJuYWxDc3NVUkkiIGV4dGVybmFsQ3NzVVJJPVNUUklORyAoImZyb20gYnVuZGxlIiBleHRlcm5hbENzc1VSSUJ1bmRsZT1TVFJJTkcpPyk/CisJLy8JInBhZ2V0ZW1wbGF0ZSIgcGFnZVRlbXBsYXRlPVtQYWdlVGVtcGxhdGVdICJtZWRpYSIgbWVkaWE9W01lZGlhXSBkZXNpZ249UmVwb3J0RGVzaWduICJ9IjsKKwlwdWJsaWMgUmVwb3J0RWxlbWVudHMgZ2V0UmVwb3J0QWNjZXNzKCkgeworCQlyZXR1cm4gcFJlcG9ydDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UmVwb3J0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFJlcG9ydEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gUmVuZGVyaW5nRW51bToKKwkvLwlIVE1MPSJodG1sIiB8IFBERj0icGRmIjsKKwlwdWJsaWMgUmVuZGVyaW5nRW51bUVsZW1lbnRzIGdldFJlbmRlcmluZ0VudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZVJlbmRlcmluZ0VudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRSZW5kZXJpbmdFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJlbmRlcmluZ0VudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9SZXBvcnREZXNpZ246CisJLy8JUmVwb3J0RGVzaWduRmlsZSB8IFJlcG9ydERlc2lnblRlbXBsYXRlOworCXB1YmxpYyBSZXBvcnREZXNpZ25FbGVtZW50cyBnZXRSZXBvcnREZXNpZ25BY2Nlc3MoKSB7CisJCXJldHVybiBwUmVwb3J0RGVzaWduOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSZXBvcnREZXNpZ25SdWxlKCkgeworCQlyZXR1cm4gZ2V0UmVwb3J0RGVzaWduQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUmVwb3J0RGVzaWduRmlsZToKKwkvLwkiZmlsZSIgbmFtZT1TVFJJTkc7CisJcHVibGljIFJlcG9ydERlc2lnbkZpbGVFbGVtZW50cyBnZXRSZXBvcnREZXNpZ25GaWxlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJlcG9ydERlc2lnbkZpbGU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJlcG9ydERlc2lnbkZpbGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0UmVwb3J0RGVzaWduRmlsZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JlcG9ydERlc2lnblRlbXBsYXRlOgorCS8vCSJ0ZW1wbGF0ZSIgInsiICgiZGVzY3JpYmVkIGJ5IiBkZXNjcmlwdGlvbj1TVFJJTkcpPyBoZWFkZXI9UGFnZUhlYWRlcj8gZGV0YWlsPVBhZ2VEZXRhaWwgZm9vdGVyPVBhZ2VGb290ZXI/ICJ9IjsKKwlwdWJsaWMgUmVwb3J0RGVzaWduVGVtcGxhdGVFbGVtZW50cyBnZXRSZXBvcnREZXNpZ25UZW1wbGF0ZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSZXBvcnREZXNpZ25UZW1wbGF0ZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0UmVwb3J0RGVzaWduVGVtcGxhdGVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Db250YWluZXI6CisJLy8JUGFnZUhlYWRlciB8IFBhZ2VEZXRhaWwgfCBQYWdlRm9vdGVyIHwgR3JpZENlbGw7CisJcHVibGljIENvbnRhaW5lckVsZW1lbnRzIGdldENvbnRhaW5lckFjY2VzcygpIHsKKwkJcmV0dXJuIHBDb250YWluZXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENvbnRhaW5lclJ1bGUoKSB7CisJCXJldHVybiBnZXRDb250YWluZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QYWdlSGVhZGVyOgorCS8vCXtQYWdlSGVhZGVyfSAiaGVhZGVyIiAieyIgc2hvd09uRmlyc3Q/PSJzaG93T25GaXJzdCI/ICJoZWlnaHQiIGhlaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIGhlaWdodFVuaXQ9VW5pdEVudW0KKwkvLwllbGVtZW50cys9RWxlbWVudCAifSI7CisJcHVibGljIFBhZ2VIZWFkZXJFbGVtZW50cyBnZXRQYWdlSGVhZGVyQWNjZXNzKCkgeworCQlyZXR1cm4gcFBhZ2VIZWFkZXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFBhZ2VIZWFkZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0UGFnZUhlYWRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1BhZ2VEZXRhaWw6CisJLy8Je1BhZ2VEZXRhaWx9ICJkZXRhaWwiICJ7IiBlbGVtZW50cys9RWxlbWVudCogIn0iOworCXB1YmxpYyBQYWdlRGV0YWlsRWxlbWVudHMgZ2V0UGFnZURldGFpbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBQYWdlRGV0YWlsOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQYWdlRGV0YWlsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFBhZ2VEZXRhaWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9QYWdlRm9vdGVyOgorCS8vCXtQYWdlRm9vdGVyfSAiZm9vdGVyIiAieyIgc2hvd09uTGFzdD89InNob3dPbkxhc3QiPyAiaGVpZ2h0IiBoZWlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBoZWlnaHRVbml0PVVuaXRFbnVtCisJLy8JZWxlbWVudHMrPUVsZW1lbnQgIn0iOworCXB1YmxpYyBQYWdlRm9vdGVyRWxlbWVudHMgZ2V0UGFnZUZvb3RlckFjY2VzcygpIHsKKwkJcmV0dXJuIHBQYWdlRm9vdGVyOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRQYWdlRm9vdGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFBhZ2VGb290ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy8vICogfCBUYWJsZURzbCB8IENoYXJ0RHNsKiAvIEVsZW1lbnQ6CisJLy8JVGl0bGUgfCBTdWJUaXRsZSB8IFN1YlN1YlRpdGxlIHwgTGFiZWwgfCBUZXh0IHwgQXV0b1RleHQgfCBJbWFnZSB8IERhdGFtYXJ0VGFibGUgfCBEYXRhbWFydFRhYmxlUHJvcGVydHkgfCBHcmlkOworCXB1YmxpYyBFbGVtZW50RWxlbWVudHMgZ2V0RWxlbWVudEFjY2VzcygpIHsKKwkJcmV0dXJuIHBFbGVtZW50OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRFbGVtZW50UnVsZSgpIHsKKwkJcmV0dXJuIGdldEVsZW1lbnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9HcmlkOgorCS8vCXtHcmlkfSAiZ3JpZCIgKCJhcyIgbmFtZT1JRCk/ICJ7IiByb3dzKz1HcmlkUm93KiAifSI7CisJcHVibGljIEdyaWRFbGVtZW50cyBnZXRHcmlkQWNjZXNzKCkgeworCQlyZXR1cm4gcEdyaWQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEdyaWRSdWxlKCkgeworCQlyZXR1cm4gZ2V0R3JpZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0dyaWRSb3c6CisJLy8Je0dyaWRSb3d9ICJyb3ciICgiYXMiIG5hbWU9SUQpPyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT8gInsiIGNlbGxzKz1HcmlkQ2VsbCogIn0iOworCXB1YmxpYyBHcmlkUm93RWxlbWVudHMgZ2V0R3JpZFJvd0FjY2VzcygpIHsKKwkJcmV0dXJuIHBHcmlkUm93OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRHcmlkUm93UnVsZSgpIHsKKwkJcmV0dXJuIGdldEdyaWRSb3dBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9HcmlkQ2VsbDoKKwkvLwl7R3JpZENlbGx9ICJjZWxsIiAoImFzIiBuYW1lPUlEKT8gKCJjb2x1bW5zcGFuIiBjb2x1bW5zcGFuPUlOVCk/ICJ7IiBlbGVtZW50cys9RWxlbWVudCogIn0iOworCXB1YmxpYyBHcmlkQ2VsbEVsZW1lbnRzIGdldEdyaWRDZWxsQWNjZXNzKCkgeworCQlyZXR1cm4gcEdyaWRDZWxsOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRHcmlkQ2VsbFJ1bGUoKSB7CisJCXJldHVybiBnZXRHcmlkQ2VsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0RhdGFtYXJ0VGFibGU6CisJLy8JInRhYmxlIiAvICpkYXRhbWFydFJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0RGVmaW5pdGlvbl0gKCdhcycgbmFtZT1JRCk/KiAvICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAieyIKKwkvLwkoZGV0YWlsaGVhZGVyPz0iZGV0YWlsaGVhZGVyIiAoInN0eWxlIiBoZWFkZXJzdHlsZT1bU3R5bGVdKT8pPyAoZGV0YWlsZm9vdGVyPz0iZGV0YWlsZm9vdGVyIiAoInN0eWxlIgorCS8vCWZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/IGdyb3Vwcys9RGF0YW1hcnRUYWJsZUdyb3VwKiBkZXRhaWw9RGF0YW1hcnRUYWJsZURldGFpbCAifSI7CisJcHVibGljIERhdGFtYXJ0VGFibGVFbGVtZW50cyBnZXREYXRhbWFydFRhYmxlQWNjZXNzKCkgeworCQlyZXR1cm4gcERhdGFtYXJ0VGFibGU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldERhdGFtYXJ0VGFibGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YW1hcnRUYWJsZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0RhdGFtYXJ0VGFibGVHcm91cDoKKwkvLwkiZ3JvdXAiIG5hbWU9SUQgImJ5IiBncm91cGluZ1JlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldICJ7IiBoZWFkZXI9RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyPworCS8vCShkZXRhaWxoZWFkZXI/PSJkZXRhaWxoZWFkZXIiICgic3R5bGUiIGhlYWRlcnN0eWxlPVtTdHlsZV0pPyk/IChkZXRhaWxmb290ZXI/PSJkZXRhaWxmb290ZXIiICgic3R5bGUiCisJLy8JZm9vdGVyc3R5bGU9W1N0eWxlXSk/KT8gZm9vdGVyPURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcj8gIn0iOworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXBFbGVtZW50cyBnZXREYXRhbWFydFRhYmxlR3JvdXBBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YW1hcnRUYWJsZUdyb3VwOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhbWFydFRhYmxlR3JvdXBSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YW1hcnRUYWJsZUdyb3VwQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOgorCS8vCXtEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJ9ICJoZWFkZXIiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAieyIgcm93cys9R3JpZFJvdyogIn0iOworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJFbGVtZW50cyBnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhbWFydFRhYmxlR3JvdXBIZWFkZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YW1hcnRUYWJsZUdyb3VwSGVhZGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyOgorCS8vCXtEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJ9ICJmb290ZXIiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAieyIgcm93cys9R3JpZFJvdyogIn0iOworCXB1YmxpYyBEYXRhbWFydFRhYmxlR3JvdXBGb290ZXJFbGVtZW50cyBnZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhbWFydFRhYmxlR3JvdXBGb290ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRGF0YW1hcnRUYWJsZURldGFpbDoKKwkvLwl7RGF0YW1hcnRUYWJsZURldGFpbH0gImRldGFpbHMiICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAoImFsbCIgfCAieyIgY29sdW1uRm9ybWF0dGVycys9RGF0YW1hcnRUYWJsZVByb3BlcnR5KiAifSIpOworCXB1YmxpYyBEYXRhbWFydFRhYmxlRGV0YWlsRWxlbWVudHMgZ2V0RGF0YW1hcnRUYWJsZURldGFpbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBEYXRhbWFydFRhYmxlRGV0YWlsOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhbWFydFRhYmxlRGV0YWlsUnVsZSgpIHsKKwkJcmV0dXJuIGdldERhdGFtYXJ0VGFibGVEZXRhaWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy8vICogISEhIGNvcHkgZnJvbSB0YWJsZWRzbCAuLi4gKiAvIERhdGFtYXJ0VGFibGVQcm9wZXJ0eToKKwkvLwljb2x1bW49VGFibGVWYWx1ZUVsZW1lbnQgKCgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPyAmIChoYXNJbWFnZT89ImltYWdlIiBpbWFnZT1UYWJsZUltYWdlKT8gJiAoImludGVydmFscyIKKwkvLwloaWRlTGFiZWxJbnRlcnZhbD89ImhpZGVsYWJlbCI/ICJ7IiBpbnRlcnZhbHMrPVRhYmxlSW50ZXJ2YWwqICJ9Iik/ICYgKCJsb29rdXBzIiBoaWRlTGFiZWxMb29rdXA/PSJoaWRlbGFiZWwiPyAieyIKKwkvLwlsb29rdXBzKz1UYWJsZUxvb2t1cCogIn0iKT8pOworCXB1YmxpYyBEYXRhbWFydFRhYmxlUHJvcGVydHlFbGVtZW50cyBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlBY2Nlc3MoKSB7CisJCXJldHVybiBwRGF0YW1hcnRUYWJsZVByb3BlcnR5OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXREYXRhbWFydFRhYmxlUHJvcGVydHlSdWxlKCkgeworCQlyZXR1cm4gZ2V0RGF0YW1hcnRUYWJsZVByb3BlcnR5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBQdXJlQWdncmVnYXRpb25UeXBlRW51bToKKwkvLwlDT1VOVD0iY291bnQiIHwgUlVOTklOR0NPVU5UPSJydW5uaW5nLWNvdW50IjsKKwlwdWJsaWMgUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW1FbGVtZW50cyBnZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRQdXJlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtOgorCS8vCVNVTT0ic3VtIiB8IEFWRT0iYXZlcmFnZSIgfCBNSU49Im1pbmltdW0iIHwgTUFYPSJtYXhpbXVtIiB8IFJVTk5JTkdTVU09InJ1bm5pbmctc3VtIjsKKwlwdWJsaWMgVW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtRWxlbWVudHMgZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0VW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtOgorCS8vCURJVj0iZGl2aWRlIjsKKwlwdWJsaWMgQmluYXJ5QWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzIGdldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRCaW5hcnlBZ2dyZWdhdGlvblR5cGVFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bToKKwkvLwlDT05DQVQ9ImNvbmNhdCI7CisJcHVibGljIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUVsZW1lbnRzIGdldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlTXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0TXVsdGlwbGVBZ2dyZWdhdGlvblR5cGVFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlRm9ybWF0dGVyOgorCS8vCXtUYWJsZUZvcm1hdHRlcn0gImZvcm1hdHRlciIgZm9ybWF0PVNUUklORzsKKwlwdWJsaWMgVGFibGVGb3JtYXR0ZXJFbGVtZW50cyBnZXRUYWJsZUZvcm1hdHRlckFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZUZvcm1hdHRlcjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVGb3JtYXR0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVGb3JtYXR0ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUltYWdlOgorCS8vCXtUYWJsZUltYWdlfSAicGF0aCIgaW1hZ2VQYXRoUGF0dGVybj1TVFJJTkcgKGhhc1BhcmFtZXRlcj89ImR5bmFtaWMiPyAmIGhpZGVJbWFnZUxhYmVsPz0iaGlkZWxhYmVsIj8gJgorCS8vCShyZXNpemU/PSJyZXNpemUiIHJlc2l6ZVN0cmluZz1TVFJJTkcpPyk7CisJcHVibGljIFRhYmxlSW1hZ2VFbGVtZW50cyBnZXRUYWJsZUltYWdlQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlSW1hZ2U7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlSW1hZ2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVJbWFnZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlVmFsdWVFbGVtZW50OgorCS8vCVRhYmxlUHJvcGVydHkgfCBUYWJsZUFnZ3JlZ2F0aW9uOworCXB1YmxpYyBUYWJsZVZhbHVlRWxlbWVudEVsZW1lbnRzIGdldFRhYmxlVmFsdWVFbGVtZW50QWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlVmFsdWVFbGVtZW50OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZVZhbHVlRWxlbWVudFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZVZhbHVlRWxlbWVudEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvLy8gKnxUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9ufFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiogLworCS8vLyAqVGFibGVNZWFzdXJlfFRhYmxlRGVyaXZlZHxUYWJsZUhpZXJhcmNoeXxUYWJsZU9yZGluYWx8VGFibGVDb2x1bW58VGFibGVUYXNrKiAvIFRhYmxlUHJvcGVydHk6CisJLy8JInByb3BlcnR5IiB2YWx1ZVJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldOworCXB1YmxpYyBUYWJsZVByb3BlcnR5RWxlbWVudHMgZ2V0VGFibGVQcm9wZXJ0eUFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZVByb3BlcnR5OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZVByb3BlcnR5UnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlUHJvcGVydHlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUFnZ3JlZ2F0aW9uOgorCS8vCSJhZ2dyZWdhdGUiIGFnZ3JlZ2F0aW9uPVRhYmxlQmFzZUFnZ3JlZ2F0aW9uICgoIm9uLWdyb3VwIiBvbkdyb3VwPVtEYXRhbWFydFRhYmxlR3JvdXBdKT8gJiAoInRpdGxlIgorCS8vCXRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HKT8pOworCXB1YmxpYyBUYWJsZUFnZ3JlZ2F0aW9uRWxlbWVudHMgZ2V0VGFibGVBZ2dyZWdhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZUFnZ3JlZ2F0aW9uOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZUFnZ3JlZ2F0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUJhc2VBZ2dyZWdhdGlvbjoKKwkvLwlUYWJsZVB1cmVBZ2dyZWdhdGlvbiB8IFRhYmxlVW5hcnlBZ2dyZWdhdGlvbiB8IFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbiB8IFRhYmxlQmluYXJ5QWdncmVnYXRpb247CisJcHVibGljIFRhYmxlQmFzZUFnZ3JlZ2F0aW9uRWxlbWVudHMgZ2V0VGFibGVCYXNlQWdncmVnYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVCYXNlQWdncmVnYXRpb247CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlQmFzZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVGFibGVQdXJlQWdncmVnYXRpb246CisJLy8JYWdncmVnYXRpb249UHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW07CisJcHVibGljIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uRWxlbWVudHMgZ2V0VGFibGVQdXJlQWdncmVnYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVQdXJlQWdncmVnYXRpb247CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlUHVyZUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVGFibGVVbmFyeUFnZ3JlZ2F0aW9uOgorCS8vCWFnZ3JlZ2F0aW9uPVVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSAib2YiIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XTsKKwlwdWJsaWMgVGFibGVVbmFyeUFnZ3JlZ2F0aW9uRWxlbWVudHMgZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVVbmFyeUFnZ3JlZ2F0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlVW5hcnlBZ2dyZWdhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbjoKKwkvLwlhZ2dyZWdhdGlvbj1NdWx0aXBsZUFnZ3JlZ2F0aW9uVHlwZUVudW0gIm9mIiAiKCIgdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldKiAiKSI7CisJcHVibGljIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkVsZW1lbnRzIGdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZU11bHRpcGxlQWdncmVnYXRpb247CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZU11bHRpcGxlQWdncmVnYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOgorCS8vCWFnZ3JlZ2F0aW9uPUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gIm9mIiAiKCIgdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldCisJLy8JdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldICIpIjsKKwlwdWJsaWMgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbkVsZW1lbnRzIGdldFRhYmxlQmluYXJ5QWdncmVnYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVCaW5hcnlBZ2dyZWdhdGlvbjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVCaW5hcnlBZ2dyZWdhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVGFibGVJbnRlcnZhbDoKKwkvLwlUYWJsZU51bWJlckludGVydmFsIHwgVGFibGVEYXRlRGF5SW50ZXJ2YWw7CisJcHVibGljIFRhYmxlSW50ZXJ2YWxFbGVtZW50cyBnZXRUYWJsZUludGVydmFsQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlSW50ZXJ2YWw7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlSW50ZXJ2YWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVJbnRlcnZhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlTnVtYmVySW50ZXJ2YWw6CisJLy8Je1RhYmxlTnVtYmVySW50ZXJ2YWx9ICJ1cCB0byIgbnVtYmVySW50ZXJ2YWxWYWx1ZT1TaWduZWROdW1iZXIgbnVtYmVyUmFuZ2U9VGFibGVSYW5nZUVsZW1lbnQ7CisJcHVibGljIFRhYmxlTnVtYmVySW50ZXJ2YWxFbGVtZW50cyBnZXRUYWJsZU51bWJlckludGVydmFsQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlTnVtYmVySW50ZXJ2YWw7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlTnVtYmVySW50ZXJ2YWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVOdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlRGF0ZURheUludGVydmFsOgorCS8vCXtUYWJsZURhdGVEYXlJbnRlcnZhbH0gImRheXMgaW4gcGFzdCIgZGF0ZUludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIGRhdGVSYW5nZT1UYWJsZVJhbmdlRWxlbWVudDsKKwlwdWJsaWMgVGFibGVEYXRlRGF5SW50ZXJ2YWxFbGVtZW50cyBnZXRUYWJsZURhdGVEYXlJbnRlcnZhbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZURhdGVEYXlJbnRlcnZhbDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVEYXRlRGF5SW50ZXJ2YWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUxvb2t1cDoKKwkvLwlUYWJsZU51bWJlckxvb2t1cCB8IFRhYmxlU3RyaW5nTG9va3VwIHwgVGFibGVEYXRlRGF5TG9va3VwOworCXB1YmxpYyBUYWJsZUxvb2t1cEVsZW1lbnRzIGdldFRhYmxlTG9va3VwQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlTG9va3VwOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZUxvb2t1cFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZUxvb2t1cEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlTnVtYmVyTG9va3VwOgorCS8vCXtUYWJsZU51bWJlckxvb2t1cH0gIm51bWJlciIgbG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50OworCXB1YmxpYyBUYWJsZU51bWJlckxvb2t1cEVsZW1lbnRzIGdldFRhYmxlTnVtYmVyTG9va3VwQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlTnVtYmVyTG9va3VwOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZU51bWJlckxvb2t1cFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZU51bWJlckxvb2t1cEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlU3RyaW5nTG9va3VwOgorCS8vCXtUYWJsZVN0cmluZ0xvb2t1cH0gInN0cmluZyIgbG9va3VwVmFsdWU9U1RSSU5HIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50OworCXB1YmxpYyBUYWJsZVN0cmluZ0xvb2t1cEVsZW1lbnRzIGdldFRhYmxlU3RyaW5nTG9va3VwQWNjZXNzKCkgeworCQlyZXR1cm4gcFRhYmxlU3RyaW5nTG9va3VwOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZVN0cmluZ0xvb2t1cFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZVN0cmluZ0xvb2t1cEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlRGF0ZURheUxvb2t1cDoKKwkvLwl7VGFibGVEYXRlRGF5TG9va3VwfSAiZGF5cyBpbiBwYXN0IiBsb29rdXBWYWx1ZT1TaWduZWROdW1iZXIgZGlzY3JldGU9VGFibGVSYW5nZUVsZW1lbnQ7CisJcHVibGljIFRhYmxlRGF0ZURheUxvb2t1cEVsZW1lbnRzIGdldFRhYmxlRGF0ZURheUxvb2t1cEFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZURhdGVEYXlMb29rdXA7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlRGF0ZURheUxvb2t1cFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZURhdGVEYXlMb29rdXBBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZVJhbmdlRWxlbWVudDoKKwkvLwlUYWJsZVRleHRDb2xvciB8IFRhYmxlQ2VsbENvbG9yIHwgVGFibGVJY29uIHwgVGFibGVUcmVuZDsKKwlwdWJsaWMgVGFibGVSYW5nZUVsZW1lbnRFbGVtZW50cyBnZXRUYWJsZVJhbmdlRWxlbWVudEFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZVJhbmdlRWxlbWVudDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVSYW5nZUVsZW1lbnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVSYW5nZUVsZW1lbnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9TaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKwkvLwkiLSI/IE51bWJlcjsKKwlwdWJsaWMgU2lnbmVkTnVtYmVyRWxlbWVudHMgZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkgeworCQlyZXR1cm4gcFNpZ25lZE51bWJlcjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0U2lnbmVkTnVtYmVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFNpZ25lZE51bWJlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RhYmxlVGV4dENvbG9yOgorCS8vCSJ0ZXh0Y29sb3IiIGNvbG9yPVtDb2xvcl07CisJcHVibGljIFRhYmxlVGV4dENvbG9yRWxlbWVudHMgZ2V0VGFibGVUZXh0Q29sb3JBY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVUZXh0Q29sb3I7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRhYmxlVGV4dENvbG9yUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRhYmxlVGV4dENvbG9yQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVGFibGVDZWxsQ29sb3I6CisJLy8JImNlbGxjb2xvciIgY29sb3I9W0NvbG9yXTsKKwlwdWJsaWMgVGFibGVDZWxsQ29sb3JFbGVtZW50cyBnZXRUYWJsZUNlbGxDb2xvckFjY2VzcygpIHsKKwkJcmV0dXJuIHBUYWJsZUNlbGxDb2xvcjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVDZWxsQ29sb3JSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVDZWxsQ29sb3JBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UYWJsZUljb246CisJLy8JImljb24iIGljb249U1RSSU5HOworCXB1YmxpYyBUYWJsZUljb25FbGVtZW50cyBnZXRUYWJsZUljb25BY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVJY29uOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUYWJsZUljb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0VGFibGVJY29uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVGFibGVUcmVuZDoKKwkvLwkidHJlbmQiIGljb249VHJlbmRJY29uRW51bTsKKwlwdWJsaWMgVGFibGVUcmVuZEVsZW1lbnRzIGdldFRhYmxlVHJlbmRBY2Nlc3MoKSB7CisJCXJldHVybiBwVGFibGVUcmVuZDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGFibGVUcmVuZFJ1bGUoKSB7CisJCXJldHVybiBnZXRUYWJsZVRyZW5kQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBUcmVuZEljb25FbnVtOgorCS8vCVJJU0lORz0icmlzaW5nIiB8IEJBRFJJU0lORz0iYmFkLXJpc2luZyIgfCBTTE9QSU5HPSJzbG9waW5nIiB8IEdPT0RTTE9QSU5HPSJnb29kLXNsb3BpbmciIHwgU1RBR05BVElORz0ic3RhZ25hdGluZyI7CisJcHVibGljIFRyZW5kSWNvbkVudW1FbGVtZW50cyBnZXRUcmVuZEljb25FbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVUcmVuZEljb25FbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0VHJlbmRJY29uRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRUcmVuZEljb25FbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vLyAqIC4uLiBjb3B5IGZyb20gdGFibGVkc2wgISEhICogLyAvL0NoYXJ0RHNsOgorCS8vLy8JJ2NoYXJ0JyBjaGFydFJlZj1bY2hhcnQ6OkNoYXJ0XSAoJ2FzJyBuYW1lPUlEKT87CisJLy8vLworCS8vVGl0bGU6CisJLy8Je1RpdGxlfSAidGl0bGUiIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPzsKKwlwdWJsaWMgVGl0bGVFbGVtZW50cyBnZXRUaXRsZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBUaXRsZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VGl0bGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0VGl0bGVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9TdWJUaXRsZToKKwkvLwl7U3ViVGl0bGV9ICJzdWJ0aXRsZSIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/OworCXB1YmxpYyBTdWJUaXRsZUVsZW1lbnRzIGdldFN1YlRpdGxlQWNjZXNzKCkgeworCQlyZXR1cm4gcFN1YlRpdGxlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRTdWJUaXRsZVJ1bGUoKSB7CisJCXJldHVybiBnZXRTdWJUaXRsZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1N1YlN1YlRpdGxlOgorCS8vCXtTdWJTdWJUaXRsZX0gInN1YnN1YnRpdGxlIiB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyAoInN0eWxlIiBzdHlsZT1bU3R5bGVdKT87CisJcHVibGljIFN1YlN1YlRpdGxlRWxlbWVudHMgZ2V0U3ViU3ViVGl0bGVBY2Nlc3MoKSB7CisJCXJldHVybiBwU3ViU3ViVGl0bGU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFN1YlN1YlRpdGxlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFN1YlN1YlRpdGxlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vTGFiZWw6CisJLy8Je0xhYmVsfSAibGFiZWwiIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPzsKKwlwdWJsaWMgTGFiZWxFbGVtZW50cyBnZXRMYWJlbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBMYWJlbDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0TGFiZWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0TGFiZWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9UZXh0OgorCS8vCXtUZXh0fSAidGV4dCIgdGV4dD1UUkFOU0xBVEFCTEVTVFJJTkcgKCJzdHlsZSIgc3R5bGU9W1N0eWxlXSk/OworCXB1YmxpYyBUZXh0RWxlbWVudHMgZ2V0VGV4dEFjY2VzcygpIHsKKwkJcmV0dXJuIHBUZXh0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUZXh0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFRleHRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9BdXRvVGV4dDoKKwkvLwkiYXV0b3RleHQiIHR5cGU9QXV0b1RleHRFbnVtICgic3R5bGUiIHN0eWxlPVtTdHlsZV0pPzsKKwlwdWJsaWMgQXV0b1RleHRFbGVtZW50cyBnZXRBdXRvVGV4dEFjY2VzcygpIHsKKwkJcmV0dXJuIHBBdXRvVGV4dDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0QXV0b1RleHRSdWxlKCkgeworCQlyZXR1cm4gZ2V0QXV0b1RleHRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIEJvcmRlclR5cGVFbnVtOgorCS8vCU5PTkU9Im5vbmUiIHwgU09MSUQ9InNvbGlkIiB8IERPVFRFRD0iZG90dGVkIiB8IERBU0hFRD0iZGFzaGVkIiB8IERPVUJMRT0iZG91YmxlIiB8IEdST09WRT0iZ3Jvb3ZlIiB8IFJJREdFPSJyaWRnZSIgfAorCS8vCUlOU0VUPSJpbnNldCIgfCBPVVRTRVQ9Im91dHNldCI7CisJcHVibGljIEJvcmRlclR5cGVFbnVtRWxlbWVudHMgZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZUJvcmRlclR5cGVFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0Qm9yZGVyVHlwZUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0Qm9yZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIEF1dG9UZXh0RW51bToKKwkvLwlQQUdFX05VTUJFUj0icGFnZS1udW1iZXIiIHwgVE9UQUxfUEFHRT0idG90YWwtcGFnZSIgfCBQQUdFX05VTUJFUl9VTkZJTFRFUkVEPSJwYWdlLW51bWJlci11bmZpbHRlcmVkIiB8CisJLy8JVE9UQUxfUEFHRV9VTkZJTFRFUkVEPSJ0b3RhbC1wYWdlLXVuZmlsdGVyZWQiIHwgUEFHRV9WQVJJQUJMRT0icGFnZS12YXJpYWJsZSI7CisJcHVibGljIEF1dG9UZXh0RW51bUVsZW1lbnRzIGdldEF1dG9UZXh0RW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlQXV0b1RleHRFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0QXV0b1RleHRFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldEF1dG9UZXh0RW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0ltYWdlOgorCS8vCSJpbWFnZSIgc2l6ZT1JbWFnZVNpemVFbnVtICgic2NhbGUiIHNjYWxlPVVuc2lnbmVkTnVtYmVyKT8gc291cmNlVHlwZT1JbWFnZVNvdXJjZUVudW0gZmlsZW5hbWU9U1RSSU5HOworCXB1YmxpYyBJbWFnZUVsZW1lbnRzIGdldEltYWdlQWNjZXNzKCkgeworCQlyZXR1cm4gcEltYWdlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRJbWFnZVJ1bGUoKSB7CisJCXJldHVybiBnZXRJbWFnZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gSW1hZ2VTaXplRW51bToKKwkvLwlTSVpFX1RPX0lNQUdFPSJzaXplLXRvLWltYWdlIiB8IFNDQUxFX1RPX0lURU09InNjYWxlLXRvLWl0ZW0iIHwgQ0xJUD0iY2xpcCI7CisJcHVibGljIEltYWdlU2l6ZUVudW1FbGVtZW50cyBnZXRJbWFnZVNpemVFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVJbWFnZVNpemVFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0SW1hZ2VTaXplRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRJbWFnZVNpemVFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBJbWFnZVNvdXJjZUVudW06CisJLy8JRklMRT0iZmlsZSIgfCBVUkw9InVybCIgfCBFTUJFRD0iZW1iZWQiOworCXB1YmxpYyBJbWFnZVNvdXJjZUVudW1FbGVtZW50cyBnZXRJbWFnZVNvdXJjZUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZUltYWdlU291cmNlRW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldEltYWdlU291cmNlRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRJbWFnZVNvdXJjZUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9SZXBvcnRJbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwkvLwkiaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOworCXB1YmxpYyBSZXBvcnRJbXBvcnRFbGVtZW50cyBnZXRSZXBvcnRJbXBvcnRBY2Nlc3MoKSB7CisJCXJldHVybiBwUmVwb3J0SW1wb3J0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSZXBvcnRJbXBvcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UmVwb3J0SW1wb3J0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDoKKwkvLwlRdWFsaWZpZWROYW1lICgiLiIgIioiKT87CisJcHVibGljIFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cyBnZXRSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkgeworCQlyZXR1cm4gcFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJlcG9ydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UmVwb3J0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RSQU5TTEFUQUJMRVNUUklORzoKKwkvLwlTVFJJTkc7CisJcHVibGljIFRSQU5TTEFUQUJMRVNUUklOR0VsZW1lbnRzIGdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpIHsKKwkJcmV0dXJuIHBUUkFOU0xBVEFCTEVTVFJJTkc7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFRSQU5TTEFUQUJMRVNUUklOR1J1bGUoKSB7CisJCXJldHVybiBnZXRUUkFOU0xBVEFCTEVTVFJJTkdBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbjoKKwkvLwl7WEFubm90YXRpb259ICJAIiBhbm5vdGF0aW9uVHlwZT1bdHlwZXM6Okp2bUFubm90YXRpb25UeXBlfFF1YWxpZmllZE5hbWVdICgiKCIKKwkvLwkoZWxlbWVudFZhbHVlUGFpcnMrPVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciAoIiwiIGVsZW1lbnRWYWx1ZVBhaXJzKz1YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIpKiB8CisJLy8JdmFsdWU9WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCk/ICIpIik/OworCXB1YmxpYyBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MuWEFubm90YXRpb25FbGVtZW50cyBnZXRYQW5ub3RhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFubm90YXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI6CisJLy8JPT4gKGVsZW1lbnQ9W3R5cGVzOjpKdm1PcGVyYXRpb258VmFsaWRJRF0gIj0iKSB2YWx1ZT1YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckVsZW1lbnRzIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgeGJhc2U6OlhFeHByZXNzaW9uOgorCS8vCT0+ICh7eGJhc2U6OlhMaXN0TGl0ZXJhbH0gIiMiICJbIikgKGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoIiwiIGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbikqKT8gIl0iCisJLy8JfCBYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoe3hiYXNlOjpYTGlzdExpdGVyYWwuZWxlbWVudHMrPWN1cnJlbnR9ICgiLCIgZWxlbWVudHMrPVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKSspPzsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RFbGVtZW50cyBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgeGJhc2U6OlhFeHByZXNzaW9uOgorCS8vCT0+ICh7eGJhc2U6OlhMaXN0TGl0ZXJhbH0gIiMiICJbIikgKGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoIiwiIGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbikqKT8gIl0iCisJLy8JfCBYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlRWxlbWVudHMgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25PckV4cHJlc3Npb24gcmV0dXJucyB4YmFzZTo6WEV4cHJlc3Npb246CisJLy8JWEFubm90YXRpb24gfCBYRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEV4cHJlc3Npb246CisJLy8JWEFzc2lnbm1lbnQ7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBc3NpZ25tZW50IHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hBc3NpZ25tZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxGZWF0dXJlQ2FsbElEXSBPcFNpbmdsZUFzc2lnbiB2YWx1ZT1YQXNzaWdubWVudCB8IFhPckV4cHJlc3Npb24KKwkvLwkoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wTXVsdGlBc3NpZ25dKQorCS8vCXJpZ2h0T3BlcmFuZD1YQXNzaWdubWVudCk/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEFzc2lnbm1lbnRFbGVtZW50cyBnZXRYQXNzaWdubWVudEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFzc2lnbm1lbnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcFNpbmdsZUFzc2lnbjoKKwkvLwkiPSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcFNpbmdsZUFzc2lnbkVsZW1lbnRzIGdldE9wU2luZ2xlQXNzaWduQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSB7CisJCXJldHVybiBnZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wTXVsdGlBc3NpZ246CisJLy8JIis9IiB8ICItPSIgfCAiKj0iIHwgIi89IiB8ICIlPSIgfCAiPCIgIjwiICI9IiB8ICI+IiAiPiI/ICI+PSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE11bHRpQXNzaWduRWxlbWVudHMgZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE11bHRpQXNzaWduUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YT3JFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWEFuZEV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE9yXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEFuZEV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhPckV4cHJlc3Npb25FbGVtZW50cyBnZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhPckV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wT3I6CisJLy8JInx8IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wT3JFbGVtZW50cyBnZXRPcE9yQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcE9yQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wT3JSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BPckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbmRFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWEVxdWFsaXR5RXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wQW5kXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEVxdWFsaXR5RXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEFuZEV4cHJlc3Npb25FbGVtZW50cyBnZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcEFuZDoKKwkvLwkiJiYiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BBbmRFbGVtZW50cyBnZXRPcEFuZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BBbmRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BBbmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BBbmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWFJlbGF0aW9uYWxFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BFcXVhbGl0eV0pCisJLy8JcmlnaHRPcGVyYW5kPVhSZWxhdGlvbmFsRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEVxdWFsaXR5RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BFcXVhbGl0eToKKwkvLwkiPT0iIHwgIiE9IiB8ICI9PT0iIHwgIiE9PSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcEVxdWFsaXR5RWxlbWVudHMgZ2V0T3BFcXVhbGl0eUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BFcXVhbGl0eUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcEVxdWFsaXR5UnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKD0+ICh7WEluc3RhbmNlT2ZFeHByZXNzaW9uLmV4cHJlc3Npb249Y3VycmVudH0gImluc3RhbmNlb2YiKSB0eXBlPUp2bVR5cGVSZWZlcmVuY2UgfCA9PgorCS8vCSh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcENvbXBhcmVdKQorCS8vCXJpZ2h0T3BlcmFuZD1YT3RoZXJPcGVyYXRvckV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhSZWxhdGlvbmFsRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcENvbXBhcmU6CisJLy8JIj49IiB8ICI8IiAiPSIgfCAiPiIgfCAiPCI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcENvbXBhcmVFbGVtZW50cyBnZXRPcENvbXBhcmVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wQ29tcGFyZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcENvbXBhcmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWEFkZGl0aXZlRXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wT3RoZXJdKQorCS8vCXJpZ2h0T3BlcmFuZD1YQWRkaXRpdmVFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25FbGVtZW50cyBnZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BPdGhlcjoKKwkvLwkiLT4iIHwgIi4uPCIgfCAiPiIgIi4uIiB8ICIuLiIgfCAiPT4iIHwgIj4iICg9PiAoIj4iICI+IikgfCAiPiIpIHwgIjwiICg9PiAoIjwiICI8IikgfCAiPCIgfCAiPT4iKSB8ICI8PiIgfCAiPzoiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BPdGhlckVsZW1lbnRzIGdldE9wT3RoZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wT3RoZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BPdGhlclJ1bGUoKSB7CisJCXJldHVybiBnZXRPcE90aGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcEFkZF0pCisJLy8JcmlnaHRPcGVyYW5kPVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhBZGRpdGl2ZUV4cHJlc3Npb25FbGVtZW50cyBnZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wQWRkOgorCS8vCSIrIiB8ICItIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wQWRkRWxlbWVudHMgZ2V0T3BBZGRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wQWRkQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wQWRkUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wQWRkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhVbmFyeU9wZXJhdGlvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wTXVsdGldKQorCS8vCXJpZ2h0T3BlcmFuZD1YVW5hcnlPcGVyYXRpb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25FbGVtZW50cyBnZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wTXVsdGk6CisJLy8JIioiIHwgIioqIiB8ICIvIiB8ICIlIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wTXVsdGlFbGVtZW50cyBnZXRPcE11bHRpQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcE11bHRpQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wTXVsdGlSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BNdWx0aUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVW5hcnlPcGVyYXRpb259IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wVW5hcnldIG9wZXJhbmQ9WFVuYXJ5T3BlcmF0aW9uIHwgWENhc3RlZEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVW5hcnlPcGVyYXRpb25FbGVtZW50cyBnZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BVbmFyeToKKwkvLwkiISIgfCAiLSIgfCAiKyI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcFVuYXJ5RWxlbWVudHMgZ2V0T3BVbmFyeUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BVbmFyeUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcFVuYXJ5UnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wVW5hcnlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ2FzdGVkRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhQb3N0Zml4T3BlcmF0aW9uICg9PiAoe1hDYXN0ZWRFeHByZXNzaW9uLnRhcmdldD1jdXJyZW50fSAiYXMiKSB0eXBlPUp2bVR5cGVSZWZlcmVuY2UpKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDYXN0ZWRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFBvc3RmaXhPcGVyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYTWVtYmVyRmVhdHVyZUNhbGwgPT4gKHtYUG9zdGZpeE9wZXJhdGlvbi5vcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wUG9zdGZpeF0pPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhQb3N0Zml4T3BlcmF0aW9uRWxlbWVudHMgZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BQb3N0Zml4OgorCS8vCSIrKyIgfCAiLS0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BQb3N0Zml4RWxlbWVudHMgZ2V0T3BQb3N0Zml4QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcFBvc3RmaXhBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BQb3N0Zml4UnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wUG9zdGZpeEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hNZW1iZXJGZWF0dXJlQ2FsbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhQcmltYXJ5RXhwcmVzc2lvbiAoPT4gKHtYQXNzaWdubWVudC5hc3NpZ25hYmxlPWN1cnJlbnR9ICgiLiIgfCBleHBsaWNpdFN0YXRpYz89Ijo6IikKKwkvLwlmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxGZWF0dXJlQ2FsbElEXSBPcFNpbmdsZUFzc2lnbikgdmFsdWU9WEFzc2lnbm1lbnQgfCA9PgorCS8vCSh7WE1lbWJlckZlYXR1cmVDYWxsLm1lbWJlckNhbGxUYXJnZXQ9Y3VycmVudH0gKCIuIiB8IG51bGxTYWZlPz0iPy4iIHwgZXhwbGljaXRTdGF0aWM/PSI6OiIpKSAoIjwiCisJLy8JdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICgiLCIgdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKSogIj4iKT8KKwkvLwlmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxJZE9yU3VwZXJdICg9PiBleHBsaWNpdE9wZXJhdGlvbkNhbGw/PSIoIiAobWVtYmVyQ2FsbEFyZ3VtZW50cys9WFNob3J0Q2xvc3VyZQorCS8vCXwgbWVtYmVyQ2FsbEFyZ3VtZW50cys9WEV4cHJlc3Npb24gKCIsIiBtZW1iZXJDYWxsQXJndW1lbnRzKz1YRXhwcmVzc2lvbikqKT8gIikiKT8gbWVtYmVyQ2FsbEFyZ3VtZW50cys9WENsb3N1cmU/KSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTWVtYmVyRmVhdHVyZUNhbGxFbGVtZW50cyBnZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFByaW1hcnlFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWENvbnN0cnVjdG9yQ2FsbCB8IFhCbG9ja0V4cHJlc3Npb24gfCBYU3dpdGNoRXhwcmVzc2lvbiB8IFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHwgWEZlYXR1cmVDYWxsIHwgWExpdGVyYWwgfAorCS8vCVhJZkV4cHJlc3Npb24gfCBYRm9yTG9vcEV4cHJlc3Npb24gfCBYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiB8IFhXaGlsZUV4cHJlc3Npb24gfCBYRG9XaGlsZUV4cHJlc3Npb24gfAorCS8vCVhUaHJvd0V4cHJlc3Npb24gfCBYUmV0dXJuRXhwcmVzc2lvbiB8IFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHwgWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFByaW1hcnlFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWENvbGxlY3Rpb25MaXRlcmFsIHwgWENsb3N1cmUgfCBYQm9vbGVhbkxpdGVyYWwgfCBYTnVtYmVyTGl0ZXJhbCB8IFhOdWxsTGl0ZXJhbCB8IFhTdHJpbmdMaXRlcmFsIHwgWFR5cGVMaXRlcmFsOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWExpdGVyYWxFbGVtZW50cyBnZXRYTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WExpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WExpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ29sbGVjdGlvbkxpdGVyYWw6CisJLy8JWFNldExpdGVyYWwgfCBYTGlzdExpdGVyYWw7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ29sbGVjdGlvbkxpdGVyYWxFbGVtZW50cyBnZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFNldExpdGVyYWw6CisJLy8Je1hTZXRMaXRlcmFsfSAiIyIgInsiIChlbGVtZW50cys9WEV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEV4cHJlc3Npb24pKik/ICJ9IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTZXRMaXRlcmFsRWxlbWVudHMgZ2V0WFNldExpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTZXRMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTZXRMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWExpc3RMaXRlcmFsOgorCS8vCXtYTGlzdExpdGVyYWx9ICIjIiAiWyIgKGVsZW1lbnRzKz1YRXhwcmVzc2lvbiAoIiwiIGVsZW1lbnRzKz1YRXhwcmVzc2lvbikqKT8gIl0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWExpc3RMaXRlcmFsRWxlbWVudHMgZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WExpc3RMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDbG9zdXJlIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYQ2xvc3VyZX0gIlsiKSA9PiAoKGRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycys9SnZtRm9ybWFsUGFyYW1ldGVyICgiLCIKKwkvLwlkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMrPUp2bUZvcm1hbFBhcmFtZXRlcikqKT8gZXhwbGljaXRTeW50YXg/PSJ8Iik/IGV4cHJlc3Npb249WEV4cHJlc3Npb25JbkNsb3N1cmUgIl0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENsb3N1cmVFbGVtZW50cyBnZXRYQ2xvc3VyZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENsb3N1cmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENsb3N1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRXhwcmVzc2lvbkluQ2xvc3VyZSByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQmxvY2tFeHByZXNzaW9ufSAoZXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAiOyI/KSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRXhwcmVzc2lvbkluQ2xvc3VyZUVsZW1lbnRzIGdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRXhwcmVzc2lvbkluQ2xvc3VyZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTaG9ydENsb3N1cmUgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe1hDbG9zdXJlfSAoZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIgKCIsIiBkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMrPUp2bUZvcm1hbFBhcmFtZXRlcikqKT8KKwkvLwlleHBsaWNpdFN5bnRheD89InwiKSBleHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFNob3J0Q2xvc3VyZUVsZW1lbnRzIGdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JIigiIFhFeHByZXNzaW9uICIpIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YSWZFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hJZkV4cHJlc3Npb259ICJpZiIgIigiIGlmPVhFeHByZXNzaW9uICIpIiB0aGVuPVhFeHByZXNzaW9uICgiZWxzZSIgZWxzZT1YRXhwcmVzc2lvbik/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWElmRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFN3aXRjaEV4cHJlc3Npb259ICJzd2l0Y2giICg9PiAoIigiIGRlY2xhcmVkUGFyYW09SnZtRm9ybWFsUGFyYW1ldGVyICI6Iikgc3dpdGNoPVhFeHByZXNzaW9uICIpIiB8ID0+CisJLy8JKGRlY2xhcmVkUGFyYW09SnZtRm9ybWFsUGFyYW1ldGVyICI6Iik/IHN3aXRjaD1YRXhwcmVzc2lvbikgInsiIGNhc2VzKz1YQ2FzZVBhcnQqICgiZGVmYXVsdCIgIjoiCisJLy8JZGVmYXVsdD1YRXhwcmVzc2lvbik/ICJ9IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTd2l0Y2hFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENhc2VQYXJ0OgorCS8vCXtYQ2FzZVBhcnR9IHR5cGVHdWFyZD1Kdm1UeXBlUmVmZXJlbmNlPyAoImNhc2UiIGNhc2U9WEV4cHJlc3Npb24pPyAoIjoiIHRoZW49WEV4cHJlc3Npb24gfCBmYWxsVGhyb3VnaD89IiwiKTsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDYXNlUGFydEVsZW1lbnRzIGdldFhDYXNlUGFydEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENhc2VQYXJ0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDYXNlUGFydFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe1hGb3JMb29wRXhwcmVzc2lvbn0gImZvciIgIigiIGRlY2xhcmVkUGFyYW09SnZtRm9ybWFsUGFyYW1ldGVyICI6IikgZm9yRXhwcmVzc2lvbj1YRXhwcmVzc2lvbiAiKSIKKwkvLwllYWNoRXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhGb3JMb29wRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQmFzaWNGb3JMb29wRXhwcmVzc2lvbn0gImZvciIgIigiIChpbml0RXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAoIiwiCisJLy8JaW5pdEV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24pKik/ICI7IiBleHByZXNzaW9uPVhFeHByZXNzaW9uPyAiOyIgKHVwZGF0ZUV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbiAoIiwiCisJLy8JdXBkYXRlRXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uKSopPyAiKSIgZWFjaEV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQmFzaWNGb3JMb29wRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hXaGlsZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFdoaWxlRXhwcmVzc2lvbn0gIndoaWxlIiAiKCIgcHJlZGljYXRlPVhFeHByZXNzaW9uICIpIiBib2R5PVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFdoaWxlRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWERvV2hpbGVFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hEb1doaWxlRXhwcmVzc2lvbn0gImRvIiBib2R5PVhFeHByZXNzaW9uICJ3aGlsZSIgIigiIHByZWRpY2F0ZT1YRXhwcmVzc2lvbiAiKSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRG9XaGlsZUV4cHJlc3Npb25FbGVtZW50cyBnZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEJsb2NrRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQmxvY2tFeHByZXNzaW9ufSAieyIgKGV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gIjsiPykqICJ9IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhCbG9ja0V4cHJlc3Npb25FbGVtZW50cyBnZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhWYXJpYWJsZURlY2xhcmF0aW9uIHwgWEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25FbGVtZW50cyBnZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFZhcmlhYmxlRGVjbGFyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFZhcmlhYmxlRGVjbGFyYXRpb259ICh3cml0ZWFibGU/PSJ2YXIiIHwgInZhbCIpICg9PiAodHlwZT1Kdm1UeXBlUmVmZXJlbmNlIG5hbWU9VmFsaWRJRCkgfCBuYW1lPVZhbGlkSUQpICgiPSIKKwkvLwlyaWdodD1YRXhwcmVzc2lvbik/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFZhcmlhYmxlRGVjbGFyYXRpb25FbGVtZW50cyBnZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyB0eXBlczo6SnZtRm9ybWFsUGFyYW1ldGVyOgorCS8vCXBhcmFtZXRlclR5cGU9SnZtVHlwZVJlZmVyZW5jZT8gbmFtZT1WYWxpZElEOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuSnZtRm9ybWFsUGFyYW1ldGVyRWxlbWVudHMgZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyB0eXBlczo6SnZtRm9ybWFsUGFyYW1ldGVyOgorCS8vCXBhcmFtZXRlclR5cGU9SnZtVHlwZVJlZmVyZW5jZSBuYW1lPVZhbGlkSUQ7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5GdWxsSnZtRm9ybWFsUGFyYW1ldGVyRWxlbWVudHMgZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRmVhdHVyZUNhbGwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEZlYXR1cmVDYWxsfSAoIjwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/CisJLy8JZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8SWRPclN1cGVyXSAoPT4gZXhwbGljaXRPcGVyYXRpb25DYWxsPz0iKCIgKGZlYXR1cmVDYWxsQXJndW1lbnRzKz1YU2hvcnRDbG9zdXJlCisJLy8JfCBmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WEV4cHJlc3Npb24gKCIsIiBmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WEV4cHJlc3Npb24pKik/ICIpIik/IGZlYXR1cmVDYWxsQXJndW1lbnRzKz1YQ2xvc3VyZT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRmVhdHVyZUNhbGxFbGVtZW50cyBnZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRmVhdHVyZUNhbGxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRmVhdHVyZUNhbGxJRDoKKwkvLwlWYWxpZElEIHwgImV4dGVuZHMiIHwgInN0YXRpYyIgfCAiaW1wb3J0IiB8ICJleHRlbnNpb24iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuRmVhdHVyZUNhbGxJREVsZW1lbnRzIGdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RmVhdHVyZUNhbGxJRFJ1bGUoKSB7CisJCXJldHVybiBnZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSWRPclN1cGVyOgorCS8vCUZlYXR1cmVDYWxsSUQgfCAic3VwZXIiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuSWRPclN1cGVyRWxlbWVudHMgZ2V0SWRPclN1cGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRJZE9yU3VwZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SWRPclN1cGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldElkT3JTdXBlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WENvbnN0cnVjdG9yQ2FsbH0gIm5ldyIgY29uc3RydWN0b3I9W3R5cGVzOjpKdm1Db25zdHJ1Y3RvcnxRdWFsaWZpZWROYW1lXSAoIjwiCisJLy8JdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICgiLCIgdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKSogIj4iKT8gKD0+CisJLy8JZXhwbGljaXRDb25zdHJ1Y3RvckNhbGw/PSIoIiAoYXJndW1lbnRzKz1YU2hvcnRDbG9zdXJlIHwgYXJndW1lbnRzKz1YRXhwcmVzc2lvbiAoIiwiIGFyZ3VtZW50cys9WEV4cHJlc3Npb24pKik/ICIpIik/CisJLy8JYXJndW1lbnRzKz1YQ2xvc3VyZT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ29uc3RydWN0b3JDYWxsRWxlbWVudHMgZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQm9vbGVhbkxpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJvb2xlYW5MaXRlcmFsfSAoImZhbHNlIiB8IGlzVHJ1ZT89InRydWUiKTsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhCb29sZWFuTGl0ZXJhbEVsZW1lbnRzIGdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTnVsbExpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WE51bGxMaXRlcmFsfSAibnVsbCI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTnVsbExpdGVyYWxFbGVtZW50cyBnZXRYTnVsbExpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTnVsbExpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE51bWJlckxpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WE51bWJlckxpdGVyYWx9IHZhbHVlPU51bWJlcjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhOdW1iZXJMaXRlcmFsRWxlbWVudHMgZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhOdW1iZXJMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFN0cmluZ0xpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFN0cmluZ0xpdGVyYWx9IHZhbHVlPVNUUklORzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTdHJpbmdMaXRlcmFsRWxlbWVudHMgZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTdHJpbmdMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFR5cGVMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hUeXBlTGl0ZXJhbH0gInR5cGVvZiIgIigiIHR5cGU9W3R5cGVzOjpKdm1UeXBlfFF1YWxpZmllZE5hbWVdIGFycmF5RGltZW5zaW9ucys9QXJyYXlCcmFja2V0cyogIikiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFR5cGVMaXRlcmFsRWxlbWVudHMgZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFR5cGVMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hUaHJvd0V4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFRocm93RXhwcmVzc2lvbn0gInRocm93IiBleHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFRocm93RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFJldHVybkV4cHJlc3Npb259ICJyZXR1cm4iIC0+IGV4cHJlc3Npb249WEV4cHJlc3Npb24/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFJldHVybkV4cHJlc3Npb25FbGVtZW50cyBnZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbn0gInRyeSIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbiAoY2F0Y2hDbGF1c2VzKz1YQ2F0Y2hDbGF1c2UrICgiZmluYWxseSIKKwkvLwlmaW5hbGx5RXhwcmVzc2lvbj1YRXhwcmVzc2lvbik/IHwgImZpbmFsbHkiIGZpbmFsbHlFeHByZXNzaW9uPVhFeHByZXNzaW9uKTsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFN5bmNocm9uaXplZEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe1hTeW5jaHJvbml6ZWRFeHByZXNzaW9ufSAic3luY2hyb25pemVkIiAiKCIpIHBhcmFtPVhFeHByZXNzaW9uICIpIiBleHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFN5bmNocm9uaXplZEV4cHJlc3Npb25FbGVtZW50cyBnZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ2F0Y2hDbGF1c2U6CisJLy8JImNhdGNoIiAiKCIgZGVjbGFyZWRQYXJhbT1GdWxsSnZtRm9ybWFsUGFyYW1ldGVyICIpIiBleHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENhdGNoQ2xhdXNlRWxlbWVudHMgZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENhdGNoQ2xhdXNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWU6CisJLy8JVmFsaWRJRCAoIi4iIFZhbGlkSUQpKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlF1YWxpZmllZE5hbWVFbGVtZW50cyBnZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFF1YWxpZmllZE5hbWVSdWxlKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL051bWJlciBoaWRkZW4oKToKKwkvLwlIRVggfCAoSU5UIHwgREVDSU1BTCkgKCIuIiAoSU5UIHwgREVDSU1BTCkpPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk51bWJlckVsZW1lbnRzIGdldE51bWJlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0TnVtYmVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE51bWJlclJ1bGUoKSB7CisJCXJldHVybiBnZXROdW1iZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy8vICoqCisJLy8gKiBEdW1teSBydWxlLCBmb3IgImJldHRlciIgZG93bndhcmRzIGNvbXBhdGliaWxpdHksIHNpbmNlIEdyYW1tYXJBY2Nlc3MgZ2VuZXJhdGVzIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3NlcywgCisJLy8gKiB3aGljaCBtYWtlcyBkb3duc3RyZWFtIGdyYW1tYXJzIGJyZWFrIG9uIGNsYXNzbG9hZGluZywgd2hlbiBhIHJ1bGUgaXMgcmVtb3ZlZC4KKwkvLyAqIC8KKwkvL1N0YXRpY1F1YWxpZmllcjoKKwkvLwkoVmFsaWRJRCAiOjoiKSs7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5TdGF0aWNRdWFsaWZpZXJFbGVtZW50cyBnZXRTdGF0aWNRdWFsaWZpZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFN0YXRpY1F1YWxpZmllckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRTdGF0aWNRdWFsaWZpZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vdGVybWluYWwgSEVYOgorCS8vCSgiMHgiIHwgIjBYIikgKCIwIi4uIjkiIHwgImEiLi4iZiIgfCAiQSIuLiJGIiB8ICJfIikrICgiIyIgKCgiYiIgfCAiQiIpICgiaSIgfCAiSSIpIHwgKCJsIiB8ICJMIikpKT87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRIRVhSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRIRVhSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgSU5UIHJldHVybnMgZWNvcmU6OkVJbnQ6CisJLy8JIjAiLi4iOSIgKCIwIi4uIjkiIHwgIl8iKSo7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRJTlRSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRJTlRSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgREVDSU1BTDoKKwkvLwlJTlQgKCgiZSIgfCAiRSIpICgiKyIgfCAiLSIpPyBJTlQpPyAoKCJiIiB8ICJCIikgKCJpIiB8ICJJIiB8ICJkIiB8ICJEIikgfCAoImwiIHwgIkwiIHwgImQiIHwgIkQiIHwgImYiIHwgIkYiKSk/OworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0REVDSU1BTFJ1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldERFQ0lNQUxSdWxlKCk7CisJfSAKKworCS8vSnZtVHlwZVJlZmVyZW5jZToKKwkvLwlKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA9PiAoe0p2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2UuY29tcG9uZW50VHlwZT1jdXJyZW50fSBBcnJheUJyYWNrZXRzKSogfAorCS8vCVhGdW5jdGlvblR5cGVSZWY7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1UeXBlUmVmZXJlbmNlRWxlbWVudHMgZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9BcnJheUJyYWNrZXRzOgorCS8vCSJbIiAiXSI7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5BcnJheUJyYWNrZXRzRWxlbWVudHMgZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRBcnJheUJyYWNrZXRzUnVsZSgpIHsKKwkJcmV0dXJuIGdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRnVuY3Rpb25UeXBlUmVmOgorCS8vCSgiKCIgKHBhcmFtVHlwZXMrPUp2bVR5cGVSZWZlcmVuY2UgKCIsIiBwYXJhbVR5cGVzKz1Kdm1UeXBlUmVmZXJlbmNlKSopPyAiKSIpPyAiPT4iIHJldHVyblR5cGU9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlhGdW5jdGlvblR5cGVSZWZFbGVtZW50cyBnZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlOgorCS8vCXR5cGU9W0p2bVR5cGV8UXVhbGlmaWVkTmFtZV0gKCI8IiBhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIGFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKSogIj4iCisJLy8JKD0+ICh7SnZtSW5uZXJUeXBlUmVmZXJlbmNlLm91dGVyPWN1cnJlbnR9ICIuIikgdHlwZT1bSnZtVHlwZXxWYWxpZElEXSAoIjwiIGFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICgiLCIKKwkvLwlhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/KSopPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlRWxlbWVudHMgZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIHJldHVybnMgSnZtVHlwZVJlZmVyZW5jZToKKwkvLwlKdm1UeXBlUmVmZXJlbmNlIHwgSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlRWxlbWVudHMgZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZToKKwkvLwl7SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlfSAiPyIgKGNvbnN0cmFpbnRzKz1Kdm1VcHBlckJvdW5kIGNvbnN0cmFpbnRzKz1Kdm1VcHBlckJvdW5kQW5kZWQqIHwKKwkvLwljb25zdHJhaW50cys9SnZtTG93ZXJCb3VuZCBjb25zdHJhaW50cys9SnZtTG93ZXJCb3VuZEFuZGVkKik/OworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlRWxlbWVudHMgZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bVVwcGVyQm91bmQ6CisJLy8JImV4dGVuZHMiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVVwcGVyQm91bmRFbGVtZW50cyBnZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVVwcGVyQm91bmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bVVwcGVyQm91bmRBbmRlZCByZXR1cm5zIEp2bVVwcGVyQm91bmQ6CisJLy8JIiYiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVVwcGVyQm91bmRBbmRlZEVsZW1lbnRzIGdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1Mb3dlckJvdW5kOgorCS8vCSJzdXBlciIgdHlwZVJlZmVyZW5jZT1Kdm1UeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtTG93ZXJCb3VuZEVsZW1lbnRzIGdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtTG93ZXJCb3VuZEFuZGVkIHJldHVybnMgSnZtTG93ZXJCb3VuZDoKKwkvLwkiJiIgdHlwZVJlZmVyZW5jZT1Kdm1UeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtTG93ZXJCb3VuZEFuZGVkRWxlbWVudHMgZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bVR5cGVQYXJhbWV0ZXI6CisJLy8JbmFtZT1WYWxpZElEIChjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZCBjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZEFuZGVkKik/OworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtVHlwZVBhcmFtZXRlckVsZW1lbnRzIGdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtVHlwZVBhcmFtZXRlclJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZDoKKwkvLwlRdWFsaWZpZWROYW1lICIuIiAiKiI7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkRWxlbWVudHMgZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpIHsKKwkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9WYWxpZElEOgorCS8vCUlEOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuVmFsaWRJREVsZW1lbnRzIGdldFZhbGlkSURBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFZhbGlkSURBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VmFsaWRJRFJ1bGUoKSB7CisJCXJldHVybiBnZXRWYWxpZElEQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEltcG9ydFNlY3Rpb246CisJLy8JaW1wb3J0RGVjbGFyYXRpb25zKz1YSW1wb3J0RGVjbGFyYXRpb24rOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuWEltcG9ydFNlY3Rpb25FbGVtZW50cyBnZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEltcG9ydFNlY3Rpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YSW1wb3J0RGVjbGFyYXRpb246CisJLy8JImltcG9ydCIgKHN0YXRpYz89InN0YXRpYyIgZXh0ZW5zaW9uPz0iZXh0ZW5zaW9uIj8gaW1wb3J0ZWRUeXBlPVtKdm1EZWNsYXJlZFR5cGV8UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0XQorCS8vCSh3aWxkY2FyZD89IioiIHwgbWVtYmVyTmFtZT1WYWxpZElEKSB8IGltcG9ydGVkVHlwZT1bSnZtRGVjbGFyZWRUeXBlfFF1YWxpZmllZE5hbWVdIHwKKwkvLwlpbXBvcnRlZE5hbWVzcGFjZT1RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkKSAiOyI/OworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuWEltcG9ydERlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDoKKwkvLwkoVmFsaWRJRCAiLiIpKzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEVsZW1lbnRzIGdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy90ZXJtaW5hbCBJRDoKKwkvLwkiXiI/ICgiYSIuLiJ6IiB8ICJBIi4uIloiIHwgIiQiIHwgIl8iKSAoImEiLi4ieiIgfCAiQSIuLiJaIiB8ICIkIiB8ICJfIiB8ICIwIi4uIjkiKSo7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRJRFJ1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldElEUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFNUUklORzoKKwkvLwkiXCIiICgiXFwiIC4gLyAqICgnYid8J3QnfCduJ3wnZid8J3InfCd1J3wnIid8IicifCdcXCcpICogLyB8ICEoIlxcIiB8ICJcIiIpKSogIlwiIj8gfCAiXCciICgiXFwiIC4KKwkvLwkvICogKCdiJ3wndCd8J24nfCdmJ3wncid8J3UnfCciJ3wiJyJ8J1xcJykgKiAvIHwgISgiXFwiIHwgIlwnIikpKiAiXCciPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFNUUklOR1J1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFNUUklOR1J1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBNTF9DT01NRU5UOgorCS8vCSIvICoiLT4iKiAvIjsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldE1MX0NPTU1FTlRSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRNTF9DT01NRU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFNMX0NPTU1FTlQ6CisJLy8JIi8vIiAhKCJcbiIgfCAiXHIiKSogKCJcciI/ICJcbiIpPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFNMX0NPTU1FTlRSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTTF9DT01NRU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFdTOgorCS8vCSgiICIgfCAiXHQiIHwgIlxyIiB8ICJcbiIpKzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFdTUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0V1NSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgQU5ZX09USEVSOgorCS8vCS47CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRBTllfT1RIRVJSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRBTllfT1RIRVJSdWxlKCk7CisJfSAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9BYnN0cmFjdFJlcG9ydERTTFZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC92YWxpZGF0aW9uL0Fic3RyYWN0UmVwb3J0RFNMVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5ZTFmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9BYnN0cmFjdFJlcG9ydERTTFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Db21wb3NlZENoZWNrczsKKworQENvbXBvc2VkQ2hlY2tzKHZhbGlkYXRvcnM9IHtvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWxpZGF0aW9uLk5hbWVzQXJlVW5pcXVlVmFsaWRhdG9yLmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFJlcG9ydERTTFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnZhbGlkYXRpb24uWGJhc2VXaXRoQW5ub3RhdGlvbnNWYWxpZGF0b3IgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3Q8RVBhY2thZ2U+IGdldEVQYWNrYWdlcygpIHsKKwkgICAgTGlzdDxFUGFja2FnZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFUGFja2FnZT4oc3VwZXIuZ2V0RVBhY2thZ2VzKCkpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy9kc2wvY29tbW9uL3R5cGVzL3YxIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L1hiYXNlL1hBbm5vdGF0aW9ucyIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC94YmFzZS9YYmFzZSIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC9jb21tb24vSmF2YVZNVHlwZXMiKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQveGJhc2UvWHR5cGUiKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0dlbmVyYXRlUmVwb3J0RFNMLm13ZTIgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvR2VuZXJhdGVSZXBvcnREU0wubXdlMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlM2FjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL0dlbmVyYXRlUmVwb3J0RFNMLm13ZTIKQEAgLTAsMCArMSwxOTMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKworbW9kdWxlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdlbmVyYXRlUmVwb3J0RFNMCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzLioKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuKgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci4qCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wubXdlLioKKwordmFyIHByb2plY3ROYW1lID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsIgordmFyIGdyYW1tYXJVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlLyR7cHJvamVjdE5hbWV9L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0wueHRleHQiCit2YXIgZmlsZUV4dGVuc2lvbnMgPSAicmVwb3J0IgordmFyIHJ1bnRpbWVQcm9qZWN0ID0gIi4uLyR7cHJvamVjdE5hbWV9IgordmFyIGdlbmVyYXRlWHRlbmRTdHViID0gdHJ1ZQordmFyIGVuY29kaW5nID0gIlVURi04IgorCitXb3JrZmxvdyB7CisJYmVhbiA9IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZS5YY29yZVN0YW5kYWxvbmVTZXR1cCA6IHhjb3JlIHt9CisJYmVhbiA9IG9yZy5lY2xpcHNlLnh0ZXh0Lm13ZS5SZWFkZXIgeworCQlyZWdpc3RlciA9IHhjb3JlCisJfQorCWJlYW4gPSBNYXZlblN0YW5kYWxvbmVTZXR1cCB7CisJCXNjYW5DbGFzc1BhdGggPSB0cnVlCisJCXBsYXRmb3JtVXJpID0gIiR7cnVudGltZVByb2plY3R9Ly4uIgorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvbW9kZWwvUmVwb3J0RFNMLnhjb3JlIgorCQlyZWdpc3RlckdlbmVyYXRlZEVQYWNrYWdlID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UiCisJCQorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC9tb2RlbC9EYXRhbWFydERTTC54Y29yZSIKKwkJcmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RFNMUGFja2FnZSIKKworCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hY3Rpb24vbW9kZWwvQWN0aW9uRFNMLnhjb3JlIgorCQlyZWdpc3RlckdlbmVyYXRlZEVQYWNrYWdlID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLkFjdGlvbkRTTFBhY2thZ2UiCisJCQorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0L21vZGVsL2VudGl0eS54Y29yZSIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAuZHNsLmVudGl0eS54dGV4dC9tb2RlbC9lbnRpdHkueGNvcmUiCisJCQorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC5kc2wuY29tbW9uLnh0ZXh0L21vZGVsL3R5cGVzLnhjb3JlIgorCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC5kc2wuY29tbW9uLnh0ZXh0L21vZGVsL3R5cGVzLnhjb3JlIgorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzL21vZGVsL0phdmFWTVR5cGVzLmdlbm1vZGVsIgorCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzL21vZGVsL0phdmFWTVR5cGVzLmVjb3JlIgorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQueGJhc2UvbW9kZWwvWGJhc2UuZ2VubW9kZWwiCisJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YdHlwZS5lY29yZSIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlL21vZGVsL1hiYXNlLmVjb3JlIgorCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQueGJhc2UvbW9kZWwvWEFubm90YXRpb25zLmVjb3JlIgorCX0KKworCWNvbXBvbmVudCA9IERpcmVjdG9yeUNsZWFuZXIgeworCQlkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0vc3JjLWdlbiIKKyAgICAJZXhjbHVkZSA9ICJSRUFETUUudHh0IgorCX0KKworCWNvbXBvbmVudCA9IERpcmVjdG9yeUNsZWFuZXIgeworCQlkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0udWkvc3JjLWdlbiIKKyAgICAJZXhjbHVkZSA9ICJSRUFETUUudHh0IgorCX0KKworCWNvbXBvbmVudCA9IERpcmVjdG9yeUNsZWFuZXIgeworCQlkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0udGVzdHMvc3JjLWdlbiIKKyAgICAJZXhjbHVkZSA9ICJSRUFETUUudHh0IgorCX0KKworCWNvbXBvbmVudCA9IEdlbmVyYXRvciB7CisJCXBhdGhSdFByb2plY3QgPSBydW50aW1lUHJvamVjdAorCQlwYXRoVWlQcm9qZWN0ID0gIiR7cnVudGltZVByb2plY3R9LnVpIgorCQlwYXRoVGVzdFByb2plY3QgPSAiJHtydW50aW1lUHJvamVjdH0udGVzdHMiCisJCXByb2plY3ROYW1lUnQgPSBwcm9qZWN0TmFtZQorCQlwcm9qZWN0TmFtZVVpID0gIiR7cHJvamVjdE5hbWV9LnVpIgorCQllbmNvZGluZyA9IGVuY29kaW5nCisJCWxhbmd1YWdlID0gYXV0by1pbmplY3QgeworCQkJdXJpID0gZ3JhbW1hclVSSQorCisJCQkvLyBKYXZhIEFQSSB0byBhY2Nlc3MgZ3JhbW1hciBlbGVtZW50cyAocmVxdWlyZWQgYnkgc2V2ZXJhbCBvdGhlciBmcmFnbWVudHMpCisJCQlmcmFnbWVudCA9IGdyYW1tYXJBY2Nlc3MuR3JhbW1hckFjY2Vzc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIGdlbmVyYXRlcyBKYXZhIEFQSSBmb3IgdGhlIGdlbmVyYXRlZCBFUGFja2FnZXMKKwkJCWZyYWdtZW50ID0gZWNvcmUuRU1GR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gdGhlIG9sZCBzZXJpYWxpemF0aW9uIGNvbXBvbmVudAorCQkJLy8gZnJhZ21lbnQgPSBwYXJzZVRyZWVDb25zdHJ1Y3Rvci5QYXJzZVRyZWVDb25zdHJ1Y3RvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9ICAgIAorCisJCQkvLyBzZXJpYWxpemVyIDIuMAorCQkJZnJhZ21lbnQgPSBzZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudCBhdXRvLWluamVjdCB7CisJCQkJZ2VuZXJhdGVTdHViID0gZmFsc2UKKwkJCX0KKworCQkJLy8gYSBjdXN0b20gUmVzb3VyY2VGYWN0b3J5IGZvciB1c2Ugd2l0aCBFTUYKKwkJCWZyYWdtZW50ID0gcmVzb3VyY2VGYWN0b3J5LlJlc291cmNlRmFjdG9yeUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIFRoZSBhbnRsciBwYXJzZXIgZ2VuZXJhdG9yIGZyYWdtZW50LgorCQkJZnJhZ21lbnQgPSBwYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHsKKwkJCS8vIEZPVU5EIGF0CisJCQkvLyBodHRwOi8vMjAwMDBmcmFtZXMuYmxvZ3Nwb3QuZGUvMjAxMC8wOS9kZWFsaW5nLXdpdGgtY291bGQtbm90LWV2ZW4tZG8tazEtZm9yLmh0bWwKKwkJCS8vIGh0dHA6Ly93d3cuYW50bHIzLm9yZy9waXBlcm1haWwvYW50bHItaW50ZXJlc3QvMjAwOS1Ob3ZlbWJlci8wMzY2MjkuaHRtbAorICAgIAkJCWFudGxyUGFyYW0gPSAiLVhjb252ZXJzaW9udGltZW91dCIgYW50bHJQYXJhbSA9ICIyMDAwMCIKKwkJCS8vIENhbiBpbmNyZWFzZSB0aGlzIHRvIHVzZSBpZiBzdGF0ZW1lbnRzIG1vcmUgb2Z0ZW4uLi4uCisJCQkvLyAgLVhtYXhpbmxpbmVkZmFzdGF0ZXMgbSAgbWF4IERGQSBzdGF0ZXMgYmVmb3JlIHRhYmxlIHVzZWQgcmF0aGVyIHRoYW4gaW5saW5pbmcgICAgICBbMTBdCisgICAgCQkJYW50bHJQYXJhbSA9ICItWG1heGlubGluZWRmYXN0YXRlcyIgYW50bHJQYXJhbSA9ICIyMDAiCisJCQkvLyBJbmNyZWFzZSB0aGlzIHRvIHNheSAzMDAwLi4uCisJCQkvLyAgLVhtYXhzd2l0Y2hjYXNlbGFiZWxzIG0gZG9uJ3QgZ2VuZXJhdGUgc3dpdGNoKCkgc3RhdGVtZW50cyBmb3IgZGZhcyBiaWdnZXIgIHRoYW4gbSBbMzAwXQorICAgIAkJCWFudGxyUGFyYW0gPSAiLVhtYXhzd2l0Y2hjYXNlbGFiZWxzIiBhbnRsclBhcmFtID0gIjYwMDAiCisJCQkvLyBBbmQgcmVkdWNlIHRoaXMgdG8gc2F5IDEuLi4uCisJCQkvLyAgLVhtaW5zd2l0Y2hhbHRzIG0gICAgICAgZG9uJ3QgZ2VuZXJhdGUgc3dpdGNoKCkgc3RhdGVtZW50cyBmb3IgZGZhcyBzbWFsbGVyIHRoYW4gbSBbM10JCQkgICAgCQkJCisgICAgCQkJYW50bHJQYXJhbSA9ICItWG1pbnN3aXRjaGFsdHMiIGFudGxyUGFyYW0gPSAiMSIKKwkJCX0KKworCQkJLy8gWHRlbmQtYmFzZWQgQVBJIGZvciB2YWxpZGF0aW9uCisJCQlmcmFnbWVudCA9IHZhbGlkYXRpb24uVmFsaWRhdG9yRnJhZ21lbnQgYXV0by1pbmplY3QgeworCQkJLy8gICAgY29tcG9zZWRDaGVjayA9ICJvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkltcG9ydFVyaVZhbGlkYXRvciIKKwkJCS8vICAgIGNvbXBvc2VkQ2hlY2sgPSAib3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5OYW1lc0FyZVVuaXF1ZVZhbGlkYXRvciIKKyAgICAJCSAgICBjb21wb3NlZENoZWNrID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnZhbGlkYXRpb24uTmFtZXNBcmVVbmlxdWVWYWxpZGF0b3IiCisJCQl9CisKKwkJCS8vIG9sZCBzY29waW5nIGFuZCBleHBvcnRpbmcgQVBJCisJCQkvLyBmcmFnbWVudCA9IHNjb3BpbmcuSW1wb3J0VVJJU2NvcGluZ0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJCQkvLyBmcmFnbWVudCA9IGV4cG9ydGluZy5TaW1wbGVOYW1lc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIHNjb3BpbmcgYW5kIGV4cG9ydGluZyBBUEkKKwkJCWZyYWdtZW50ID0gc2NvcGluZy5JbXBvcnROYW1lc3BhY2VzU2NvcGluZ0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJCQlmcmFnbWVudCA9IGV4cG9ydGluZy5RdWFsaWZpZWROYW1lc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJCQlmcmFnbWVudCA9IGJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gZ2VuZXJhdG9yIEFQSQorCQkJZnJhZ21lbnQgPSBnZW5lcmF0b3IuR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gZm9ybWF0dGVyIEFQSQorCQkJZnJhZ21lbnQgPSBmb3JtYXR0aW5nLkZvcm1hdHRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIGxhYmVsaW5nIEFQSQorCQkJZnJhZ21lbnQgPSBsYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gb3V0bGluZSBBUEkKKwkJCWZyYWdtZW50ID0gb3V0bGluZS5PdXRsaW5lVHJlZVByb3ZpZGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkJCWZyYWdtZW50ID0gb3V0bGluZS5RdWlja091dGxpbmVGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCisJCQkvLyBxdWlja2ZpeCBBUEkKKwkJCWZyYWdtZW50ID0gcXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIGNvbnRlbnQgYXNzaXN0IEFQSQorCQkJZnJhZ21lbnQgPSBjb250ZW50QXNzaXN0LkNvbnRlbnRBc3Npc3RGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCisJCQkvLyBnZW5lcmF0ZXMgYSBtb3JlIGxpZ2h0d2VpZ2h0IEFudGxyIHBhcnNlciBhbmQgbGV4ZXIgdGFpbG9yZWQgZm9yIGNvbnRlbnQgYXNzaXN0CisJCQlmcmFnbWVudCA9IHBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7CisJCQkJLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vb3NicC9vc2JwLWRvYy9ibG9iL21hc3Rlci9vcmcuZWNsaXBzZS5vc2JwLmRvYy5kc2wvc3JjL29yZy5lY2xpcHNlLm9zYnAvZG9jL2RzbC9ncmFtbWFyL0dlbmVyYXRlT1NCUERvY0dyYW1tYXIubXdlMgorICAgIAkJICAJb3B0aW9ucyA9IHsKKyAgICAJCS8vICAgICAgYmFja3RyYWNrID0gdHJ1ZQorICAgIAkJCQljbGFzc1NwbGl0dGluZz10cnVlCisgICAgCQkJCWZpZWxkc1BlckNsYXNzPSIxMDAiCisgICAgCQkJCW1ldGhvZHNQZXJDbGFzcz0iMTAwIgorICAgIAkJICAJfQorICAgIAkJfQorCisJCQkvLyBnZW5lcmF0ZXMganVuaXQgdGVzdCBzdXBwb3J0IGNsYXNzZXMgaW50byBHZW5lcmF0b3IjcGF0aFRlc3RQcm9qZWN0CisJCQlmcmFnbWVudCA9IGp1bml0Lkp1bml0NEZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIHByb2plY3Qgd2l6YXJkIChvcHRpb25hbCkKKy8vCQkJZnJhZ21lbnQgPSBwcm9qZWN0V2l6YXJkLlNpbXBsZVByb2plY3RXaXphcmRGcmFnbWVudCBhdXRvLWluamVjdCB7CisvLwkJCQlnZW5lcmF0b3JQcm9qZWN0TmFtZSA9ICIke3Byb2plY3ROYW1lfSIKKy8vCQkJCWZpbGVFeHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9ucworLy8JCQl9CisKKwkJCS8vIHJlbmFtZSByZWZhY3RvcmluZworCQkJZnJhZ21lbnQgPSByZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBiaW5kaW5ncyBmb3IgamF2YSB0eXBlcyBpbnRlZ3JhdGlvbgorCQkJZnJhZ21lbnQgPSB0eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIGdlbmVyYXRlcyB0aGUgcmVxdWlyZWQgYmluZGluZ3Mgb25seSBpZiB0aGUgZ3JhbW1hciBpbmhlcml0cyBmcm9tIFhiYXNlCisJCQlmcmFnbWVudCA9IHhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKworCQkJLy8gcHJvdmlkZXMgYSBwcmVmZXJlbmNlIHBhZ2UgZm9yIHRlbXBsYXRlIHByb3Bvc2FscworCQkJZnJhZ21lbnQgPSB0ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisKKwkJCS8vIHByb3ZpZGVzIGEgY29tcGFyZSB2aWV3CisJCQlmcmFnbWVudCA9IGNvbXBhcmUuQ29tcGFyZUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHBhcnNlIGdyYW1tYXIgYW5kIGdlbmVyYXRlIGkxOG4gZ3JhbW1hcgorICAgICAgICAgICAgZnJhZ21lbnQgPSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLmdlbmVyYXRvci5CYXNpY0RzbEdyYW1tYXJJMThuR2VuZXJhdG9yIGF1dG8taW5qZWN0IHt9CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0wueHRleHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMLnh0ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjFjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMLnh0ZXh0CkBAIC0wLDAgKzEsNDQ0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK2dyYW1tYXIgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RFNMIHdpdGggb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuWGJhc2VXaXRoQW5ub3RhdGlvbnMKKworaW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMIgorCitpbXBvcnQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQveGJhc2UvWGJhc2UiIGFzIHhiYXNlCitpbXBvcnQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIGFzIGVjb3JlCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL2RzbC9jb21tb24vdHlwZXMvdjEiYXMgdHlwZXMKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcvZHNsL2VudGl0eS92MSIgYXMgZW50aXR5CisvL2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5kZS94dGV4dC9jaGFydC9DaGFydERTTCIgYXMgY2hhcnQKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvZGF0YW1hcnRkc2wvRGF0YW1hcnREU0wiIGFzIGRhdGFtYXJ0CisvL2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5kZS94dGV4dC90YWJsZS9UYWJsZURTTCIgYXMgdGFibGUKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYWN0aW9uL0FjdGlvbkRTTCIgYXMgYWN0aW9uCisKK1JlcG9ydE1vZGVsOgorCXBja2crPVJlcG9ydFBhY2thZ2UqOworCitSZXBvcnRQYWNrYWdlOgorCXtSZXBvcnRQYWNrYWdlfSAncGFja2FnZScgbmFtZT1RdWFsaWZpZWROYW1lICd7JworCQkoaW1wb3J0cys9UmVwb3J0SW1wb3J0KSoKKwkJKCdsYXlvdXQtZGF0YScgJ3snCisgICAgCSAJKCdleHRlcm5hbENzc1VSSScgZXh0ZXJuYWxDc3NVUkk9U1RSSU5HICgnZnJvbSBidW5kbGUnIGV4dGVybmFsQ3NzVVJJQnVuZGxlPVNUUklORyk/KT8KKyAgICAJIAlwYWdldGVtcGxhdGVzPVBhZ2VUZW1wbGF0ZXMKKyAgICAJIAlmb3JtYXR0ZXJzPVNvbWVGb3JtYXRzCisgICAgCSAJY29sb3JzPUNvbG9ycworICAgIAkgCWZvbnRzPUZvbnRzCisgICAgCSAJbWVkaWFzPU1lZGlhcworICAgIAkgCXN0eWxlcz1TdHlsZXMKKwkgCSd9Jyk/CisJCShyZXBvcnRzKz1SZXBvcnQpKgorCSd9JzsKKworUGFnZVRlbXBsYXRlczoKKwl7UGFnZVRlbXBsYXRlc30gKHBhZ2V0ZW1wbGF0ZXMrPVBhZ2VUZW1wbGF0ZSkqOworCQorU29tZUZvcm1hdHM6CisJe1NvbWVGb3JtYXRzfSAnZm9ybWF0dGVycycgJ3snCisJIAkoZm9ybWF0dGVycys9U29tZUZvcm1hdCkqCisJJ30nOworCitDb2xvcnM6CisgCXtDb2xvcnN9ICdjb2xvcnMnICd7JworCSAJKGNvbG9ycys9Q29sb3IpKgorCSd9JzsKKworRm9udHM6CisgCXtGb250c30gJ2ZvbnRzJyAneycKKyAJCShmb250cys9Rm9udCkqCisJJ30nOworCQorTWVkaWFzOgorIAl7TWVkaWFzfSAnbWVkaWFzJyAneycKKwkgCShtZWRpYXMrPU1lZGlhKSoKKwknfSc7CisKK01lZGlhOgorCSdtZWRpYScgbmFtZT1JRDsKKwkKK1N0eWxlczoKKyAJe1N0eWxlc30gJ3N0eWxlcycgJ3snCisJIAkoc3R5bGVzKz1TdHlsZSkqCisJJ30nOworCitQYWdlVGVtcGxhdGU6CisJJ3BhZ2V0ZW1wbGF0ZScgbmFtZT1JRCAneycKKwkJJ3R5cGUnIHNpemU9UGFnZVNpemVFbnVtCisJCSdvcmllbnRhdGlvbicgb3JpZW50YXRpb249T3JpZW50YXRpb25FbnVtCisJCSd0b3BtYXJnaW4nIHRvcE1hcmdpblZhbHVlPVVuc2lnbmVkTnVtYmVyIHRvcE1hcmdpblVuaXQ9VW5pdEVudW0KKwkJJ2xlZnRtYXJnaW4nIGxlZnRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciBsZWZ0TWFyZ2luVW5pdD1Vbml0RW51bQorCQknYm90dG9tbWFyZ2luJyBib3R0b21NYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciBib3R0b21NYXJnaW5Vbml0PVVuaXRFbnVtCisJCSdyaWdodG1hcmdpbicgcmlnaHRNYXJnaW5WYWx1ZT1VbnNpZ25lZE51bWJlciByaWdodE1hcmdpblVuaXQ9VW5pdEVudW0KKwkgICAgKGhlYWRlcj1QYWdlSGVhZGVyKT8KKwkgICAgKGZvb3Rlcj1QYWdlRm9vdGVyKT8KKwknfSc7CisKK1Vuc2lnbmVkTnVtYmVyIHJldHVybnMgZWNvcmU6OkVEb3VibGU6CisJTnVtYmVyOworCitlbnVtIFVuaXRFbnVtOgorCU1NPSdtbScgfCBDTT0nY20nIHwgUFQ9J3B0JyB8IElOPSdpbmNoJyB8IFBDPSdwYycgfCBFTT0nZW0nIHwgRVg9J2V4JyB8IFBYPSdweCcgfCBQRVJDRU5UQUdFPSclJzsKKworZW51bSBQYWdlU2l6ZUVudW06CisJQTQ9J2E0JyB8IEEzPSdhMycgfCBBNT0nYTUnIHwgVVNfTEVUVEVSID0gInVzLWxldHRlciIgfCBVU19MRUdBTCA9ICJ1cy1sZWdhbCIgfCBVU19MRURHRVIgPSAidXMtbGVkZ2VyIiB8IFVTX1NVUEVSX0IgPSAidXMtc3VwZXItYiI7CisKK2VudW0gT3JpZW50YXRpb25FbnVtOgorCVBPUlRSQUlUPSdwb3J0cmFpdCcgfCBMQU5EU0NBUEU9J2xhbmRzY2FwZSc7CisKK0NvbG9yOgorCSdjb2xvcicgbmFtZT1JRCAoY29sb3I9U1RSSU5HIHwgJ2RhcmtlbnMnIGJhc2Vjb2xvcj1bQ29sb3JdICdieS1wZXJjZW50JyBkYXJrZW5zYnk9SU5UIHwgJ2xpZ2h0ZW5zJyBiYXNlY29sb3I9W0NvbG9yXSAnYnktcGVyY2VudCcgbGlnaHRlbnNieT1JTlQgfCAndHJhbnNmb3JtcycgYmFzZWNvbG9yPVtDb2xvcl0gJ2J5LXBlcmNlbnQnIHRyYW5zZm9ybXNieT1JTlQgJ3Rvd2FyZHMnIHRhcmdldGNvbG9yPVtDb2xvcl0pOworCQorRm9udDoKKwknZm9udCcgbmFtZT1JRCAneycgKCdleHRlbmRzJyBleHRlbmRzPVtGb250XSk/ICgnZmFtaWx5JyBmYW1pbHk9Rm9udEZhbWlseSk/ICYgKHN0eWxlPUZvbnRTdHlsZUVudW0pPyAmIChib2xkPz0nYm9sZCcpPyAmICgnc2l6ZScgc2l6ZXZhbHVlPVVuc2lnbmVkTnVtYmVyIHNpemV1bml0PVVuaXRFbnVtKT8gJ30nOworCitlbnVtIEZvbnRTdHlsZUVudW06CisJTk9STUFMPSdub3JtYWwnIHwgSVRBTElDPSdpdGFsaWMnIHwgT0JMSVFVRT0nb2JsaXF1ZSc7CisKK0ZvbnRGYW1pbHk6CisJQnVpbGRJbkZvbnRGYW1pbHkgfCBDdXN0b21Gb250RmFtaWx5OworCitCdWlsZEluRm9udEZhbWlseToKKwljdXN0b209QnVpbGRJbkZvbnRGYW1pbHlFbnVtOworCitlbnVtIEJ1aWxkSW5Gb250RmFtaWx5RW51bToKKwlNT05PU1BBQ0U9J21vbm9zcGFjZScgfCBTQU5TX1NFUklGPSdzYW5zLXNlcmlmJyB8IFNFUklGPSdzZXJpZic7CisKK0N1c3RvbUZvbnRGYW1pbHk6CisJY3VzdG9tPVNUUklORzsKKworQm9yZGVyU3R5bGU6CisJdHlwZT1Cb3JkZXJUeXBlRW51bQorCXdpZHRodmFsdWU9VW5zaWduZWROdW1iZXIgd2lkdGh1bml0PVVuaXRFbnVtCisJY29sb3I9W0NvbG9yXQorCTsKKworU3R5bGU6CisJJ3N0eWxlJyBuYW1lPUlEICd7JworCSgnZXh0ZW5kcycgZXh0ZW5kcz1bU3R5bGVdKT8KKwkoCisJKCdmb3JtYXR0ZXInIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmCisJKCdmb250JyBmb250PVtGb250XSk/ICYKKwkoJ2JhY2tncm91bmRjb2xvcicgYmFja2dyb3VuZGNvbG9yPVtDb2xvcl0gKCdhbHRlcm5hdGUnIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU9W0NvbG9yXSk/KT8gJgorCSgKKwkndGV4dGNvbG9yJyB0ZXh0Y29sb3I9W0NvbG9yXSk/ICYKKwkoJ3RleHRhbGlnbicgdGV4dGFsaWduPVRleHRBbGlnbkVudW0pPyAmCisJKCdib3JkZXItdG9wJyBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmCisJKCdib3JkZXItYm90dG9tJyBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmCisJKCdib3JkZXItbGVmdCcgYm9yZGVyTGVmdD1Cb3JkZXJTdHlsZSk/ICYKKwkoJ2JvcmRlci1yaWdodCcgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPyAmCisJKCdwYWRkaW5nLXRvcCcgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8gJgorCSgncGFkZGluZy1ib3R0b20nIHBhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nQm90dG9tVW5pdD1Vbml0RW51bSk/ICYKKwkoJ3BhZGRpbmctbGVmdCcgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPyAmCisJKCdwYWRkaW5nLXJpZ2h0JyBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8gJgorCSgnbWFyZ2luLXRvcCcgbWFyZ2luVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYKKwkoJ21hcmdpbi1ib3R0b20nIG1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmCisJKCdtYXJnaW4tbGVmdCcgbWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJgorCSgnbWFyZ2luLXJpZ2h0JyBtYXJnaW5SaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblJpZ2h0VW5pdD1Vbml0RW51bSk/CisJKQorCShtZWRpYXN0eWxlcys9TWVkaWFTdHlsZSkqCisJJ30nOworCitNZWRpYVN0eWxlOgorCSdtZWRpYScgbWVkaWE9W01lZGlhXSAneycKKwkoCisJKCdmb3JtYXR0ZXInIGZvcm1hdD1bU29tZUZvcm1hdF0pPyAmCisJKCdmb250JyBmb250PVtGb250XSk/ICYKKwkoJ2JhY2tncm91bmRjb2xvcicgYmFja2dyb3VuZGNvbG9yPVtDb2xvcl0gKCdhbHRlcm5hdGUnIGJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGU9W0NvbG9yXSk/KT8gJgorCSgKKwkndGV4dGNvbG9yJyB0ZXh0Y29sb3I9W0NvbG9yXSk/ICYKKwkoJ3RleHRhbGlnbicgdGV4dGFsaWduPVRleHRBbGlnbkVudW0pPyAmCisJKCdib3JkZXItdG9wJyBib3JkZXJUb3A9Qm9yZGVyU3R5bGUpPyAmCisJKCdib3JkZXItYm90dG9tJyBib3JkZXJCb3R0b209Qm9yZGVyU3R5bGUpPyAmCisJKCdib3JkZXItbGVmdCcgYm9yZGVyTGVmdD1Cb3JkZXJTdHlsZSk/ICYKKwkoJ2JvcmRlci1yaWdodCcgYm9yZGVyUmlnaHQ9Qm9yZGVyU3R5bGUpPyAmCisJKCdwYWRkaW5nLXRvcCcgcGFkZGluZ1RvcFZhbHVlPVVuc2lnbmVkTnVtYmVyIHBhZGRpbmdUb3BVbml0PVVuaXRFbnVtKT8gJgorCSgncGFkZGluZy1ib3R0b20nIHBhZGRpbmdCb3R0b21WYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nQm90dG9tVW5pdD1Vbml0RW51bSk/ICYKKwkoJ3BhZGRpbmctbGVmdCcgcGFkZGluZ0xlZnRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nTGVmdFVuaXQ9VW5pdEVudW0pPyAmCisJKCdwYWRkaW5nLXJpZ2h0JyBwYWRkaW5nUmlnaHRWYWx1ZT1VbnNpZ25lZE51bWJlciBwYWRkaW5nUmlnaHRVbml0PVVuaXRFbnVtKT8gJgorCSgnbWFyZ2luLXRvcCcgbWFyZ2luVG9wVmFsdWU9VW5zaWduZWROdW1iZXIgbWFyZ2luVG9wVW5pdD1Vbml0RW51bSk/ICYKKwkoJ21hcmdpbi1ib3R0b20nIG1hcmdpbkJvdHRvbVZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkJvdHRvbVVuaXQ9VW5pdEVudW0pPyAmCisJKCdtYXJnaW4tbGVmdCcgbWFyZ2luTGVmdFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpbkxlZnRVbml0PVVuaXRFbnVtKT8gJgorCSgnbWFyZ2luLXJpZ2h0JyBtYXJnaW5SaWdodFZhbHVlPVVuc2lnbmVkTnVtYmVyIG1hcmdpblJpZ2h0VW5pdD1Vbml0RW51bSk/CisJKQorCSd9JzsKKworZW51bSBUZXh0QWxpZ25FbnVtOgorCUxFRlQ9J2xlZnQnIHwgQ0VOVEVSPSdjZW50ZXInIHwgUklHSFQ9J3JpZ2h0JzsKKworU29tZUZvcm1hdDoKKwlVb21vRm9ybWF0IHwgTnVtYmVyRm9ybWF0IHwgQ3VycmVuY3lGb3JtYXQgfCBEYXRlRm9ybWF0IHwgRGF0ZVRpbWVGb3JtYXQgfCBUaW1lRm9ybWF0OworCitVb21vRm9ybWF0OgorCSd1b21vJyBuYW1lPUlEICd7JyAndWknIHVpX3BhdHRlcm49U1RSSU5HICdyZXBvcnQnIHJlcG9ydF9wYXR0ZXJuPVNUUklORyAndGV4dGFsaWduJyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAnfSc7CisKK051bWJlckZvcm1hdDoKKwknbnVtYmVyJyBuYW1lPUlEICd7JyAndWknIHVpX3BhdHRlcm49U1RSSU5HICdyZXBvcnQnIHJlcG9ydF9jYXRlZ29yeT1OdW1iZXJGb3JtYXRDYXRlZ29yeUVudW0gcmVwb3J0X3BhdHRlcm49U1RSSU5HICd0ZXh0YWxpZ24nIHRleHRhbGlnbj1UZXh0QWxpZ25FbnVtICd9JzsKKworZW51bSBOdW1iZXJGb3JtYXRDYXRlZ29yeUVudW06CisJVU5GT1JNQVRURUQ9J3VuZm9ybWF0dGVkJyB8IEdFTkVSQUxfTlVNQkVSPSdnZW5lcmFsLW51bWJlcicgfCBGSVhFRD0nZml4ZWQnIHwgUEVSQ0VOVD0ncGVyY2VudCcgfCBTQ0lFTlRJRklDPSdzY2llbnRpZmljJyB8IENVU1RPTT0nY3VzdG9tJzsKKworQ3VycmVuY3lGb3JtYXQ6CisJJ2N1cnJlbmN5JyBuYW1lPUlEICd7JyAndWknIHVpX3BhdHRlcm49U1RSSU5HICdyZXBvcnQnIHJlcG9ydF9jYXRlZ29yeT1DdXJyZW5jeUZvcm1hdENhdGVnb3J5RW51bSByZXBvcnRfcGF0dGVybj1TVFJJTkcgJ3RleHRhbGlnbicgdGV4dGFsaWduPVRleHRBbGlnbkVudW0gJ30nOworCitlbnVtIEN1cnJlbmN5Rm9ybWF0Q2F0ZWdvcnlFbnVtOgorCVVORk9STUFUVEVEPSd1bmZvcm1hdHRlZCcgfCBDVVJSRU5DWT0nY3VycmVuY3knIHwgQ1VTVE9NPSdjdXN0b20nOworCitEYXRlRm9ybWF0OgorCSdkYXRlJyBuYW1lPUlEICd7JyAndWknIHVpX3BhdHRlcm49U1RSSU5HICdyZXBvcnQnIHJlcG9ydF9jYXRlZ29yeT1EYXRlRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyAndGV4dGFsaWduJyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAnfSc7CisKK2VudW0gRGF0ZUZvcm1hdENhdGVnb3J5RW51bToKKwlDVVNUT009J2N1c3RvbSc7CisKK0RhdGVUaW1lRm9ybWF0OgorCSdkYXRlK3RpbWUnIG5hbWU9SUQgJ3snICd1aScgdWlfcGF0dGVybj1TVFJJTkcgJ3JlcG9ydCcgcmVwb3J0X2NhdGVnb3J5PURhdGVUaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyAndGV4dGFsaWduJyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAnfSc7CisKK2VudW0gRGF0ZVRpbWVGb3JtYXRDYXRlZ29yeUVudW06CisJQ1VTVE9NPSdjdXN0b20nOworCitUaW1lRm9ybWF0OgorCSd0aW1lJyBuYW1lPUlEICd7JyAndWknIHVpX3BhdHRlcm49U1RSSU5HICdyZXBvcnQnIHJlcG9ydF9jYXRlZ29yeT1UaW1lRm9ybWF0Q2F0ZWdvcnlFbnVtIHJlcG9ydF9wYXR0ZXJuPVNUUklORyAndGV4dGFsaWduJyB0ZXh0YWxpZ249VGV4dEFsaWduRW51bSAnfSc7CisKK2VudW0gVGltZUZvcm1hdENhdGVnb3J5RW51bToKKwlDVVNUT009J2N1c3RvbSc7CisKK1JlcG9ydDoKKwkncmVwb3J0JyBuYW1lPUlEIAorCQkoZGVzY3JpcHRpb24/PSdkZXNjcmliZWQgYnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gCisJCSgndG9vbGJhcicgdG9vbGJhcj1bYWN0aW9uOjpBY3Rpb25Ub29sYmFyXSk/IAorCSd7JworCSAnZGF0YW1hcnQnIGRhdGFtYXJ0UmVmPVtkYXRhbWFydDo6RGF0YW1hcnREZWZpbml0aW9uXQorCSAncmVuZGVyaW5nJyByZW5kZXJpbmc9UmVuZGVyaW5nRW51bQorCSAoJ2V4dGVybmFsQ3NzVVJJJyBleHRlcm5hbENzc1VSST1TVFJJTkcgKCdmcm9tIGJ1bmRsZScgZXh0ZXJuYWxDc3NVUklCdW5kbGU9U1RSSU5HKT8pPworCSAncGFnZXRlbXBsYXRlJyBwYWdlVGVtcGxhdGU9W1BhZ2VUZW1wbGF0ZV0KKwkgJ21lZGlhJyBtZWRpYT1bTWVkaWFdCisJIGRlc2lnbj1SZXBvcnREZXNpZ24KKwknfSc7CisKK2VudW0gUmVuZGVyaW5nRW51bToKKwlIVE1MPSdodG1sJyB8IFBERj0ncGRmJzsKKwkKK1JlcG9ydERlc2lnbjoKKwlSZXBvcnREZXNpZ25GaWxlIHwgUmVwb3J0RGVzaWduVGVtcGxhdGU7CisKK1JlcG9ydERlc2lnbkZpbGU6CisJJ2ZpbGUnIG5hbWU9U1RSSU5HOworCitSZXBvcnREZXNpZ25UZW1wbGF0ZToKKwkndGVtcGxhdGUnICd7JworCSgnZGVzY3JpYmVkIGJ5JyBkZXNjcmlwdGlvbj1TVFJJTkcpPworICAgIChoZWFkZXI9UGFnZUhlYWRlcik/CisgICAgZGV0YWlsPVBhZ2VEZXRhaWwKKyAgICAoZm9vdGVyPVBhZ2VGb290ZXIpPworCSd9JzsKKworQ29udGFpbmVyOgorICAgIFBhZ2VIZWFkZXIgfCBQYWdlRGV0YWlsIHwgUGFnZUZvb3RlciB8IEdyaWRDZWxsOworCitQYWdlSGVhZGVyOgorCXtQYWdlSGVhZGVyfSAnaGVhZGVyJyAneycKKwkJKHNob3dPbkZpcnN0Pz0nc2hvd09uRmlyc3QnKT8KKwkJJ2hlaWdodCcgaGVpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgaGVpZ2h0VW5pdD1Vbml0RW51bQorCQllbGVtZW50cys9RWxlbWVudAorCSd9JzsKKworUGFnZURldGFpbDoKKwl7UGFnZURldGFpbH0gJ2RldGFpbCcgJ3snIGVsZW1lbnRzKz1FbGVtZW50KiAnfSc7CisKK1BhZ2VGb290ZXI6CisJe1BhZ2VGb290ZXJ9ICdmb290ZXInICd7JworCQkoc2hvd09uTGFzdD89J3Nob3dPbkxhc3QnKT8KKwkJJ2hlaWdodCcgaGVpZ2h0VmFsdWU9VW5zaWduZWROdW1iZXIgaGVpZ2h0VW5pdD1Vbml0RW51bQorCQllbGVtZW50cys9RWxlbWVudAorCSd9JzsKKworRWxlbWVudDoKKwlUaXRsZSB8IFN1YlRpdGxlIHwgU3ViU3ViVGl0bGUgfCBMYWJlbCB8IFRleHQgfCBBdXRvVGV4dCB8IEltYWdlIHwgRGF0YW1hcnRUYWJsZSB8IERhdGFtYXJ0VGFibGVQcm9wZXJ0eSB8IEdyaWQvKiB8IFRhYmxlRHNsIHwgQ2hhcnREc2wqLzsKKworR3JpZDoKKwl7R3JpZH0gJ2dyaWQnICgnYXMnIG5hbWU9SUQpPyAneycgcm93cys9R3JpZFJvdyogJ30nOworCitHcmlkUm93OgorCXtHcmlkUm93fSAncm93JyAoJ2FzJyBuYW1lPUlEKT8gKCdzdHlsZScgc3R5bGU9W1N0eWxlXSk/ICd7JyBjZWxscys9R3JpZENlbGwqICd9JzsKKworR3JpZENlbGw6CisJe0dyaWRDZWxsfSAnY2VsbCcgKCdhcycgbmFtZT1JRCk/ICgnY29sdW1uc3BhbicgY29sdW1uc3Bhbj1JTlQpPyAneycgZWxlbWVudHMrPUVsZW1lbnQqICd9JzsKKworRGF0YW1hcnRUYWJsZToKKwkndGFibGUnIC8qZGF0YW1hcnRSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dICgnYXMnIG5hbWU9SUQpPyovICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPyAneycKKwkoZGV0YWlsaGVhZGVyPz0nZGV0YWlsaGVhZGVyJyAoJ3N0eWxlJyBoZWFkZXJzdHlsZT1bU3R5bGVdKT8pPworCShkZXRhaWxmb290ZXI/PSdkZXRhaWxmb290ZXInICgnc3R5bGUnIGZvb3RlcnN0eWxlPVtTdHlsZV0pPyk/CisJKGdyb3Vwcys9RGF0YW1hcnRUYWJsZUdyb3VwKSoKKwlkZXRhaWw9RGF0YW1hcnRUYWJsZURldGFpbAorCSd9JzsKKworRGF0YW1hcnRUYWJsZUdyb3VwOgorCSdncm91cCcgbmFtZT1JRCAnYnknIGdyb3VwaW5nUmVmPVtkYXRhbWFydDo6RGF0YW1hcnRQcm9wZXJ0eV0gJ3snCisJKGhlYWRlcj1EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIpPworCShkZXRhaWxoZWFkZXI/PSdkZXRhaWxoZWFkZXInICgnc3R5bGUnIGhlYWRlcnN0eWxlPVtTdHlsZV0pPyk/CisJKGRldGFpbGZvb3Rlcj89J2RldGFpbGZvb3RlcicgKCdzdHlsZScgZm9vdGVyc3R5bGU9W1N0eWxlXSk/KT8KKwkoZm9vdGVyPURhdGFtYXJ0VGFibGVHcm91cEZvb3Rlcik/CisJJ30nOworCitEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI6CisJe0RhdGFtYXJ0VGFibGVHcm91cEhlYWRlcn0gJ2hlYWRlcicgKCdzdHlsZScgc3R5bGU9W1N0eWxlXSk/ICd7JyByb3dzKz1HcmlkUm93KiAnfSc7CisKK0RhdGFtYXJ0VGFibGVHcm91cEZvb3RlcjoKKwl7RGF0YW1hcnRUYWJsZUdyb3VwRm9vdGVyfSAnZm9vdGVyJyAoJ3N0eWxlJyBzdHlsZT1bU3R5bGVdKT8gJ3snIHJvd3MrPUdyaWRSb3cqICd9JzsKKworRGF0YW1hcnRUYWJsZURldGFpbDoKKwl7RGF0YW1hcnRUYWJsZURldGFpbH0gJ2RldGFpbHMnICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPyAoJ2FsbCcgfCAoJ3snIGNvbHVtbkZvcm1hdHRlcnMrPURhdGFtYXJ0VGFibGVQcm9wZXJ0eSogJ30nKSk7CisKKy8qICEhISBjb3B5IGZyb20gdGFibGVkc2wgLi4uICovCitEYXRhbWFydFRhYmxlUHJvcGVydHk6CisJY29sdW1uPVRhYmxlVmFsdWVFbGVtZW50CisJCSgKKwkJKCdzdHlsZScgc3R5bGU9W1N0eWxlXSk/ICYgCisJCShoYXNJbWFnZT89J2ltYWdlJyBpbWFnZT1UYWJsZUltYWdlKT8gJgorCQkoJ2ludGVydmFscycgKGhpZGVMYWJlbEludGVydmFsPz0naGlkZWxhYmVsJyk/ICd7JyAoaW50ZXJ2YWxzKz1UYWJsZUludGVydmFsKSogJ30nKT8gJiAKKwkJKCdsb29rdXBzJyAoaGlkZUxhYmVsTG9va3VwPz0naGlkZWxhYmVsJyk/ICd7JyAobG9va3Vwcys9VGFibGVMb29rdXApKiAnfScpPworCQkpCis7CQkKKworZW51bSBQdXJlQWdncmVnYXRpb25UeXBlRW51bToKKwlDT1VOVD0nY291bnQnIHwgUlVOTklOR0NPVU5UPSdydW5uaW5nLWNvdW50JzsKKworZW51bSBVbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW06CisJU1VNPSdzdW0nIHwgQVZFPSdhdmVyYWdlJyB8IE1JTj0nbWluaW11bScgfCBNQVg9J21heGltdW0nIHwgUlVOTklOR1NVTT0ncnVubmluZy1zdW0nOworCitlbnVtIEJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW06CisJRElWPSdkaXZpZGUnOworCitlbnVtIE11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bToKKwlDT05DQVQ9J2NvbmNhdCc7CisKK1RhYmxlRm9ybWF0dGVyOgorCXtUYWJsZUZvcm1hdHRlcn0gJ2Zvcm1hdHRlcicgZm9ybWF0PVNUUklORzsKKwkKK1RhYmxlSW1hZ2U6CisJe1RhYmxlSW1hZ2V9ICdwYXRoJyBpbWFnZVBhdGhQYXR0ZXJuPVNUUklORyAoKGhhc1BhcmFtZXRlcj89J2R5bmFtaWMnKT8gJiAoaGlkZUltYWdlTGFiZWw/PSdoaWRlbGFiZWwnKT8gJiAocmVzaXplPz0ncmVzaXplJyByZXNpemVTdHJpbmc9U1RSSU5HKT8pOworCQorVGFibGVWYWx1ZUVsZW1lbnQ6CisJVGFibGVQcm9wZXJ0eXxUYWJsZUFnZ3JlZ2F0aW9uOworCS8qfFRhYmxlQmluYXJ5QWdncmVnYXRpb258VGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKi8KKwkvKlRhYmxlTWVhc3VyZXxUYWJsZURlcml2ZWR8VGFibGVIaWVyYXJjaHl8VGFibGVPcmRpbmFsfFRhYmxlQ29sdW1ufFRhYmxlVGFzayovCisKK1RhYmxlUHJvcGVydHk6CisJJ3Byb3BlcnR5JyB2YWx1ZVJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldOworCitUYWJsZUFnZ3JlZ2F0aW9uOgorCSdhZ2dyZWdhdGUnIGFnZ3JlZ2F0aW9uPVRhYmxlQmFzZUFnZ3JlZ2F0aW9uICgoJ29uLWdyb3VwJyBvbkdyb3VwPVtEYXRhbWFydFRhYmxlR3JvdXBdKT8gJiAoJ3RpdGxlJyB0ZXh0PVRSQU5TTEFUQUJMRVNUUklORyk/KTsKKworVGFibGVCYXNlQWdncmVnYXRpb246CisJVGFibGVQdXJlQWdncmVnYXRpb258VGFibGVVbmFyeUFnZ3JlZ2F0aW9ufFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbnxUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOworCitUYWJsZVB1cmVBZ2dyZWdhdGlvbjoKKwlhZ2dyZWdhdGlvbj1QdXJlQWdncmVnYXRpb25UeXBlRW51bTsKKworVGFibGVVbmFyeUFnZ3JlZ2F0aW9uOgorCWFnZ3JlZ2F0aW9uPVVuYXJ5QWdncmVnYXRpb25UeXBlRW51bSAnb2YnIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XTsKKworVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uOgorCWFnZ3JlZ2F0aW9uPU11bHRpcGxlQWdncmVnYXRpb25UeXBlRW51bSAnb2YnICcoJyAodmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldKSogJyknOworCitUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOgorCWFnZ3JlZ2F0aW9uPUJpbmFyeUFnZ3JlZ2F0aW9uVHlwZUVudW0gJ29mJyAnKCcgdmFsdWVSZWZzKz1bZGF0YW1hcnQ6OkRhdGFtYXJ0UHJvcGVydHldIHZhbHVlUmVmcys9W2RhdGFtYXJ0OjpEYXRhbWFydFByb3BlcnR5XSAnKSc7CisKK1RhYmxlSW50ZXJ2YWw6CisJKFRhYmxlTnVtYmVySW50ZXJ2YWx8VGFibGVEYXRlRGF5SW50ZXJ2YWwpOworCQorVGFibGVOdW1iZXJJbnRlcnZhbDoKKwl7VGFibGVOdW1iZXJJbnRlcnZhbH0gJ3VwIHRvJyBudW1iZXJJbnRlcnZhbFZhbHVlPVNpZ25lZE51bWJlciBudW1iZXJSYW5nZT1UYWJsZVJhbmdlRWxlbWVudDsKKwkKK1RhYmxlRGF0ZURheUludGVydmFsOgorCXtUYWJsZURhdGVEYXlJbnRlcnZhbH0gJ2RheXMgaW4gcGFzdCcgZGF0ZUludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIGRhdGVSYW5nZT1UYWJsZVJhbmdlRWxlbWVudDsKKworVGFibGVMb29rdXA6CisJKFRhYmxlTnVtYmVyTG9va3VwfFRhYmxlU3RyaW5nTG9va3VwfFRhYmxlRGF0ZURheUxvb2t1cCk7CisJCitUYWJsZU51bWJlckxvb2t1cDoKKwl7VGFibGVOdW1iZXJMb29rdXB9ICdudW1iZXInIGxvb2t1cFZhbHVlPVNpZ25lZE51bWJlciBkaXNjcmV0ZT1UYWJsZVJhbmdlRWxlbWVudDsKKworVGFibGVTdHJpbmdMb29rdXA6CisJe1RhYmxlU3RyaW5nTG9va3VwfSAnc3RyaW5nJyBsb29rdXBWYWx1ZT1TVFJJTkcgZGlzY3JldGU9VGFibGVSYW5nZUVsZW1lbnQ7CisJCitUYWJsZURhdGVEYXlMb29rdXA6CisJe1RhYmxlRGF0ZURheUxvb2t1cH0gJ2RheXMgaW4gcGFzdCcgbG9va3VwVmFsdWU9U2lnbmVkTnVtYmVyIGRpc2NyZXRlPVRhYmxlUmFuZ2VFbGVtZW50OworCQorVGFibGVSYW5nZUVsZW1lbnQ6CisJVGFibGVUZXh0Q29sb3IgfCBUYWJsZUNlbGxDb2xvciB8IFRhYmxlSWNvbiB8IFRhYmxlVHJlbmQ7CisJCitTaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKwknLSc/IE51bWJlcjsKKwkKK1RhYmxlVGV4dENvbG9yOiAKKwkndGV4dGNvbG9yJyBjb2xvcj1bQ29sb3JdOworCQorVGFibGVDZWxsQ29sb3I6IAorCSdjZWxsY29sb3InIGNvbG9yPVtDb2xvcl07CisKK1RhYmxlSWNvbjoKKwknaWNvbicgaWNvbj1TVFJJTkc7CisKK1RhYmxlVHJlbmQ6CisJJ3RyZW5kJyBpY29uPVRyZW5kSWNvbkVudW07CisKK2VudW0gVHJlbmRJY29uRW51bToKKwlSSVNJTkc9J3Jpc2luZycgfCBCQURSSVNJTkc9J2JhZC1yaXNpbmcnIHwgU0xPUElORz0nc2xvcGluZycgfCBHT09EU0xPUElORz0nZ29vZC1zbG9waW5nJ3wgU1RBR05BVElORz0nc3RhZ25hdGluZyc7CisvKiAuLi4gY29weSBmcm9tIHRhYmxlZHNsICEhISAqLworCisvL0NoYXJ0RHNsOgorLy8JJ2NoYXJ0JyBjaGFydFJlZj1bY2hhcnQ6OkNoYXJ0XSAoJ2FzJyBuYW1lPUlEKT87CisvLworVGl0bGU6CisJe1RpdGxlfSAndGl0bGUnIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPzsKKworU3ViVGl0bGU6CisJe1N1YlRpdGxlfSAnc3VidGl0bGUnIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPzsKKworU3ViU3ViVGl0bGU6CisJe1N1YlN1YlRpdGxlfSAnc3Vic3VidGl0bGUnIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPzsKKworTGFiZWw6CisJe0xhYmVsfSAnbGFiZWwnIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPzsKKworVGV4dDoKKwl7VGV4dH0gJ3RleHQnIHRleHQ9VFJBTlNMQVRBQkxFU1RSSU5HICgnc3R5bGUnIHN0eWxlPVtTdHlsZV0pPzsKKworQXV0b1RleHQ6CisJJ2F1dG90ZXh0JyB0eXBlPUF1dG9UZXh0RW51bSAoJ3N0eWxlJyBzdHlsZT1bU3R5bGVdKT87CisKK2VudW0gQm9yZGVyVHlwZUVudW06CisJTk9ORT0nbm9uZScgfCBTT0xJRD0nc29saWQnIHwgRE9UVEVEPSdkb3R0ZWQnIHwgREFTSEVEPSdkYXNoZWQnIHwgRE9VQkxFPSdkb3VibGUnIHwgR1JPT1ZFPSdncm9vdmUnIHwgUklER0U9J3JpZGdlJyB8IElOU0VUPSdpbnNldCcgfCBPVVRTRVQ9J291dHNldCc7CisKK2VudW0gQXV0b1RleHRFbnVtOgorCVBBR0VfTlVNQkVSPSJwYWdlLW51bWJlciIgfCBUT1RBTF9QQUdFPSJ0b3RhbC1wYWdlIiB8IFBBR0VfTlVNQkVSX1VORklMVEVSRUQ9InBhZ2UtbnVtYmVyLXVuZmlsdGVyZWQiIHwgVE9UQUxfUEFHRV9VTkZJTFRFUkVEPSJ0b3RhbC1wYWdlLXVuZmlsdGVyZWQiIHwgUEFHRV9WQVJJQUJMRT0icGFnZS12YXJpYWJsZSI7CisKK0ltYWdlOgorCSdpbWFnZScgc2l6ZT1JbWFnZVNpemVFbnVtICgnc2NhbGUnIHNjYWxlPVVuc2lnbmVkTnVtYmVyKT8gc291cmNlVHlwZT1JbWFnZVNvdXJjZUVudW0gZmlsZW5hbWU9U1RSSU5HOworCitlbnVtIEltYWdlU2l6ZUVudW06CisJU0laRV9UT19JTUFHRT0nc2l6ZS10by1pbWFnZScgfCBTQ0FMRV9UT19JVEVNPSdzY2FsZS10by1pdGVtJyB8IENMSVA9J2NsaXAnOworCitlbnVtIEltYWdlU291cmNlRW51bToKKwlGSUxFPSdmaWxlJyB8IFVSTCA9ICd1cmwnIHwgRU1CRUQgPSAnZW1iZWQnOworCitSZXBvcnRJbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwknaW1wb3J0JyBpbXBvcnRlZE5hbWVzcGFjZT1SZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOworCitSZXBvcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOgorCVF1YWxpZmllZE5hbWUgKCcuJyAnKicpPzsKKworVFJBTlNMQVRBQkxFU1RSSU5HOiBTVFJJTkc7CQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTE3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvUmVwb3J0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5hcGkuSVR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpLklUeXBlTG9hZGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lLlR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIucnVudGltZS5UeXBlTG9hZGVyUHJvdmlkZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlIGV4dGVuZHMgUmVwb3J0RFNMUnVudGltZU1vZHVsZSB7CisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5hY2Nlc3MuSUp2bVR5cGVQcm92aWRlci5GYWN0b3J5PiBiaW5kSUp2bVR5cGVQcm92aWRlciRGYWN0b3J5KCkgeworCQlyZXR1cm4gQnVuZGxlU3BhY2VUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBCdW5kbGVTcGFjZVR5cGVTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVR5cGVMb2FkZXJGYWN0b3J5PiBiaW5kSVR5cGVMb2FkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gVHlwZUxvYWRlckZhY3RvcnkuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVHlwZUxvYWRlclByb3ZpZGVyPiBJVHlwZUxvYWRlclByb3ZpZGVyKCkgeworCQlyZXR1cm4gVHlwZUxvYWRlclByb3ZpZGVyLmNsYXNzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MzVmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnhiYXNlLnNldHVwcy5YYmFzZUJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAgZXh0ZW5kcworCQlSZXBvcnREU0xTdGFuZGFsb25lU2V0dXAgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1NldHVwKCkgeworCQluZXcgUmVwb3J0RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAoKS5jcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCkgeworCQlYYmFzZUJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmRvU2V0dXAoKTsKKworCQlJbmplY3RvciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKCk7CisJCXJlZ2lzdGVyKGluamVjdG9yKTsKKwkJcmV0dXJuIGluamVjdG9yOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvcigpIHsKKwkJcmV0dXJuIEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBSZXBvcnREU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTFJ1bnRpbWVNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xSdW50aW1lTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiMDRhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xSdW50aW1lTW9kdWxlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuTGF6eUp2bVR5cGVMaW5rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLlNlbWFudGljTG9hZGluZ1Jlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5saW5rZXIuTGF6eUp2bVR5cGVUcmFuc2llbnRWYWx1ZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkRTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRNb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zY29waW5nLlJlcG9ydERTTFNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudmFsdWVjb252ZXJ0ZXIuUmVwb3J0UXVhbGlmaWVkTmFtZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnZhbHVlY29udmVydGVyLlJlcG9ydFZhbHVlQ29udmVydGVyU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLklWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcjsKKworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgYXQgcnVudGltZSAvIHdpdGhvdXQgdGhlIEVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5LgorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMUnVudGltZU1vZHVsZSBleHRlbmRzIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkFic3RyYWN0UmVwb3J0RFNMUnVudGltZU1vZHVsZSB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElTY29wZVByb3ZpZGVyPiBiaW5kSVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBSZXBvcnREU0xTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUdlbmVyYXRvcj4gYmluZElHZW5lcmF0b3IoKSB7CisJCXJldHVybiBSZXBvcnRNb2RlbEdlbmVyYXRvci5jbGFzczsKKwl9CisJCisvLwkvKioKKy8vCSAqIE9ubHkgcmVxdWlyZWQsIGlmIGZxbiBjYW4gbm90IGJlIGNyZWF0ZWQgYnkgYXBwZW5kaW5nIHRoZSBuYW1lcyBvZiB0aGUKKy8vCSAqIHNlbWFudGljIGVsZW1lbnRzIHVwIHRoZSBoaWVyYXJjaHkuCisvLwkgKi8KKy8vCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI+IGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworLy8JCXJldHVybiBSZXBvcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuY2xhc3M7CisvLwl9CisvLworCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVZhbHVlQ29udmVydGVyU2VydmljZT4gYmluZElWYWx1ZUNvbnZlcnRlclNlcnZpY2UoKSB7CisJCXJldHVybiBSZXBvcnRWYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29uZmlndXJlKEJpbmRlciBiaW5kZXIpIHsKKwkJc3VwZXIuY29uZmlndXJlKGJpbmRlcik7CisJCWJpbmRlci5iaW5kKElPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXIuY2xhc3MpLnRvKERTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLlh0ZXh0UmVzb3VyY2U+IGJpbmRYdGV4dFJlc291cmNlKCkgeworCQlyZXR1cm4gU2VtYW50aWNMb2FkaW5nUmVzb3VyY2UuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5saW5raW5nLklMaW5rZXI+IGJpbmRJTGlua2VyKCkgeworCQlyZXR1cm4gTGF6eUp2bVR5cGVMaW5rZXIuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JVHJhbnNpZW50VmFsdWVTZXJ2aWNlPiBiaW5kU2VyaWFsaXplcklUcmFuc2llbnRWYWx1ZVNlcnZpY2UoKSB7CisJCXJldHVybiBMYXp5SnZtVHlwZVRyYW5zaWVudFZhbHVlU2VydmljZS5jbGFzczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9SZXBvcnREU0xTdGFuZGFsb25lU2V0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc3NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL1JlcG9ydERTTFN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsOworCisvKioKKyAqIEluaXRpYWxpemF0aW9uIHN1cHBvcnQgZm9yIHJ1bm5pbmcgWHRleHQgbGFuZ3VhZ2VzIAorICogd2l0aG91dCBlcXVpbm94IGV4dGVuc2lvbiByZWdpc3RyeQorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMU3RhbmRhbG9uZVNldHVwIGV4dGVuZHMgUmVwb3J0RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkeworCisJcHVibGljIHN0YXRpYyB2b2lkIGRvU2V0dXAoKSB7CisJCW5ldyBSZXBvcnREU0xTdGFuZGFsb25lU2V0dXAoKS5jcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvWGNvcmVSZXNvdXJjZUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYjIxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvWGNvcmVSZXNvdXJjZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZS5yZXNvdXJjZS5YY29yZVJlc291cmNlOworCitwdWJsaWMgY2xhc3MgWGNvcmVSZXNvdXJjZUZhY3RvcnkgaW1wbGVtZW50cyBSZXNvdXJjZS5GYWN0b3J5IHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlYY29yZVJlc291cmNlIHJlc291cmNlID0gbmV3IFhjb3JlUmVzb3VyY2UoKTsKKwkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vQWJzdHJhY3RSZXBvcnRCZWFuLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0Fic3RyYWN0UmVwb3J0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTM1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0Fic3RyYWN0UmVwb3J0QmVhbi5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBjb20udmFhZGluLmRhdGEuQ29udGFpbmVyLkZpbHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZWN2aWV3LmNvcmUuZXh0ZW5zaW9uLm1vZGVsLmV4dGVuc2lvbi5FeHRlbnNpb25Nb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5lY3ZpZXcuY29yZS5leHRlbnNpb24ubW9kZWwuZXh0ZW5zaW9uLllCcm93c2VyU3RyZWFtSW5wdXQ7CisKK2ltcG9ydCBjb20udmFhZGluLnNlcnZlci5TdHJlYW1SZXNvdXJjZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVwb3J0QmVhbiB7CisKKwlwcml2YXRlIEZpbHRlciBmaWx0ZXI7CisKKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRGaWx0ZXIoRmlsdGVyIGZpbHRlcikgeworCQlmaXJlUHJvcGVydHlDaGFuZ2UoInF1ZXJ5IiwgdGhpcy5maWx0ZXIsIHRoaXMuZmlsdGVyID0gZmlsdGVyKTsKKwl9CisKKwlARGVwcmVjYXRlZAorCXB1YmxpYyBmaW5hbCBGaWx0ZXIgZ2V0RmlsdGVyKCkgeworCQlyZXR1cm4gZmlsdGVyOworCX0KKworCXByaXZhdGUgT2JqZWN0IGR0bzsKKworCXB1YmxpYyBmaW5hbCB2b2lkIHNldER0byhPYmplY3QgZHRvKSB7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZSgiZHRvIiwgdGhpcy5kdG8sIHRoaXMuZHRvID0gZHRvKTsKKwl9CisKKwlARGVwcmVjYXRlZAorCXB1YmxpYyBPYmplY3QgZ2V0RHRvKCkgeworCQlyZXR1cm4gZHRvOworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlU3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoCisJCQl0aGlzKTsKKworCXByaXZhdGUgQmFzZVJlcG9ydCByZXBvcnQgPSBudWxsOworCXByaXZhdGUgWUJyb3dzZXJTdHJlYW1JbnB1dCBpbnB1dFN0cmVhbTsKKworCS8qKgorCSAqIEBzZWUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0I2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAorCQkJZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsCisJICogICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKwkJCWZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogQHNlZSBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCisJCQlmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXByb3BlcnR5Q2hhbmdlU3VwcG9ydC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywKKwkgKiAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAorCQkJZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsCisJCQkJbGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIE9iamVjdCwgT2JqZWN0KQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAorCQkJZmluYWwgT2JqZWN0IG9sZFZhbHVlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLAorCQkJCW5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmlnZ2VyKGxvbmcgdGltZXN0YW1wKSB7CisJCXNldElucHV0U3RyZWFtKGdlbmVyYXRlSW5wdXRTdHJlYW1Gb3JSZXBvcnQoKSk7CisJfQorCisJcHVibGljIGZpbmFsIGxvbmcgZ2V0VHJpZ2dlcigpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcHVibGljIGZpbmFsIHZvaWQgc2V0SW5wdXRTdHJlYW0oWUJyb3dzZXJTdHJlYW1JbnB1dCBpbnB1dFN0cmVhbSkgeworCQlmaXJlUHJvcGVydHlDaGFuZ2UoImlucHV0U3RyZWFtIiwgdGhpcy5pbnB1dFN0cmVhbSwKKwkJCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW0pOworCX0KKworCXB1YmxpYyBmaW5hbCBZQnJvd3NlclN0cmVhbUlucHV0IGdldElucHV0U3RyZWFtKCkgeworCQlyZXR1cm4gaW5wdXRTdHJlYW07CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IEJhc2VSZXBvcnQgY3JlYXRlUmVwb3J0KCk7CisKKwlwcm90ZWN0ZWQgZmluYWwgWUJyb3dzZXJTdHJlYW1JbnB1dCBnZW5lcmF0ZUlucHV0U3RyZWFtRm9yUmVwb3J0KCkgeworCQkvLyBZQnJvd3NlclN0cmVhbUlucHV0IHN0cmVhbSA9IG5ldyBZQnJvd3NlclN0cmVhbUlucHV0KCk7CisJCVlCcm93c2VyU3RyZWFtSW5wdXQgc3RyZWFtID0gRXh0ZW5zaW9uTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQorCQkJCS5jcmVhdGVZQnJvd3NlclN0cmVhbUlucHV0KCk7CisJCWlmIChyZXBvcnQgPT0gbnVsbCkgeworCQkJcmVwb3J0ID0gY3JlYXRlUmVwb3J0KCk7CisJCX0KKwkJaWYJKGR0byAhPSBudWxsKSB7CisJCQlyZXBvcnQuYXBwbHlCZWFuRHRvKGR0byk7CisJCX0KKwkJZWxzZSBpZiAoZmlsdGVyICE9IG51bGwpIHsKKwkJCXJlcG9ydC5hcHBseUJlYW5GaWx0ZXIoZmlsdGVyKTsKKwkJfQorCQllbHNlIHsKKwkJCXJlcG9ydC5yZXNldEJlYW4oKTsKKwkJfQorCQlTdHJlYW1SZXNvdXJjZSBzdHJlYW1SZXNvdXJjZSA9IHJlcG9ydC5nZXRSZXBvcnRTdHJlYW1SZXNvdXJjZSgpOworCQlTdHJpbmcgZmlsZW5hbWUgPSByZXBvcnQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLWVycm9yLmh0bWwiOworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKKwkJU3RyaW5nIG1pbWVUeXBlOworCQlpZiAoc3RyZWFtUmVzb3VyY2UgPT0gbnVsbCkgeworCQkJaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKCI8aHRtbD48Ym9keT48aDE+IgorCQkJCQkrIGZpbGVuYW1lICsgIjwvaDE+ZXJyb3I8L2JvZHk+PC9odG1sPiIpLmdldEJ5dGVzKCkpOworCQkJbWltZVR5cGUgPSAiYXBwbGljYXRpb24veGh0bWwreG1sIjsKKwkJfSBlbHNlIHsKKwkJCWZpbGVuYW1lID0gc3RyZWFtUmVzb3VyY2UuZ2V0RmlsZW5hbWUoKTsKKwkJCWlucHV0U3RyZWFtID0gcmVwb3J0LmdldFN0cmVhbSgpOworCQkJbWltZVR5cGUgPSBzdHJlYW1SZXNvdXJjZS5nZXRNSU1FVHlwZSgpOworCQl9CisJCXN0cmVhbS5zZXRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7CisJCXN0cmVhbS5zZXRGaWxlbmFtZShmaWxlbmFtZSk7CisJCXN0cmVhbS5zZXRNaW1lVHlwZShtaW1lVHlwZSk7CisKKwkJcmV0dXJuIHN0cmVhbTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYzYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZ2l0aW5mby5Mb2dpbmZvOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OworCisJc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKKwkJcmV0dXJuIGNvbnRleHQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFjdGl2YXRvci5jb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKKwkJQmlydEVuZ2luZS5zdGFydCgpOworCQlMb2dpbmZvIGxpID0gbmV3IExvZ2luZm8oKTsKKwkJbGkucHJpbnQoIEFjdGl2YXRvci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIEFjdGl2YXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJpcnRFbmdpbmUuc3RvcCgpOworCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0Jhc2VSZXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vQmFzZVJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjNjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0Jhc2VSZXBvcnQuamF2YQpAQCAtMCwwICsxLDUzOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRGVzaWduRWxlbWVudEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuT2RhRGF0YVNldEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuT2RhRGF0YVNvdXJjZUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0RGVzaWduSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TZXNzaW9uSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5hY3Rpdml0eS5TZW1hbnRpY0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZC5Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5jb21tYW5kLk5hbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmNzcy5Dc3NTdHlsZVNoZWV0SGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmNzcy5Dc3NTdHlsZVNoZWV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5tZW51Lk1Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLm1lbnUuTVRvb2xCYXJFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAub3NnaS5oeWJyaWQuYXBpLkFic3RyYWN0SHlicmlkVmFhY2xpcHNlVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQuSURhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmxheW91dC5JVmlld0xheW91dE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkubWV0YWRhdGEuSURTTE1ldGFkYXRhU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyLlJlbmRlcmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS50aGVtZXMuSVRoZW1lUmVzb3VyY2VTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXIuSVVzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb21tb24uSUVudGl0eUlkTW9kaWZpY2F0aW9uTGlzdGVuZXJWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY29uc3RhbnRzLkV4dGVuZGVkRGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5Qcm9wZXJ0eUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5WaWV3TGF5b3V0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5SZXBvcnRBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLmNvbW1vbi5JVG9vbGJhckFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5EYXRhbWFydEZpbHRlckdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5Cb2R5SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uaWJtLmljdS51dGlsLlVMb2NhbGU7CitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLkNvbnRhaW5lci5GaWx0ZXI7CitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLlByb3BlcnR5LlZhbHVlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLlByb3BlcnR5LlZhbHVlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgY29tLnZhYWRpbi5zZXJ2ZXIuRG93bmxvYWRTdHJlYW07CitpbXBvcnQgY29tLnZhYWRpbi5zZXJ2ZXIuRmlsZURvd25sb2FkZXI7CitpbXBvcnQgY29tLnZhYWRpbi5zZXJ2ZXIuU3RyZWFtUmVzb3VyY2U7CitpbXBvcnQgY29tLnZhYWRpbi51aS5Ccm93c2VyRnJhbWU7CitpbXBvcnQgY29tLnZhYWRpbi51aS5CdXR0b247CitpbXBvcnQgY29tLnZhYWRpbi51aS5CdXR0b24uQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20udmFhZGluLnVpLlZlcnRpY2FsTGF5b3V0OworCisvKioKKyAqIAorICogQGF1dGhvciBtb2tyb3NzLCByaWVnZWwKKyAqIAorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZXBvcnQgZXh0ZW5kcyBBYnN0cmFjdEh5YnJpZFZhYWNsaXBzZVZpZXcgaW1wbGVtZW50cyBTdHJlYW1SZXNvdXJjZS5TdHJlYW1Tb3VyY2UsIElVc2VyLlVzZXJMb2NhbGVMaXN0ZW5lciwgSUVudGl0eUlkTW9kaWZpY2F0aW9uTGlzdGVuZXJWaWV3IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc3NDM0MTY5NzgyOTM4OTQzMUw7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJhc2VSZXBvcnQuY2xhc3MpOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FQVElPTl9JMThOS0VZX1NBVkVfUERGID0gInNhdmUgUERGIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDQVBUSU9OX0kxOE5LRVlfUFJJTlRfUERGID0gInByaW50IFBERiI7CisKKwlwcm90ZWN0ZWQgSVZpZXdMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7CisJcHJvdGVjdGVkIEJyb3dzZXJGcmFtZSBmcmFtZTsKKwlwcm90ZWN0ZWQgSURhdGFNYXJ0IGRhdGFtYXJ0SW5zdGFuY2U7CisJcHJvdGVjdGVkIElEYXRhbWFydEZpbHRlckdlbmVyYXRvciBmRmlsdGVyR2VuZXJhdG9yOworCXByaXZhdGUgVmFsdWVDaGFuZ2VMaXN0ZW5lciBmRmlsdGVyQ2hhbmdlTGlzdGVuZXI7CisJcHJvdGVjdGVkIEJvZHlJdGVtIGZCb2R5OworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBQcm9wZXJ0eUxvb2t1cD4gZlByb3BlcnR5TG9va3VwTWFwTWFwID0gbmV3IEhhc2hNYXA8PigpOworCXByb3RlY3RlZCBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IGZXb3Jrc2V0OworCXByb3RlY3RlZCBMb2NhbGUgZkxvY2FsZTsKKwlwcm90ZWN0ZWQgU3RyZWFtUmVzb3VyY2UgZlJlcG9ydFJlc291cmNlOworCisJLyoqIG5lZWRzIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGRhdGFtYXRhIE9EQSBidW5kbGUgc3ltYm9saWMgbmFtZSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERBVEFTT1VSQ0VfRVhURU5TSU9OX0lEID0gIm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydCI7CisKKwlASW5qZWN0CisJcHJvdGVjdGVkIElUaGVtZVJlc291cmNlU2VydmljZSB0aGVtZVJlc291cmNlU2VydmljZTsKKworCUBJbmplY3QKKwlwcml2YXRlIElVc2VyIHVzZXI7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBJRFNMTWV0YWRhdGFTZXJ2aWNlIGRzbE1ldGFkYXRhU2VydmljZTsKKworCUBJbmplY3QKKwlwdWJsaWMgQmFzZVJlcG9ydChmaW5hbCBWZXJ0aWNhbExheW91dCBwYXJlbnQsIGZpbmFsIElFY2xpcHNlQ29udGV4dCBjb250ZXh0LCBmaW5hbCBNQXBwbGljYXRpb24gYXBwKSB7CisJCXN1cGVyKHBhcmVudCwgY29udGV4dCwgYXBwKTsKKwkJbGF5b3V0TWFuYWdlciA9IG5ldyBWaWV3TGF5b3V0TWFuYWdlcigpOworCQlsYXlvdXRNYW5hZ2VyLmluaXQocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgSVRoZW1lUmVzb3VyY2VTZXJ2aWNlIGdldFRoZW1lUmVzb3VyY2VTZXJ2aWNlKCkgeworCQlyZXR1cm4gdGhlbWVSZXNvdXJjZVNlcnZpY2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJlSW5pdCgpIHsKKwkJZldvcmtzZXQgPSBuZXcgUmVwb3J0R2VuZXJhdG9yV29ya1NldCgpOworCQlmTG9jYWxlID0gdXNlci5nZXRMb2NhbGUoKTsKKwkJc3VwZXIucHJlSW5pdCgpOworCQl1c2VyLmFkZFVzZXJMb2NhbGVMaXN0ZW5lcih0aGlzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZWZyZXNoVmlld0R1ZVRvTW9kaWZpZWRFbnRpdHlJZChTdHJpbmcgZW50aXR5LCBPYmplY3QgaWQpIHsKKwkJc3VwZXIucmVmcmVzaFZpZXdEdWVUb01vZGlmaWVkRW50aXR5SWQoZW50aXR5LCBpZCk7CisJCXJlbmRlckRhdGEoKTsKKwl9CisKKwlwdWJsaWMgU3RyZWFtUmVzb3VyY2UgZ2V0UmVwb3J0U3RyZWFtUmVzb3VyY2UoKSB7CisJCXJldHVybiBnZXRSZXBvcnRTdHJlYW1SZXNvdXJjZShmTG9jYWxlKTsKKwl9CisKKwlwdWJsaWMgU3RyZWFtUmVzb3VyY2UgZ2V0UmVwb3J0U3RyZWFtUmVzb3VyY2UoTG9jYWxlIGxvY2FsZSkgeworCQlzZXRMb2NhbGUobG9jYWxlKTsKKwkJcmV0dXJuIGZSZXBvcnRSZXNvdXJjZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWaWV3KFZlcnRpY2FsTGF5b3V0IHBhcmVudCkgeworCX0KKworCXB1YmxpYyB2b2lkIGFkZENzcyhSZXBvcnREZXNpZ25IYW5kbGUgZGVzaWduSGFuZGxlKSB7CisJCWlmIChnZXRFeHRlcm5hbENzc1VSSSgpICE9IG51bGwpIHsKKwkJCUNzc1N0eWxlU2hlZXQgY3NzID0gbmV3IENzc1N0eWxlU2hlZXQoKTsKKwkJCWNzcy5zZXRGaWxlTmFtZShnZXRFeHRlcm5hbENzc1VSSSgpKTsKKwkJCWNzcy5zZXRFeHRlcm5hbENzc1VSSShnZXRFeHRlcm5hbENzc1VSSSgpKTsKKwkJCUNzc1N0eWxlU2hlZXRIYW5kbGUgY3NzaCA9IG5ldyBDc3NTdHlsZVNoZWV0SGFuZGxlKGRlc2lnbkhhbmRsZS5nZXRNb2R1bGVIYW5kbGUoKSwgY3NzKTsKKwkJCXRyeSB7CisJCQkJZGVzaWduSGFuZGxlLmFkZENzcyhjc3NoKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQlMT0dHRVIuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkKKwkJCQkJTE9HR0VSLmVycm9yKCIgIiArIGUuZ2V0Q2F1c2UoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0UmVwb3J0KCkgeworCQl0cnkgeworCQkJZkxvY2FsZSA9IHVzZXIuZ2V0TG9jYWxlKCk7CisJCQlMT0dHRVIuZGVidWcoIkNDQmFzZVJlcG9ydCAiICsgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGluaXRSZXBvcnQiKTsKKwkJCVNlc3Npb25IYW5kbGUgc2Vzc2lvbiA9IEJpcnRFbmdpbmUuZ2V0RGVzaWduRW5naW5lKCkubmV3U2Vzc2lvbkhhbmRsZShVTG9jYWxlLmZvckxvY2FsZSh1c2VyLmdldExvY2FsZSgpKSk7CisJCQlTZXNzaW9uSGFuZGxlLnNldEJpcnRSZXNvdXJjZVBhdGgoImkxOG4vSTE4TiIpOworCQkJaWYgKGdldFVzZWRSZXBvcnREZXNpZ25GaWxlbmFtZSgpID09IG51bGwpIHsKKwkJCQkvLyBDcmVhdGUgYSBuZXcgcmVwb3J0IGRlc2lnbi4KKwkJCQlmV29ya3NldC5kZXNpZ24gPSBzZXNzaW9uLmNyZWF0ZURlc2lnbigpOworCQkJCS8vIFRoZSBlbGVtZW50IGZhY3RvcnkgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhlIHZhcmlvdXMgQklSVAorCQkJCS8vIGVsZW1lbnRzLgorCQkJCWZXb3Jrc2V0LmZhY3RvcnkgPSBmV29ya3NldC5kZXNpZ24uZ2V0RWxlbWVudEZhY3RvcnkoKTsKKwkJCQkvLyBDcmVhdGUgYSBzaW1wbGUgbWFzdGVyIHBhZ2UgdGhhdCBkZXNjcmliZXMgaG93IHRoZSByZXBvcnQKKwkJCQkvLyB3aWxsCisJCQkJLy8gYXBwZWFyIHdoZW4gcHJpbnRlZC4KKwkJCQkvLworCQkJCS8vIE5vdGU6IFRoZSByZXBvcnQgd2lsbCBmYWlsIHRvIGxvYWQgaW4gdGhlIEJJUlQgZGVzaWduZXIKKwkJCQkvLyB1bmxlc3MgeW91IGNyZWF0ZSBhIG1hc3RlciBwYWdlLgorCQkJCURlc2lnbkVsZW1lbnRIYW5kbGUgZWxlbWVudCA9IGZXb3Jrc2V0LmZhY3RvcnkubmV3U2ltcGxlTWFzdGVyUGFnZSgiUGFnZSBNYXN0ZXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCS8vRGVzaWduRWxlbWVudEhhbmRsZSBlbGVtZW50ID0gbmV3IENYTWFzdGVyUGFnZSgiUGFnZSBNYXN0ZXIiKS5nZXRIYW5kbGUobnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCQlmV29ya3NldC5kZXNpZ24uZ2V0TWFzdGVyUGFnZXMoKS5hZGQoZWxlbWVudCk7CisJCQkJLy8gYWRkIGV4dGVybmFsIENTUworCQkJCWFkZENzcyhmV29ya3NldC5kZXNpZ24pOworCQkJCWZCb2R5ID0gbmV3IEJvZHlJdGVtKGZXb3Jrc2V0KTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQlpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpCisJCQkJTE9HR0VSLmVycm9yKCIgIiArIGUuZ2V0Q2F1c2UoKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVGaWx0ZXIoKSB7CisJCXRyeSB7CisJCQlmRmlsdGVyQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MDk4MzcxNDI1ODU5MDk4Njc2TDsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlKFZhbHVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJcmVuZGVyRGF0YSgpOworCQkJCX0KKwkJCX07CisJCQlmRmlsdGVyR2VuZXJhdG9yID0gKElEYXRhbWFydEZpbHRlckdlbmVyYXRvcikgbmV3IERhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yKCk7CisJCQlmRmlsdGVyR2VuZXJhdG9yLnNldERzbE1ldGFkYXRhU2VydmljZShkc2xNZXRhZGF0YVNlcnZpY2UpOworCQkJZGF0YW1hcnRJbnN0YW5jZSA9IGdldERhdGFtYXJ0SW5zdGFuY2UoKTsKKwkJCWZGaWx0ZXJHZW5lcmF0b3IuY3JlYXRlRmlsdGVyKGRhdGFtYXJ0SW5zdGFuY2UsIHVzZXIsIGZGaWx0ZXJDaGFuZ2VMaXN0ZW5lciwgbGF5b3V0TWFuYWdlcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJaWYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKQorCQkJCUxPR0dFUi5lcnJvcigiICIgKyBlLmdldENhdXNlKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IElEYXRhTWFydCBnZXREYXRhbWFydEluc3RhbmNlKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleHBsaWNpdCBnaXZlbiBmaWxlIG5hbWUgb2YgdGhlIHJlcG9ydCBkZXNpZ24gZmlsZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3J0RGVzaWduRmlsZW5hbWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gZWl0aGVyIHRoZSBleHBsaWNpdCBnaXZlbiBmaWxlIG5hbWUsIGFueSBhdXRvbWF0aWMgZ2VuZXJhdGVkIHJlcG9ydCBkZXNpZ24gZmlsZSBvciBudWxsCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRVc2VkUmVwb3J0RGVzaWduRmlsZW5hbWUoKSB7CisJCS8vIC0tLSBlaXRoZXIgdGhlIGV4cGxpY2l0IGdpdmVuIGZpbGUgbmFtZSAtLS0KKwkJU3RyaW5nIHJldGNvZGUgPSBnZXRSZXBvcnREZXNpZ25GaWxlbmFtZSgpOworCQlpZiAocmV0Y29kZSA9PSBudWxsKSB7CisJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCIuIiwgIi8iKTsKKwkJCWlmIChwYXRoTmFtZS5lbmRzV2l0aCgiUmVwb3J0IikpIHsKKwkJCQlwYXRoTmFtZSA9IHBhdGhOYW1lLnN1YnN0cmluZygwLCBwYXRoTmFtZS5sZW5ndGgoKSAtICJSZXBvcnQiLmxlbmd0aCgpKTsKKwkJCX0KKwkJCS8vIC0tLSBvciBhIGNvcHkgb2YgdGhlIGF1dG9tYXRpYyBnZW5lcmF0ZWQgcmVwb3J0IGZpbGUgLS0tCisJCQlyZXRjb2RlID0gInJwdGRlc2lnbi8iICsgcGF0aE5hbWUgKyAiLnJwdGRlc2lnbiI7CisJCQl0cnkgeworCQkJCWdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZXRjb2RlKS5vcGVuU3RyZWFtKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKKwkJCQkvLyAtLS0gb3IgdGhlIGF1dG9tYXRpYyBnZW5lcmF0ZWQgcmVwb3J0IGZpbGUgLS0tCisJCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJvbGVzID0gZ2V0QXV0aGVudGljYXRlZFJvbGVzKCk7CisJCQkJLy8gZm9yIHRoZSBtb21lbnQgLSB0YWtlIHRoZSBmaXJzdCByb2xlCisJCQkJaWYgKHJvbGVzICE9IG51bGwgJiYgcm9sZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCQkJcmV0Y29kZSA9ICJycHRkZXNpZ24tZ2VuLyIgKyBwYXRoTmFtZSArIHJvbGVzLml0ZXJhdG9yKCkubmV4dCgpICsgIi5ycHRkZXNpZ24iOworCQkJCX0gZWxzZSB7CisJCQkJCXJldGNvZGUgPSAicnB0ZGVzaWduLWdlbi8iICsgcGF0aE5hbWUgKyAiLnJwdGRlc2lnbiI7CisJCQkJfQorCQkJCXRyeSB7CisJCQkJCWdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZXRjb2RlKS5vcGVuU3RyZWFtKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisJCQkJCXJldGNvZGUgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0Y29kZTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVybmFsQ3NzVVJJKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgUmVuZGVyaW5nIGdldFJlbmRlcmluZ0FzKCkgeworCQlyZXR1cm4gUmVuZGVyaW5nLlBERl9TVFJFQU07CisJfQorCisJYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgYnVpbGRSZXBvcnQoKTsKKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3J0RmlsZW5hbWUoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArIGdldFRpbWVzdGFtcFBvc3RmaXgoKSArICItIiArIGZMb2NhbGUudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7CisJCXJldHVybiBnZXRGaWxlRXh0ZW5zaW9uKGdldFJlbmRlcmluZ0FzKCkpOworCX0KKworCWZpbmFsIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKFJlbmRlcmluZyByZW5kZXJlcikgeworCQlzd2l0Y2ggKHJlbmRlcmVyKSB7CisJCWNhc2UgSFRNTF9GSUxFOgorCQljYXNlIEhUTUxfU1RSRUFNOgorCQkJcmV0dXJuICIuaHRtbCI7CisJCWNhc2UgUERGX0ZJTEU6CisJCWNhc2UgUERGX1NUUkVBTToKKwkJY2FzZSBQREZfUFJJTlRfU1RSRUFNOgorCQkJcmV0dXJuICIucGRmIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiLnVua25vd24iOworCQl9CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRUaW1lc3RhbXBQb3N0Zml4KCkgeworCQlyZXR1cm4gIi0iICsgRXh0ZW5kZWREYXRlLnRpbWVTdGFtcFRvU3RyaW5nKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQ29tcG9uZW50cygpIHsKKwkJaW5pdFJlcG9ydCgpOworCQl0cnkgeworCQkJYnVpbGRSZXBvcnQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQlpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpCisJCQkJTE9HR0VSLmVycm9yKCIgIiArIGUuZ2V0Q2F1c2UoKSk7CisJCX0KKwkJLy8gcmVtb3ZlIGFueSBwcmV2aW91cyBjb21wb25lbnQKKwkJaWYgKGZyYW1lICE9IG51bGwpIHsKKwkJCWxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5yZW1vdmVDb21wb25lbnQoZnJhbWUpOworCQkJZnJhbWUgPSBudWxsOworCQl9CisJCWZyYW1lID0gbmV3IEJyb3dzZXJGcmFtZShudWxsLCBudWxsKTsKKwkJZnJhbWUuc2V0QWx0ZXJuYXRlVGV4dCgidW5hYmxlIHRvIGRpc3BsYXkgcmVwb3J0Iik7CisJCWZyYW1lLnNldFNpemVGdWxsKCk7CisJCWxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5hZGRDb21wb25lbnQoZnJhbWUpOworCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuc2V0RXhwYW5kUmF0aW8oZnJhbWUsIDEpOworCQlTdHJpbmcgZmlsZW5hbWUgPSBnZXRSZXBvcnRGaWxlbmFtZSgpICsgZ2V0RmlsZUV4dGVuc2lvbigpOworCisJCWZSZXBvcnRSZXNvdXJjZSA9IG51bGw7CisJCUxPR0dFUi5kZWJ1ZygiQmFzZVJlcG9ydCAiICsgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIChyZSlidWlsZFJlcG9ydCgiICsgZkxvY2FsZS50b1N0cmluZygpICsgIikiICsgIi4uLiIpOworCQlmUmVwb3J0UmVzb3VyY2UgPSBuZXcgU3RyZWFtUmVzb3VyY2UodGhpcywgZmlsZW5hbWUpOworCQlmUmVwb3J0UmVzb3VyY2Uuc2V0Q2FjaGVUaW1lKDApOworCQlpZiAoZnJhbWUgIT0gbnVsbCkgeworCQkJZnJhbWUuc2V0U291cmNlKGZSZXBvcnRSZXNvdXJjZSk7CisJCX0KKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisJcHVibGljIHZvaWQgYWRkUERGRG93bmxvYWQoSVRvb2xiYXJBY3Rpb24gdGFyZ2V0KSB7CisJCU1Ub29sQmFyIHRvb2xiYXIgPSB0YXJnZXQuZ2V0VG9vbEJhcigpOworCQlmb3IgKE1Ub29sQmFyRWxlbWVudCBlbGVtZW50IDogdG9vbGJhci5nZXRDaGlsZHJlbigpKSB7CisJCQlPYmplY3Qgd2lkZ2V0ID0gZWxlbWVudC5nZXRXaWRnZXQoKTsKKwkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBCdXR0b24pIHsKKwkJCQlMaXN0PFN0cmluZz4gdGFncyA9IGVsZW1lbnQuZ2V0VGFncygpOworCQkJCWlmCSh0YWdzLmNvbnRhaW5zKFJlcG9ydEFjdGlvbkVudW0uUkVQT1JUX0FDVElPTl9ET1dOTE9BRF9QREYuZ2V0TGl0ZXJhbCgpKSkgeworCQkJCQlGaWxlRG93bmxvYWRlciBmaWxlRG93bmxvYWRlciA9IG5ldyBGaWxlRG93bmxvYWRlcihuZXcgU3RyZWFtUmVzb3VyY2UodGhpcywgZ2V0UmVwb3J0RmlsZW5hbWUoKSArICIucGRmIikgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgRG93bmxvYWRTdHJlYW0gZ2V0U3RyZWFtKCkgeworCQkJCQkJCWZpbmFsIERvd25sb2FkU3RyZWFtIGRzID0gbmV3IERvd25sb2FkU3RyZWFtKGdldFBERigpLCBnZXRNSU1FVHlwZSgpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCQkJCQlkcy5zZXRCdWZmZXJTaXplKGdldEJ1ZmZlclNpemUoKSk7CisJCQkJCQkJZHMuc2V0Q2FjaGVUaW1lKGdldENhY2hlVGltZSgpKTsKKwkJCQkJCQlyZXR1cm4gZHM7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQlmaWxlRG93bmxvYWRlci5leHRlbmQoKEJ1dHRvbikgd2lkZ2V0KTsKKwkJCQl9CisJCQkJaWYJKHRhZ3MuY29udGFpbnMoUmVwb3J0QWN0aW9uRW51bS5SRVBPUlRfQUNUSU9OX1BSSU5UX09OX1NFUlZFUl9QREYuZ2V0TGl0ZXJhbCgpKSkgeworCQkJCQkoKEJ1dHRvbil3aWRnZXQpLmFkZENsaWNrTGlzdGVuZXIobmV3IEJ1dHRvbi5DbGlja0xpc3RlbmVyKCkgeworCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM5NjExMjk2MDcwOTk3NzMxNEw7CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIHZvaWQgYnV0dG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworCQkJCQkJCVBkZlByaW50U2VydmljZS5wcmludFJlcG9ydEFzUGRmKEJhc2VSZXBvcnQudGhpcywgdXNlci5nZXRQcmludFNlcnZpY2UoKSk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisJCWZMb2NhbGUgPSBsb2NhbGU7CisJCWlmIChmRmlsdGVyR2VuZXJhdG9yICE9IG51bGwpIHsKKwkJCWZGaWx0ZXJHZW5lcmF0b3Iuc2V0TG9jYWxlKGxvY2FsZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBidWlsZFJlcG9ydERlc2lnbihTdHJpbmcgZnVsbFF1YWxpZmllZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJVVJMIGJhc2VVcmwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIi9ycHRkZXNpZ24tZ2VuLy4iKTsKKwkJCUxPR0dFUi5kZWJ1ZyhiYXNlVXJsLnRvU3RyaW5nKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmVycm9yKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkKKwkJCQlMT0dHRVIuZXJyb3IoIiAiICsgZS5nZXRDYXVzZSgpKTsKKwkJfQorCQlmV29ya3NldC5kZXNpZ24uc2F2ZUFzKGZ1bGxRdWFsaWZpZWRGaWxlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBnZXRSdW5uYWJsZU9yRmlsZW5hbWUoKSB7CisJCWlmIChnZXRVc2VkUmVwb3J0RGVzaWduRmlsZW5hbWUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0VXNlZFJlcG9ydERlc2lnbkZpbGVuYW1lKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZldvcmtzZXQuZGVzaWduOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcHJvcGVydHkgbG9va3VwIG1hcCBkZWZpbmVkIGluc2lkZSB0aGUgcmVwb3J0IGRzbAorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBQcm9wZXJ0eUxvb2t1cD4gZ2V0UHJvcGVydHlMb29rdXBNYXAoKSB7CisJCXJldHVybiBmUHJvcGVydHlMb29rdXBNYXBNYXA7CisJfQorCisJcHVibGljIGZpbmFsIElEYXRhTWFydCBnZXREYXRhbWFydEluc3RhbmNlKFN0cmluZyBvZGFQcm9wQ29uZmlndXJhdGlvbklkKSB7CisJCXJldHVybiBkYXRhbWFydEluc3RhbmNlOworCX0KKworCXB1YmxpYyBmaW5hbCBJRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3IgZ2V0RmlsdGVyR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gZkZpbHRlckdlbmVyYXRvcjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGQoRGVzaWduRWxlbWVudEhhbmRsZSBoYW5kbGUpIHsKKwkJaWYgKGhhbmRsZSBpbnN0YW5jZW9mIE9kYURhdGFTb3VyY2VIYW5kbGUpIHsKKwkJCWZXb3Jrc2V0LmRlc2lnbi5nZXRNb2R1bGUoKS5hZGRFbGVtZW50SUQoaGFuZGxlLmdldEVsZW1lbnQoKSk7CisJCQkvLyBkZXNpZ24uCisJCX0gZWxzZSBpZiAoaGFuZGxlIGluc3RhbmNlb2YgT2RhRGF0YVNldEhhbmRsZSkgeworCQkJZldvcmtzZXQuZGVzaWduLmdldE1vZHVsZSgpLmFkZEVsZW1lbnRJRChoYW5kbGUuZ2V0RWxlbWVudCgpKTsKKwkJCS8vIGRlc2lnbi5nZXRCb2R5KCkuYWRkKGhhbmRsZSk7CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCWZXb3Jrc2V0LmRlc2lnbi5nZXRCb2R5KCkuYWRkKGhhbmRsZSk7CisJCQkJLy8gdGhyb3cgbmV3CisJCQkJLy8gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImhhbmRsZSAiK2hhbmRsZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSsiIGNhbm5vdCBiZSBhZGRlZCEiKTsKKwkJCX0gY2F0Y2ggKENvbnRlbnRFeGNlcHRpb24gfCBOYW1lRXhjZXB0aW9uIGUpIHsKKwkJCQlMT0dHRVIuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkKKwkJCQkJTE9HR0VSLmVycm9yKCIgIiArIGUuZ2V0Q2F1c2UoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgZmluYWwgSW5wdXRTdHJlYW0gZ2V0UERGKFN0cmluZyBwYXRoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gQmlydEVuZ2luZS5nZXQodGhpcywgUmVuZGVyaW5nLlBERl9GSUxFLCBwYXRoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5kZWJ1ZyhnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgUERGX0ZJTEU6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI8L2JvZHk+PC9odG1sPiIpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgZmluYWwgSW5wdXRTdHJlYW0gZ2V0SFRNTChTdHJpbmcgcGF0aCkgeworCQl0cnkgeworCQkJcmV0dXJuIEJpcnRFbmdpbmUuZ2V0KHRoaXMsIFJlbmRlcmluZy5IVE1MX0ZJTEUsIHBhdGgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmRlYnVnKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBIVE1MX0ZJTEU6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI8L2JvZHk+PC9odG1sPiIpOworCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoIjxodG1sPjxib2R5PiIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICI6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI8L2JvZHk+PC9odG1sPiIpLmdldEJ5dGVzKCkpOworCQl9CisJfQorCisJcHVibGljIElucHV0U3RyZWFtIGdldFBERigpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBCaXJ0RW5naW5lLmdldCh0aGlzLCBSZW5kZXJpbmcuUERGX1NUUkVBTSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIuZGVidWcoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIFBERl9TVFJFQU06ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI8L2JvZHk+PC9odG1sPiIpOworCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoIjxodG1sPjxib2R5PiIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICI6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI8L2JvZHk+PC9odG1sPiIpLmdldEJ5dGVzKCkpOworCQl9CisJfQorCisJcHVibGljIElucHV0U3RyZWFtIGdldFBERlByaW50KCkgeworCQl0cnkgeworCQkJcmV0dXJuIEJpcnRFbmdpbmUuZ2V0KHRoaXMsIFJlbmRlcmluZy5QREZfUFJJTlRfU1RSRUFNKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5kZWJ1ZyhnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgUERGX1BSSU5UX1NUUkVBTTogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjwvYm9keT48L2h0bWw+Iik7CisJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCgiPGh0bWw+PGJvZHk+IiArIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjwvYm9keT48L2h0bWw+IikuZ2V0Qnl0ZXMoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SFRNTCgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBCaXJ0RW5naW5lLmdldCh0aGlzLCBSZW5kZXJpbmcuSFRNTF9TVFJFQU0pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmRlYnVnKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBIVE1MX1NUUkVBTTogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjwvYm9keT48L2h0bWw+Iik7CisJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCgiPGh0bWw+PGJvZHk+IiArIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjwvYm9keT48L2h0bWw+IikuZ2V0Qnl0ZXMoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgeworCQkvLyAtLS0gYmVjYXVzZSBvbmx5IGF0IHRoaXMgdGltZSwgdGhlIGRhdGEgd2lsbCBiZSByZWFkLCAicmVzZXQiIHRoZQorCQkvLyBsaXN0ZW5pbmcgZW50aXR5IGlkcyAtLS0KKwkJcmVzZXRMaXN0ZW5pbmdGb3JFbnRpdHlJZHNNb2RpZmljYXRpb25zKCk7CisJCUxPR0dFUi5kZWJ1ZygiQ0NCYXNlUmVwb3J0ICIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgZ2V0U3RyZWFtKCkgLi4uIik7CisJCUxPR0dFUi5kZWJ1ZygiICAgLi4uIiArIGZSZXBvcnRSZXNvdXJjZS5nZXRDYWNoZVRpbWUoKSArICIgIiArIGZSZXBvcnRSZXNvdXJjZS5nZXRGaWxlbmFtZSgpKTsKKwkJcmV0dXJuIGdldFN0cmVhbShnZXRSZW5kZXJpbmdBcygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKFJlbmRlcmluZyByZW5kZXJlcikgeworCQl0cnkgeworCQkJc3dpdGNoIChyZW5kZXJlcikgeworCQkJY2FzZSBIVE1MX1NUUkVBTToKKwkJCQlyZXR1cm4gZ2V0SFRNTCgpOworCQkJY2FzZSBQREZfU1RSRUFNOgorCQkJCXJldHVybiBnZXRQREYoKTsKKwkJCWNhc2UgUERGX1BSSU5UX1NUUkVBTToKKwkJCQlyZXR1cm4gZ2V0UERGUHJpbnQoKTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CisJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJRFNMTWV0YWRhdGFTZXJ2aWNlIGdldERzbE1ldGFkYXRhU2VydmljZSgpIHsKKwkJcmV0dXJuIGRzbE1ldGFkYXRhU2VydmljZTsKKwl9CisKKwlwdWJsaWMgSVVzZXIgZ2V0VXNlcigpIHsKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJcHVibGljIHZvaWQgbG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7CisJCXNldExvY2FsZShsb2NhbGUpOworCQlpZihsYXlvdXRNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWxheW91dE1hbmFnZXIuc2V0TGFiZWxWYWx1ZShkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKGxvY2FsZS50b0xhbmd1YWdlVGFnKCksIGdldFJlcG9ydE5hbWUoKSkpOworCQl9CisJCXJlbmRlckRhdGEoKTsKKwl9CQorCisJcHVibGljIGZpbmFsIHZvaWQgcmVzZXRCZWFuKCkgeworCQlmRmlsdGVyR2VuZXJhdG9yID0gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJlcG9ydE5hbWUoKTsKKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFwcGx5QmVhbkZpbHRlcihGaWx0ZXIgZmlsdGVyKTsKKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFwcGx5QmVhbkR0byhPYmplY3QgZHRvKTsKKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKwkJdXNlci5yZW1vdmVVc2VyTG9jYWxlTGlzdGVuZXIodGhpcyk7CisJCWxheW91dE1hbmFnZXIgPSBudWxsOworCQlmcmFtZSA9IG51bGw7CisJCWRhdGFtYXJ0SW5zdGFuY2UgPSBudWxsOworCQlmRmlsdGVyR2VuZXJhdG9yID0gbnVsbDsKKwkJZkZpbHRlckNoYW5nZUxpc3RlbmVyID0gbnVsbDsKKwkJZkJvZHkgPSBudWxsOworCQlmUHJvcGVydHlMb29rdXBNYXBNYXAgPSBudWxsOworCQlmV29ya3NldCA9IG51bGw7CisJCWZMb2NhbGUgPSBudWxsOworCQlmUmVwb3J0UmVzb3VyY2UgPSBudWxsOworCQlzdXBlci5wcmVEZXN0cm95KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9CaXJ0RW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0JpcnRFbmdpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY5YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9CaXJ0RW5naW5lLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmV4Y2VwdGlvbi5CaXJ0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY29yZS5mcmFtZXdvcmsuSVBsYXRmb3JtQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNvcmUuZnJhbWV3b3JrLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY29yZS5mcmFtZXdvcmsuUGxhdGZvcm1GaWxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLkVuZ2luZUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLkVuZ2luZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLkhUTUxSZW5kZXJPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQuZW5naW5lLmFwaS5JUmVuZGVyT3B0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGkuSVJlcG9ydEVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLklSZXBvcnRFbmdpbmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGkuSVJlcG9ydFJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGkuSVJ1bkFuZFJlbmRlclRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQuZW5naW5lLmFwaS5QREZSZW5kZXJPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkRlc2lnbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuSURlc2lnbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuSURlc2lnbkVuZ2luZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydERlc2lnbkhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZC5DdXN0b21Nc2dFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkubWV0YWRhdGEuSURTTE1ldGFkYXRhU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnJlcG9ydC5JUmVwb3J0UHJvdmlkZXIuUmVuZGVyaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuc2Vzc2lvbi5WYWFkaW5TZXNzaW9uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRNb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmxvd2FnaWUudGV4dC5Eb2N1bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ubG93YWdpZS50ZXh0LnBkZi5QZGZDb3B5RmllbGRzOworaW1wb3J0IGNvbS5sb3dhZ2llLnRleHQucGRmLlBkZlJlYWRlcjsKKworcHVibGljIGNsYXNzIEJpcnRFbmdpbmUgeworCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJpcnRFbmdpbmUuY2xhc3MpOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDT05GSUdfRklMRSA9ICJCaXJ0Q29uZmlnLnByb3BlcnRpZXMiOworCQorCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgY29uZmlnUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCXByaXZhdGUgc3RhdGljIEVuZ2luZUNvbmZpZyBjb25maWcgPSBuZXcgRW5naW5lQ29uZmlnKCk7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N0YXJ0ZWQgPSBmYWxzZTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydCgpIHsKKwkJaWYJKCFpc1N0YXJ0ZWQpIHsKKwkJCUxPR0dFUi5kZWJ1ZygiQ0NCaXJ0RW5naW5lIC0gc3RhcnQiKTsKKwkJCWxvYWRFbmdpbmVQcm9wcygpOworCQkJaXNTdGFydGVkID0gdHJ1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wKCkgeworCQlpZgkoaXNTdGFydGVkKSB7CisJCQlMT0dHRVIuZGVidWcoIkNDQmlydEVuZ2luZSAtIHN0b3AiKTsKKwkJCVBsYXRmb3JtLnNodXRkb3duKCk7CisJCQlpc1N0YXJ0ZWQgPSBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIDxiPm9ubHkgY2FsbGFibGUgYnk8L2I+PHVsPgorCSAqIDxsaT57QGxpbmsgI2dldFJlcG9ydEVuZ2luZSgpfTwvbGk+CisJICogPGxpPntAbGluayBSZXBvcnRNb2RlbEdlbmVyYXRvciNnZW5lcmF0ZVJlcG9ydEZpbGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnRQYWNrYWdlLCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5DQ1JlcG9ydCwgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklGaWxlU3lzdGVtQWNjZXNzKX08L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIHN0YXRpYyBJUmVwb3J0RW5naW5lIGNyZWF0ZVJlcG9ydEVuZ2luZShCYXNlUmVwb3J0IHJlcG9ydCkgeworCQlzdGFydCgpOworCQljb25maWcuc2V0UmVzb3VyY2VQYXRoKCJpMThuIik7CisJCWNvbmZpZy5zZXRSZXNvdXJjZUxvY2F0b3IobmV3IFJlc291cmNlTG9jYXRvcihyZXBvcnQpKTsKKwkJY29uZmlnLnNldExvZ0NvbmZpZygibG9nL2JpcnQubG9nIixMZXZlbC5GSU5FKTsKKwkJSVBsYXRmb3JtQ29udGV4dCBjb250ZXh0ID0gbmV3IFBsYXRmb3JtRmlsZUNvbnRleHQoKTsKKwkJY29uZmlnLnNldFBsYXRmb3JtQ29udGV4dCggY29udGV4dCApOworCQl0cnkgeworCQkJUGxhdGZvcm0uc3RhcnR1cCggY29uZmlnICk7CisJCX0KKwkJY2F0Y2ggKCBCaXJ0RXhjZXB0aW9uIGUgKSB7CisJCQlMT0dHRVIuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJaWYgKGUuZ2V0Q2F1c2UoKSE9bnVsbCkgTE9HR0VSLmVycm9yKCIgIitlLmdldENhdXNlKCkpOworCQl9CisJCUlSZXBvcnRFbmdpbmVGYWN0b3J5IGZhY3RvcnkgPSAoSVJlcG9ydEVuZ2luZUZhY3RvcnkpIFBsYXRmb3JtLmNyZWF0ZUZhY3RvcnlPYmplY3QoIElSZXBvcnRFbmdpbmVGYWN0b3J5LkVYVEVOU0lPTl9SRVBPUlRfRU5HSU5FX0ZBQ1RPUlkgKTsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlUmVwb3J0RW5naW5lKCBjb25maWcgKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSVJlcG9ydEVuZ2luZSBnZXRSZXBvcnRFbmdpbmUoQmFzZVJlcG9ydCByZXBvcnQpIHsKKwkJSVJlcG9ydEVuZ2luZSByZXN1bHQgPSAoSVJlcG9ydEVuZ2luZSkgVmFhZGluU2Vzc2lvbkF0dHJpYnV0ZXMuZ2V0KElSZXBvcnRFbmdpbmUuY2xhc3MpOworCQlpZgkocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGNyZWF0ZVJlcG9ydEVuZ2luZShyZXBvcnQpOworCQkJVmFhZGluU2Vzc2lvbkF0dHJpYnV0ZXMuc2V0KElSZXBvcnRFbmdpbmUuY2xhc3MsIHJlc3VsdCk7CisJCQlMT0dHRVIuZGVidWcoIkNDQmlydEVuZ2luZSAtIHNlc3Npb24tc3RhdGljIHJlcG9ydCBlbmdpbmUgY3JlYXRlZCIpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXN0cm95UmVwb3J0RW5naW5lKCkgeworCQlJUmVwb3J0RW5naW5lIHJlc3VsdCA9IChJUmVwb3J0RW5naW5lKSBWYWFkaW5TZXNzaW9uQXR0cmlidXRlcy5nZXQoSVJlcG9ydEVuZ2luZS5jbGFzcyk7CisJCWlmCShyZXN1bHQgIT0gbnVsbCkgeworCQkJcmVzdWx0LmRlc3Ryb3koKTsKKwkJCVZhYWRpblNlc3Npb25BdHRyaWJ1dGVzLnJlbW92ZShJUmVwb3J0RW5naW5lLmNsYXNzKTsKKwkJCUxPR0dFUi5kZWJ1ZygiQ0NCaXJ0RW5naW5lIC0gc2Vzc2lvbi1zdGF0aWMgcmVwb3J0IGVuZ2luZSBkZXN0cm95ZWQiKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiA8Yj5vbmx5IGNhbGxhYmxlIGJ5PC9iPjx1bD4KKwkgKiA8bGk+e0BsaW5rICNnZXREZXNpZ25FbmdpbmUoKX08L2xpPgorCSAqIDxsaT57QGxpbmsgUmVwb3J0TW9kZWxHZW5lcmF0b3IjZ2VuZXJhdGVSZXBvcnRGaWxlKG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNDUmVwb3J0UGFja2FnZSwgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ0NSZXBvcnQsIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JRmlsZVN5c3RlbUFjY2Vzcyl9PC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBzdGF0aWMgSURlc2lnbkVuZ2luZSBjcmVhdGVEZXNpZ25FbmdpbmUoKSB7CisJCUlEZXNpZ25FbmdpbmUgcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXN0YXJ0KCk7CisJCQlEZXNpZ25Db25maWcgY29uZmlnID0gbmV3IERlc2lnbkNvbmZpZygpOworCQkJSURlc2lnbkVuZ2luZUZhY3RvcnkgZW5naW5lRmFjdG9yeSA9IChJRGVzaWduRW5naW5lRmFjdG9yeSkgUGxhdGZvcm0uY3JlYXRlRmFjdG9yeU9iamVjdChJRGVzaWduRW5naW5lRmFjdG9yeS5FWFRFTlNJT05fREVTSUdOX0VOR0lORV9GQUNUT1JZKTsKKwkJCVBsYXRmb3JtLnN0YXJ0dXAoY29uZmlnKTsKKwkJCXJlc3VsdCA9IGVuZ2luZUZhY3RvcnkuY3JlYXRlRGVzaWduRW5naW5lKGNvbmZpZyk7CisJCX0gY2F0Y2ggKEJpcnRFeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmVycm9yKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCWlmIChlLmdldENhdXNlKCkhPW51bGwpIExPR0dFUi5lcnJvcigiICIrZS5nZXRDYXVzZSgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBJRGVzaWduRW5naW5lIGdldERlc2lnbkVuZ2luZSgpIHsKKwkJSURlc2lnbkVuZ2luZSByZXN1bHQgPSAoSURlc2lnbkVuZ2luZSkgVmFhZGluU2Vzc2lvbkF0dHJpYnV0ZXMuZ2V0KElEZXNpZ25FbmdpbmUuY2xhc3MpOworCQlpZgkocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGNyZWF0ZURlc2lnbkVuZ2luZSgpOworCQkJaWYJKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJVmFhZGluU2Vzc2lvbkF0dHJpYnV0ZXMuc2V0KElEZXNpZ25FbmdpbmUuY2xhc3MsIHJlc3VsdCk7CisJCQkJTE9HR0VSLmRlYnVnKCJDQ0JpcnRFbmdpbmUgLSBzZXNzaW9uLXN0YXRpYyBkZXNpZ24gZW5naW5lIGNyZWF0ZWQiKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQl0aHJvdyBuZXcgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFbmdpbmVQcm9wcygpIHsKKwkJdHJ5IHsKKwkJCS8vQ29uZmlnIEZpbGUgbXVzdCBiZSBpbiBjbGFzc3BhdGgKKwkJCUNsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQgKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCQlpbiA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0gKENPTkZJR19GSUxFKTsKKwkJCWlmCShpbiAhPSBudWxsKSB7CisJCQkJY29uZmlnUHJvcHMubG9hZChpbik7CisJCQkJaW4uY2xvc2UoKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQlpZiAoZS5nZXRDYXVzZSgpIT1udWxsKSBMT0dHRVIuZXJyb3IoIiAiK2UuZ2V0Q2F1c2UoKSk7CisJCX0KKworCX0KKwkKKwlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldChCYXNlUmVwb3J0IHJlcG9ydCwgUmVuZGVyaW5nIHJlbmRlcmVyKSB7CisJCXJldHVybiBnZXQocmVwb3J0LCByZW5kZXJlciwgbnVsbCk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0KEJhc2VSZXBvcnQgcmVwb3J0LCBSZW5kZXJpbmcgcmVuZGVyZXIsIFN0cmluZyBwYXRoKSB7CisJCUlSZXBvcnRFbmdpbmUgcmVwb3J0RW5naW5lID0gZ2V0UmVwb3J0RW5naW5lKHJlcG9ydCk7CisJCUlSZXBvcnRSdW5uYWJsZSBkZXNpZ24gPSBudWxsOworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBudWxsOworCQkKKwkJdHJ5IHsKKwkJCS8vIE9wZW4gcmVwb3J0IGRlc2lnbgorCQkJT2JqZWN0IG9iamVjdCA9IHJlcG9ydC5nZXRSdW5uYWJsZU9yRmlsZW5hbWUoKTsKKwkJCWlmCShvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlVUkwgdXJsID0gbnVsbDsKKwkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJdXJsID0gcmVwb3J0LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgoU3RyaW5nKW9iamVjdCk7CisJCQkJCWlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKKwkJCQl9CisJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworCQkJCQl1cmwgPSBudWxsOworCQkJCQlpbnB1dFN0cmVhbSA9IG51bGw7CisJCQkJfQorCQkJCWlmCShpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisJCQkJCWRlc2lnbiA9IHJlcG9ydEVuZ2luZS5vcGVuUmVwb3J0RGVzaWduKHVybC50b0V4dGVybmFsRm9ybSgpLCBpbnB1dFN0cmVhbSk7CisJCQkJCWlmCShkZXNpZ24uZ2V0RGVzaWduSGFuZGxlKCkgaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25IYW5kbGUpIHsKKwkJCQkJCXJlcG9ydC5hZGRDc3MoKFJlcG9ydERlc2lnbkhhbmRsZSkgZGVzaWduLmdldERlc2lnbkhhbmRsZSgpKTsKKwkJCQkJCWFkZFRyYW5zbGF0aW9ucygoUmVwb3J0RGVzaWduSGFuZGxlKSBkZXNpZ24uZ2V0RGVzaWduSGFuZGxlKCksIHJlcG9ydC5nZXREc2xNZXRhZGF0YVNlcnZpY2UoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVwb3J0UnVubmFibGUpIHsKKwkJCQlkZXNpZ24gPSAoSVJlcG9ydFJ1bm5hYmxlKW9iamVjdDsKKwkJCX0KKwkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlcG9ydERlc2lnbkhhbmRsZSkgeworCQkJCWRlc2lnbiA9IHJlcG9ydEVuZ2luZS5vcGVuUmVwb3J0RGVzaWduKChSZXBvcnREZXNpZ25IYW5kbGUpb2JqZWN0KTsKKwkJCX0KKwkJCS8vIGNyZWF0ZSB0YXNrIHRvIHJ1biBhbmQgcmVuZGVyIHJlcG9ydAorCQkJaWYJKGRlc2lnbiAhPSBudWxsKSB7CisJCQkJSVJ1bkFuZFJlbmRlclRhc2sgdGFzayA9IHJlcG9ydEVuZ2luZS5jcmVhdGVSdW5BbmRSZW5kZXJUYXNrKGRlc2lnbik7CisJCQkJdGFzay5nZXRBcHBDb250ZXh0KCkucHV0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX1JFUE9SVCwgcmVwb3J0KTsKKwkJCQl0YXNrLmdldEFwcENvbnRleHQoKS5wdXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfVEhFTUVSRVNPVVJDRVNFUlZJQ0UsIHJlcG9ydC5nZXRUaGVtZVJlc291cmNlU2VydmljZSgpKTsKKwkJCQl0YXNrLmdldEFwcENvbnRleHQoKS5wdXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfRFNMTUVUQURBVEFTRVJWSUNFLCByZXBvcnQuZ2V0RHNsTWV0YWRhdGFTZXJ2aWNlKCkpOworCQkJCXRhc2suZ2V0QXBwQ29udGV4dCgpLnB1dChJUmVwb3J0UHJvdmlkZXIuQVBQQ09OVEVYVF9VU0VSLCByZXBvcnQuZ2V0VXNlcigpKTsKKwkJCQl0YXNrLmdldEFwcENvbnRleHQoKS5wdXQoSVJlcG9ydFByb3ZpZGVyLkFQUENPTlRFWFRfREFUQU1BUlRJTlNUQU5DRSwgcmVwb3J0LmdldERhdGFtYXJ0SW5zdGFuY2UoKSk7CisJCQkJdGFzay5nZXRBcHBDb250ZXh0KCkucHV0KElSZXBvcnRQcm92aWRlci5BUFBDT05URVhUX0ZJTFRFUk1BUCwgcmVwb3J0LmdldEZpbHRlckdlbmVyYXRvcigpLmdldEZpbHRlcihmYWxzZSkpOworCQkJCXRhc2suZ2V0QXBwQ29udGV4dCgpLnB1dChJUmVwb3J0UHJvdmlkZXIuQVBQQ09OVEVYVF9QUk9QRVJUWUxPT0tVUCwgcmVwb3J0LmdldFByb3BlcnR5TG9va3VwTWFwKCkpOworCQkJCXRhc2suc2V0TG9jYWxlKHJlcG9ydC5nZXRVc2VyKCkuZ2V0TG9jYWxlKCkpOworCQorCQkJCS8vIHNldCBvdXRwdXQgb3B0aW9ucworCQkJCUlSZW5kZXJPcHRpb24gb3B0aW9ucyA9IG51bGw7CisJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisJCQkJaWYJKHJlbmRlcmVyLmFzSHRtbCgpKSB7CisJCQkJCW9wdGlvbnMgPSBuZXcgSFRNTFJlbmRlck9wdGlvbigpOworCQkJCQlvcHRpb25zLnNldE91dHB1dEZvcm1hdChIVE1MUmVuZGVyT3B0aW9uLk9VVFBVVF9GT1JNQVRfSFRNTCk7CisJCQkJCSgoSFRNTFJlbmRlck9wdGlvbilvcHRpb25zKS5zZXRFbWJlZGRhYmxlKHRydWUpOworCQkJCX0KKwkJCQllbHNlIGlmIChyZW5kZXJlci5hc1BkZigpKSB7CisJCQkJCW9wdGlvbnMgPSBuZXcgUERGUmVuZGVyT3B0aW9uKCk7CisJCQkJCW9wdGlvbnMuc2V0T3V0cHV0Rm9ybWF0KFBERlJlbmRlck9wdGlvbi5PVVRQVVRfRk9STUFUX1BERik7CisJCQkJfQorCQkJCWlmCShvcHRpb25zICE9IG51bGwpIHsKKwkJCQkJaWYJKHJlbmRlcmVyLmFzRmlsZSgpKSB7CisJCQkJCQlvcHRpb25zLnNldE91dHB1dEZpbGVOYW1lKHBhdGgpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHJlbmRlcmVyLmFzU3RyZWFtKCkpIHsKKwkJCQkJCWJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKy8vCQkJCQkJdHJ5IHsKKy8vCQkJCQkJCWJvcy50b1N0cmluZygiSVNPLTg4NTktMSIpOworLy8JCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKy8vCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisvLwkJCQkJCX0KKwkJCQkJCW9wdGlvbnMuc2V0T3V0cHV0U3RyZWFtKGJvcyk7CisJCQkJCX0KKwkJCQl9CisJCQkJdGFzay5zZXRSZW5kZXJPcHRpb24ob3B0aW9ucyk7CisJCQkJLy8gcnVuIHJlcG9ydAorCQkJCXRhc2sucnVuKCk7CisJCQkJCisJCQkJaWYgKHJlbmRlcmVyLmFzU3RyZWFtKCkpIHsKKwkJCQkJaWYJKHJlbmRlcmVyLmZvclByaW50aW5nKCkgJiYgKGJvcyAhPSBudWxsKSkgeworCQkJCQkJLy8gLS0tIGdldCB0aGUgZ2VuZXJhdGVkIEJJUlQgUERGIGRvY3VtZW50IC0tLQorCQkJCQkJUGRmUmVhZGVyIGpzMSA9IG5ldyBQZGZSZWFkZXIoYm9zLnRvQnl0ZUFycmF5KCkpOworCQkJCQkJLy8gLS0tIGNyZWF0ZSBhIG5ldyBvdXRwdXQgc3RyZWFtIC0tLQorCQkJCQkJYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJCQkJLy8gLS0tIGdlbmVyYXRlIGEgbmV3IFBERiBkb2N1bWVudCAtLS0KKwkJCQkJCVBkZkNvcHlGaWVsZHMgY3B5ID0gbmV3IFBkZkNvcHlGaWVsZHMoYm9zKTsgLy8gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dHB1dC9yZXNhbXBsZS9wcmludGRpYWxvZy5wZGYiICkpOworCQkJCQkJLy8gLS0tIGFkZCB0aGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgQklSVCBQREYgZG9jdW1lbnQgLS0tCisJCQkJCQljcHkuYWRkRG9jdW1lbnQoanMxKTsKKwkJCQkJCS8vIC0tLSBhZGQgYSBwcmludC1zdGF0ZW1lbnQgaW50byB0aGUgbmV3IFBERiBkb2N1bWVudCAtLS0KKwkJCQkJCWNweS5hZGRKYXZhU2NyaXB0KCAidGhpcy5wcmludCh7YlVJOiB0cnVlLGJTaWxlbnQ6IGZhbHNlLGJTaHJpbmtUb0ZpdDp0cnVlfSk7IiApOworCQkJCQkJY3B5LmNsb3NlKCk7CisJCQkJCX0KKwkJCQkJaWYJKGJvcyAhPSBudWxsKSB7CisJCQkJCQliaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOworCQkJCQl9CisJCQkJfQorCQkJCXRhc2suY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRW5naW5lRXhjZXB0aW9uIHwgTnVsbFBvaW50ZXJFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiB8IERvY3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWJpcyA9IG51bGw7CisJCQlMT0dHRVIuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJaWYgKGUuZ2V0Q2F1c2UoKSE9bnVsbCkgTE9HR0VSLmVycm9yKCIgIitlLmdldENhdXNlKCkpOworCQl9CisJCXJldHVybiBiaXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUcmFuc2xhdGlvbnMoUmVwb3J0RGVzaWduSGFuZGxlIHJlcG9ydERlc2lnbkhhbmRsZSwKKwkJCUlEU0xNZXRhZGF0YVNlcnZpY2UgZHNsTWV0YWRhdGFTZXJ2aWNlKSB7CisJCWZvciAoU3RyaW5nIGxvY2FsZSA6IGRzbE1ldGFkYXRhU2VydmljZS5nZXRUcmFuc2xhdGlvbnMoKS5rZXlTZXQoKSkgeworCQkJLy8gVE9ETzogYmlydDQuNCBjYW5ub3QgaGFuZGxlIGZhbGxiYWNrcyBvZiBsYW5ndWFnZSB2YXJpYW50cyB3aXRoCisJCQkvLyBtaXNzaW5nIGtleXMgd2hlbiBsb2NhbGUgd2FzIGFkZGVkIC0gc28gZG9uJ3Qgc3VwcGx5IGZvciB0aGlzCisJCQkvLyB2ZXJzaW9uCisJCQlpZiAoIWxvY2FsZS5jb250YWlucygiXyIpKSB7CisJCQkJZm9yIChPYmplY3Qga2V5IDogZHNsTWV0YWRhdGFTZXJ2aWNlLmdldFRyYW5zbGF0aW9ucygpCisJCQkJCQkuZ2V0KGxvY2FsZSkua2V5U2V0KCkpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlcG9ydERlc2lnbkhhbmRsZS5hZGRUcmFuc2xhdGlvbigoU3RyaW5nKSBrZXksIGxvY2FsZSwKKwkJCQkJCQkJKFN0cmluZykgZHNsTWV0YWRhdGFTZXJ2aWNlLmdldFRyYW5zbGF0aW9ucygpCisJCQkJCQkJCQkJLmdldChsb2NhbGUpLmdldChrZXkpKTsKKwkJCQkJfSBjYXRjaCAoQ3VzdG9tTXNnRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUxPR0dFUi5lcnJvcigie30iLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vQ29sb3JVdGlsaXRpZXMuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vQ29sb3JVdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgxYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9Db2xvclV0aWxpdGllcy5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQ29sb3I7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiAgVXRpbGl0aWVzIHRvIGNvbnZlcnQgZGlmZmVyZW50IENvbG9yIHR5cGVzLgorICovCitwdWJsaWMgY2xhc3MgQ29sb3JVdGlsaXRpZXMgeworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbG9yVXRpbGl0aWVzLmNsYXNzKTsKKwkKKwkvKioKKwkgKiBAcGFyYW0gICBzb3VyY2UgIGEgY29sb3IgYXR0cmlidXRlIG9mIHRoZSBSZXBvcnQgRFNMIEdyYW1tYXIKKwkgKiBAcmV0dXJuICBhIEFXVCBjb2xvciBpcyB0aGUgc291cmNlIGlzIHBhcnNlYWJsZSBvciA8Y29kZT5qYXZhLmF3dC5Db2xvci5CTEFDSzwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBqYXZhLmF3dC5Db2xvciBjb252ZXJ0VG9Bd3RDb2xvcihDb2xvciBzb3VyY2UpIHsKKwkJcmV0dXJuIGNvbnZlcnRUb0F3dENvbG9yKHNvdXJjZS5nZXRDb2xvcigpKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtICAgc291cmNlICBhIGNvbG9yIHN0cmluZyB2YWx1ZQorCSAqIEByZXR1cm4gIGEgQVdUIGNvbG9yIGlzIHRoZSBzb3VyY2UgaXMgcGFyc2VhYmxlIG9yIDxjb2RlPmphdmEuYXd0LkNvbG9yLkJMQUNLPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGphdmEuYXd0LkNvbG9yIGNvbnZlcnRUb0F3dENvbG9yKFN0cmluZyBzb3VyY2UpIHsKKwkJamF2YS5hd3QuQ29sb3IgcmVzdWx0ID0gamF2YS5hd3QuQ29sb3IuQkxBQ0s7CisJCWlmCShzb3VyY2UgIT0gbnVsbCkgeworCQkJaWYJKHNvdXJjZS5jaGFyQXQoMCkgPT0gJyMnKSB7CisJCQkJaW50IHIgPSAwOworCQkJCWludCBnID0gMDsKKwkJCQlpbnQgYiA9IDA7CisJCQkJc3dpdGNoIChzb3VyY2UubGVuZ3RoKCkpIHsKKwkJCQkJY2FzZSAzOgorCQkJCQkJciA9IHBhcnNlSGV4KHNvdXJjZS5zdWJzdHJpbmcoMSwgMykpOworCQkJCQkJZyA9IHI7CisJCQkJCQliID0gcjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlyID0gcGFyc2VIZXgoIiIrc291cmNlLmNoYXJBdCgxKStzb3VyY2UuY2hhckF0KDEpKTsKKwkJCQkJCWcgPSBwYXJzZUhleCgiIitzb3VyY2UuY2hhckF0KDIpK3NvdXJjZS5jaGFyQXQoMikpOworCQkJCQkJYiA9IHBhcnNlSGV4KCIiK3NvdXJjZS5jaGFyQXQoMykrc291cmNlLmNoYXJBdCgzKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA3OgorCQkJCQkJciA9IHBhcnNlSGV4KHNvdXJjZS5zdWJzdHJpbmcoMSwgMykpOworCQkJCQkJZyA9IHBhcnNlSGV4KHNvdXJjZS5zdWJzdHJpbmcoMywgNSkpOworCQkJCQkJYiA9IHBhcnNlSGV4KHNvdXJjZS5zdWJzdHJpbmcoNSwgNykpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlsb2cuZXJyb3IoImNvbnZlcnRUb0F3dENvbG9yKCk6IGhleCAnIitzb3VyY2UrIicgaXMgbm90IHBhcnNlYWJsZSBkdWUgdG8gd3JvbmcgdmFsdWUgbGVuZ3RoISIpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJlc3VsdCA9IG5ldyBqYXZhLmF3dC5Db2xvcihyLCBnLCBiKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxvZy5lcnJvcigiY29udmVydFRvQXd0Q29sb3IoKTogc3RyaW5nICciK3NvdXJjZSsiJyBpcyBub3QgcGFyc2VhYmxlIGR1ZSB0byB3cm9uZyB2YWx1ZSBmb3JtYXQhIFBsZWFzZSB1c2UgI3JyZ2diYiBmb3JtYXQhIik7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlsb2cuZXJyb3IoImNvbnZlcnRUb0F3dENvbG9yKCk6IHN0cmluZyAnPG51bGw+JyBpcyBub3QgcGFyc2VhYmxlISIpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGludCBwYXJzZUhleChTdHJpbmcgaGV4KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gSW50ZWdlci5kZWNvZGUoIjB4IitoZXgpOworCQl9CisJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQlsb2cuZXJyb3IoImNvbnZlcnRUb0F3dENvbG9yKCk6IGhleCAnIitoZXgrIicgaXMgbm90IHBhcnNlYWJsZSEiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9EYXRhVHlwZXMuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vRGF0YVR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxYWYwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vRGF0YVR5cGVzLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnNxbC5UeXBlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQuY29yZS5kYXRhLkRhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5EZXNpZ25DaG9pY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQuRVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuanZtbW9kZWwuRGF0YW1hcnREU0xKdm1Nb2RlbEluZmVycmVyOworCisKKworcHVibGljIGVudW0gRGF0YVR5cGVzIHsKKwkKKwlTVFJJTkcoRGF0YVR5cGUuU1RSSU5HX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX1NUUklORywgIlN0cmluZyIsIFR5cGVzLkNIQVIsIFN0cmluZy5jbGFzcyksCisJQklHREVDSU1BTChEYXRhVHlwZS5ERUNJTUFMX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0RFQ0lNQUwsICJCaWdEZWNpbWFsIiwgVHlwZXMuREVDSU1BTCwgQmlnRGVjaW1hbC5jbGFzcywgRG91YmxlLmNsYXNzLCBGbG9hdC5jbGFzcyksCisJVElNRVNUQU1QKERhdGFUeXBlLkRBVEVfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfREFURVRJTUUsICJUaW1lc3RhbXAiLCBUeXBlcy5USU1FU1RBTVAsIFRpbWVzdGFtcC5jbGFzcyksCisJQkxPQihEYXRhVHlwZS5CTE9CX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0JMT0IsICJCbG9iIiwgVHlwZXMuQkxPQiAvKiwgLmNsYXNzKi8pLAorCUJMT0JNQVBQSU5HKERhdGFUeXBlLkJMT0JfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfQkxPQiwgImJsb2JNYXBwaW5nIiwgVHlwZXMuQkxPQiAvKiwgLmNsYXNzKi8pLAorLy8gPz8/CUNMT0IoRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfQ0xPQiwgIkNsb2IiLCBUeXBlcy5DTE9CIC8qLCAuY2xhc3MqLyksCisJSU5URUdFUihEYXRhVHlwZS5JTlRFR0VSX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0lOVEVHRVIsICJJbnRlZ2VyIiwgVHlwZXMuSU5URUdFUiwgSW50ZWdlci5jbGFzcyksCisJSU5UKERhdGFUeXBlLklOVEVHRVJfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfSU5URUdFUiwgIkludCIsIFR5cGVzLklOVEVHRVIsIEludGVnZXIuY2xhc3MpLAorLy8gPz8/IHdoeSBub3QgdGhpcyA/Pz8JTE9ORyhEYXRhVHlwZS5ERUNJTUFMX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0RFQ0lNQUwsICJMb25nIiwgVHlwZXMuREVDSU1BTCwgTG9uZy5jbGFzcyksCisJTE9ORyhEYXRhVHlwZS5JTlRFR0VSX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0lOVEVHRVIsICJMb25nIiwgVHlwZXMuSU5URUdFUiwgTG9uZy5jbGFzcywgSW50ZWdlci5jbGFzcywgU2hvcnQuY2xhc3MpLAorCVNIT1JUKERhdGFUeXBlLklOVEVHRVJfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfSU5URUdFUiwgIlNob3J0IiwgVHlwZXMuSU5URUdFUiwgU2hvcnQuY2xhc3MpLAorCURBVEUoRGF0YVR5cGUuU1FMX0RBVEVfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfREFURSwgIkRhdGUiLCBUeXBlcy5EQVRFLCBEYXRlLmNsYXNzKSwKKwlUSU1FKERhdGFUeXBlLlNRTF9USU1FX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX1RJTUUsICJUaW1lIiwgVHlwZXMuVElNRSwgVGltZS5jbGFzcyksCisJQk9PTEVBTihEYXRhVHlwZS5CT09MRUFOX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0JPT0xFQU4sICJCb29sZWFuIiwgVHlwZXMuQk9PTEVBTiwgQm9vbGVhbi5jbGFzcyksCisJRE9VQkxFKERhdGFUeXBlLkRPVUJMRV9UWVBFLCBEZXNpZ25DaG9pY2VDb25zdGFudHMuQ09MVU1OX0RBVEFfVFlQRV9GTE9BVCwgIkRvdWJsZSIsIFR5cGVzLkRPVUJMRSwgRG91YmxlLmNsYXNzLCBGbG9hdC5jbGFzcyksCisJRkxPQVQoRGF0YVR5cGUuRE9VQkxFX1RZUEUsIERlc2lnbkNob2ljZUNvbnN0YW50cy5DT0xVTU5fREFUQV9UWVBFX0ZMT0FULCAiRmxvYXQiLCBUeXBlcy5ET1VCTEUsIEZsb2F0LmNsYXNzKSwKKwlPQkpFQ1QoRGF0YVR5cGUuSkFWQV9PQkpFQ1RfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfSkFWQV9PQkpFQ1QsICJPYmplY3QiLCBUeXBlcy5KQVZBX09CSkVDVCAvKiwgLmNsYXNzKi8pLAorCUJJTkFSWShEYXRhVHlwZS5CSU5BUllfVFlQRSwgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfQkxPQiwgIkJpbmFyeSIsIFR5cGVzLkJJTkFSWSAvKiwgLmNsYXNzKi8pLAorCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJQU5ZKERhdGFUeXBlLkFOWV9UWVBFLCBEZXNpZ25DaG9pY2VDb25zdGFudHMuQ09MVU1OX0RBVEFfVFlQRV9BTlksICJhbnkiLCBUeXBlcy5PVEhFUik7CisJCisJcHJpdmF0ZSBEYXRhVHlwZXMoaW50IGJpcnREYXRhVHlwZUlkLCBTdHJpbmcgbmF0aXZlRGF0YVR5cGVOYW1lLCBTdHJpbmcgb2RhU2NhbGFEYXRhVHlwZU5hbWUsIGludCBzcWxEYXRhVHlwZUlkLCBDbGFzczw/Pi4uLnN1cHBvcnRlZENsYXNzZXMpIHsKKwkJZkJpcnREYXRhVHlwZUlkID0gYmlydERhdGFUeXBlSWQ7CisJCWZOYXRpdmVPZGFEYXRhVHlwZU5hbWUgPSBuYXRpdmVEYXRhVHlwZU5hbWU7CisJCWZPZGFTY2FsYURhdGFUeXBlTmFtZSA9IG9kYVNjYWxhRGF0YVR5cGVOYW1lOworCQlmTmF0aXZlT2RhRGF0YVR5cGVJZCA9IHNxbERhdGFUeXBlSWQ7CisJCWZTdXBwb3J0ZWRDbGFzc2VzID0gc3VwcG9ydGVkQ2xhc3NlczsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXROYXRpdmVPZGFEYXRhVHlwZU5hbWUoKSB7CisJCXJldHVybiBmTmF0aXZlT2RhRGF0YVR5cGVOYW1lOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldE9kYVNjYWxhRGF0YVR5cGVOYW1lKCkgeworCQlyZXR1cm4gZk9kYVNjYWxhRGF0YVR5cGVOYW1lOworCX0KKwlwdWJsaWMgaW50IGdldE5hdGl2ZU9kYURhdGFUeXBlSWQoKSB7CisJCXJldHVybiBmTmF0aXZlT2RhRGF0YVR5cGVJZDsKKwl9CisJcHVibGljIGludCBnZXRCaXJ0RGF0YVR5cGVJZCgpIHsKKwkJcmV0dXJuIGZCaXJ0RGF0YVR5cGVJZDsKKwl9CisJcHVibGljIFN0cmluZyBnZXRCaXJ0RGF0YVR5cGVOYW1lKCkgeworCQlyZXR1cm4gRGF0YVR5cGUuZ2V0TmFtZShmQmlydERhdGFUeXBlSWQpOworCX0KKworCS8qKgorCSAqIEBzZWUgaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9jZC9FMTMxOTBfMDEvbGlxdWlkZGF0YS9kb2NzODEveHF1ZXJ5L2RhdGF0eXBlcy5odG1sCisJICogQHNlZSBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2NkL0IxOTMwNl8wMS9qYXZhLjEwMi9iMTQxODgvZGF0YW1hcC5odG0jQ0hEQkpBR0gKKwkgKiBAcGFyYW0gc3FsUGxTcWxEYXRhVHlwZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlb2ZTcWxQbFNRTERhdGFUeXBlKFN0cmluZyBzcWxQbFNxbERhdGFUeXBlKSB7CisJCXN3aXRjaCAoc3FsUGxTcWxEYXRhVHlwZS50b1VwcGVyQ2FzZSgpKSB7CisJCQljYXNlICJDSEFSIjoKKwkJCWNhc2UgIkNIQVJBQ1RFUiI6CisJCQljYXNlICJTVFJJTkciOgorCQkJY2FzZSAiVkFSQ0hBUiI6CisJCQljYXNlICJWQVJDSEFSMiI6CisJCQkJcmV0dXJuIFNUUklORzsgLy8gb3JhY2xlLnNxbC5DSEFSIC8gamF2YS5sYW5nLlN0cmluZworCQkJY2FzZSAiTkNIQVIiOgorCQkJY2FzZSAiTlZBUkNIQVIyIjoKKwkJCQlyZXR1cm4gU1RSSU5HOyAvLyBvcmFjbGUuc3FsLk5DSEFSIC8gb3JhY2xlLnNxbC5OU3RyaW5nCisJCQljYXNlICJOQ0xPQiI6CisJCQkJcmV0dXJuIFNUUklORzsgLy8gb3JhY2xlLnNxbC5OQ0xPQiAvIG9yYWNsZS5zcWwuTkNMT0IKKwkJCWNhc2UgIlJBVyI6CisJCQljYXNlICJMT05HIFJBVyI6CisJCQkJcmV0dXJuIEJMT0I7IC8vIG9yYWNsZS5zcWwuUkFXIC8gYnl0ZVtdCisJCQljYXNlICJMT05HIjoKKwkJCQlyZXR1cm4gTE9ORzsKKwkJCWNhc2UgIkJJTkFSWV9JTlRFR0VSIjoKKwkJCWNhc2UgIk5BVFVSQUwiOgorCQkJY2FzZSAiTkFUVVJBTE4iOgorCQkJY2FzZSAiUExTX0lOVEVHRVIiOgorCQkJY2FzZSAiUE9TSVRJVkUiOgorCQkJY2FzZSAiUE9TSVRJVkVOIjoKKwkJCWNhc2UgIlNJR05UWVBFIjoKKwkJCWNhc2UgIklOVCI6CisJCQljYXNlICJJTlRFR0VSIjoKKwkJCQlyZXR1cm4gSU5URUdFUjsgLy8gb3JhY2xlLnNxbC5OVU1CRVIgLyBpbnQKKwkJCWNhc2UgIlNIT1JUIjoKKwkJCQlyZXR1cm4gU0hPUlQ7IC8vIG9yYWNsZS5zcWwuTlVNQkVSIC8gaW50CisJCQljYXNlICJERUMiOgorCQkJY2FzZSAiREVDSU1BTCI6CisJCQljYXNlICJOVU1CRVIiOgorCQkJY2FzZSAiTlVNRVJJQyI6CisJCQkJcmV0dXJuIEJJR0RFQ0lNQUw7IC8vIG9yYWNsZS5zcWwuTlVNQkVSIC8gamF2YS5tYXRoLkJpZ0RlY2ltYWwKKwkJCWNhc2UgIkRPVUJMRSBQUkVDSVNJT04iOgorCQkJY2FzZSAiRkxPQVQiOgorCQkJCXJldHVybiBCSUdERUNJTUFMOyAvLyBvcmFjbGUuc3FsLk5VTUJFUiAvIGRvdWJsZQorCQkJY2FzZSAiU01BTExJTlQiOgorCQkJCXJldHVybiBJTlRFR0VSOyAvLyBvcmFjbGUuc3FsLk5VTUJFUiAvIGludAorCQkJY2FzZSAiUkVBTCI6CisJCQkJcmV0dXJuIEJJR0RFQ0lNQUw7IC8vIG9yYWNsZS5zcWwuTlVNQkVSIC8gZmxvYXQKKwkJCWNhc2UgIkRBVEUiOgorCQkJCXJldHVybiBEQVRFOyAvLyBvcmFjbGUuc3FsLkRBVEUgLyBqYXZhLnNxbC5UaW1lc3RhbXAKKwkJCWNhc2UgIlRJTUVTVEFNUCI6CisJCQljYXNlICJUSU1FU1RBTVAgV0lUSCBUWiI6CisJCQljYXNlICJUSU1FU1RBTVAgV0lUSCBMT0NBTCBUWiI6CisJCQkJcmV0dXJuIFRJTUVTVEFNUDsgLy8gb3JhY2xlLnNxbC5USU1FU1RBTVAgLyBvcmFjbGUuc3FsLlRJTUVTVEFNUFRaIC8gb3JhY2xlLnNxbC5USU1FU1RBTVBMVFogLyBqYXZhLnNxbC5UaW1lc3RhbXAKKwkJCWNhc2UgIklOVEVSVkFMIFlFQVIgVE8gTU9OVEgiOgorCQkJY2FzZSAiSU5URVJWQUwgREFZIFRPIFNFQ09ORCI6CisJCQkJcmV0dXJuIFNUUklORzsgLy8gU3RyaW5nCisvLwkJCWNhc2UgIlJPV0lEIjoKKy8vCQkJY2FzZSAiVVJPV0lEIjoKKy8vCQkJCS8vIG9yYWNsZS5zcWwuUk9XSUQgLyBvcmFjbGUuc3FsLlJPV0lECisJCQljYXNlICJCT09MRUFOIjoKKwkJCQlyZXR1cm4gQk9PTEVBTjsgLy8gYm9vbGVhbiAvIGJvb2xlYW4KKwkJCWNhc2UgIkNMT0IiOgorCQkJCXJldHVybiBTVFJJTkc7IC8vIG9yYWNsZS5zcWwuQ0xPQiAvIGphdmEuc3FsLkNsb2IKKwkJCWNhc2UgIkJMT0IiOgorCQkJCXJldHVybiBCTE9COyAvLyBvcmFjbGUuc3FsLkJMT0IgLyBqYXZhLnNxbC5CbG9iCisJCQljYXNlICJCRklMRSI6CisJCQkJcmV0dXJuIEJMT0I7IC8vIG9yYWNsZS5zcWwuQkZJTEUgLyBvcmFjbGUuc3FsLkJGSUxFCisvL09iamVjdCB0eXBlcyAvIEdlbmVyYXRlZCBjbGFzcyAvIEdlbmVyYXRlZCBjbGFzcworLy9TUUxKIG9iamVjdCB0eXBlcyAvIEphdmEgY2xhc3MgZGVmaW5lZCBhdCB0eXBlIGNyZWF0aW9uIC8gSmF2YSBjbGFzcyBkZWZpbmVkIGF0IHR5cGUgY3JlYXRpb24KKy8vT1BBUVVFIHR5cGVzIC8gR2VuZXJhdGVkIG9yIHByZWRlZmluZWQgY2xhc3MgLyBHZW5lcmF0ZWQgb3IgcHJlZGVmaW5lZCBjbGFzcworLy9SRUNPUkQgdHlwZXMgLyBUaHJvdWdoIG1hcHBpbmcgdG8gU1FMIG9iamVjdCB0eXBlIC8gVGhyb3VnaCBtYXBwaW5nIHRvIFNRTCBvYmplY3QgdHlwZQorLy9OZXN0ZWQgdGFibGUsIFZBUlJBWSAvIEdlbmVyYXRlZCBjbGFzcyBpbXBsZW1lbnRlZCB1c2luZyBvcmFjbGUuc3FsLkFSUkFZIC8gamF2YS5zcWwuQXJyYXkKKy8vUmVmZXJlbmNlIHRvIG9iamVjdCB0eXBlIC8gR2VuZXJhdGVkIGNsYXNzIGltcGxlbWVudGVkIHVzaW5nIG9yYWNsZS5zcWwuUkVGIC8gamF2YS5zcWwuUmVmCisvL1JFRiBDVVJTT1IgLyBqYXZhLnNxbC5SZXN1bHRTZXQgLyBqYXZhLnNxbC5SZXN1bHRTZXQKKy8vSW5kZXgtYnkgdGFibGVzIC8gVGhyb3VnaCBtYXBwaW5nIHRvIFNRTCBjb2xsZWN0aW9uIC8gVGhyb3VnaCBtYXBwaW5nIHRvIFNRTCBjb2xsZWN0aW9uCisvL1NjYWxhciAobnVtZXJpYyBvciBjaGFyYWN0ZXIpIC8gSW5kZXgtYnkgdGFibGVzIC8gVGhyb3VnaCBtYXBwaW5nIHRvIEphdmEgYXJyYXkgLyBUaHJvdWdoIG1hcHBpbmcgdG8gSmF2YSBhcnJheQorLy9Vc2VyLWRlZmluZWQgc3VidHlwZXMgLyBTYW1lIGFzIGZvciBiYXNlIHR5cGUgLyBTYW1lIGFzIGZvciBiYXNlIHR5cGUKKwkJfQorCQlyZXR1cm4gQU5ZOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlT2YoU3RyaW5nIGRhdGFUeXBlKSB7CisJCWlmCShkYXRhVHlwZSAhPSBudWxsKSB7CisJCWZvcgkoRGF0YVR5cGVzIHN0ZXAgOiB2YWx1ZXMoKSkgeworCQkJaWYJKGRhdGFUeXBlLmVxdWFsc0lnbm9yZUNhc2Uoc3RlcC5mTmF0aXZlT2RhRGF0YVR5cGVOYW1lKSkgeworCQkJCXJldHVybiBzdGVwOworCQkJfQorCQkJaWYJKGRhdGFUeXBlLmVxdWFsc0lnbm9yZUNhc2Uoc3RlcC5mT2RhU2NhbGFEYXRhVHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIHN0ZXA7CisJCQl9CisJCQlpZgkoZGF0YVR5cGUuZXF1YWxzSWdub3JlQ2FzZShzdGVwLmdldEJpcnREYXRhVHlwZU5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gc3RlcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEFOWTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBEYXRhVHlwZXMgdHlwZU9mTmF0aXZlRGF0YVR5cGUoU3RyaW5nIG5hdGl2ZURhdGFUeXBlKSB7CisJCWZvcgkoRGF0YVR5cGVzIHN0ZXAgOiB2YWx1ZXMoKSkgeworCQkJaWYJKG5hdGl2ZURhdGFUeXBlLmVxdWFsc0lnbm9yZUNhc2Uoc3RlcC5mTmF0aXZlT2RhRGF0YVR5cGVOYW1lKSkgeworCQkJCXJldHVybiBzdGVwOworCQkJfQorCQl9CisJCXJldHVybiBBTlk7CisJfQorCisJcHVibGljIHN0YXRpYyBEYXRhVHlwZXMgdHlwZU9mT2RhU2NhbGFEYXRhVHlwZShTdHJpbmcgb2RhU2NhbGFEYXRhVHlwZSkgeworCQlmb3IJKERhdGFUeXBlcyBzdGVwIDogdmFsdWVzKCkpIHsKKwkJCWlmCShvZGFTY2FsYURhdGFUeXBlLmVxdWFsc0lnbm9yZUNhc2Uoc3RlcC5mT2RhU2NhbGFEYXRhVHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIHN0ZXA7CisJCQl9CisJCX0KKwkJcmV0dXJuIEFOWTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlT2ZCaXJ0RGF0YVR5cGUoU3RyaW5nIGJpcnREYXRhVHlwZSkgeworCQlmb3IJKERhdGFUeXBlcyBzdGVwIDogdmFsdWVzKCkpIHsKKwkJCWlmCShiaXJ0RGF0YVR5cGUuZXF1YWxzSWdub3JlQ2FzZShzdGVwLmdldEJpcnREYXRhVHlwZU5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gc3RlcDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQU5ZOworCX0KKworCXB1YmxpYyBzdGF0aWMgRGF0YVR5cGVzIHR5cGVPZk5hdGl2ZU9kYURhdGFUeXBlKGludCBuYXRpdmVPZGFEYXRhVHlwZSkgeworCQlmb3IJKERhdGFUeXBlcyBzdGVwIDogdmFsdWVzKCkpIHsKKwkJCWlmCShuYXRpdmVPZGFEYXRhVHlwZSA9PSBzdGVwLmZOYXRpdmVPZGFEYXRhVHlwZUlkKSB7CisJCQkJcmV0dXJuIHN0ZXA7CisJCQl9CisJCX0KKwkJcmV0dXJuIEFOWTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlT2ZCaXJ0RGF0YVR5cGUoaW50IGJpcnREYXRhVHlwZSkgeworCQlmb3IJKERhdGFUeXBlcyBzdGVwIDogdmFsdWVzKCkpIHsKKwkJCWlmCShiaXJ0RGF0YVR5cGUgPT0gc3RlcC5mQmlydERhdGFUeXBlSWQpIHsKKwkJCQlyZXR1cm4gc3RlcDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQU5ZOworCX0KKworCS8qKgorCSAqIEBzZWUge0BsaW5rIERhdGFtYXJ0RFNMSnZtTW9kZWxJbmZlcnJlciNldmFsdWF0ZUV4cHJlc3Npb24ob3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5FeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RW50aXR5KX0KKwkgKiBEYXRhbWFydEVudGl0eS5wcm9wZXJ0aWVzID09IERhdGFtYXJ0UHJvcGVydHkKKwkgKiA8cHJlPgorCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGF0YW1hcnRQcm9wZXJ0eSkgeworCQlldmFsdWF0aW9uID0gJycnwqsoZWxlbWVudCBhcyBEYXRhbWFydFByb3BlcnR5KS5nZXRQcm9wZXJ0eU5hbWUoZmFsc2UsIGVudGl0eSnCuycnJworCQl2YXIgdHlwZSA9IChlbGVtZW50IGFzIERhdGFtYXJ0UHJvcGVydHkpLnByb3BlcnR5UmVmLnR5cGUKKwkJdmFyIHR5cGVOYW1lID0gIiIKKwkJaWYgKHR5cGUgIT0gbnVsbCAmJiAodHlwZSBpbnN0YW5jZW9mIExEYXRhVHlwZSkgJiYgKHR5cGUgYXMgTERhdGFUeXBlKS5qdm1UeXBlUmVmZXJlbmNlIT1udWxsKXsKKwkJCXR5cGVOYW1lID0gKHR5cGUgYXMgTERhdGFUeXBlKS5qdm1UeXBlUmVmZXJlbmNlLnNpbXBsZU5hbWUKKwkJfSBlbHNlIHsKKwkJCXR5cGVOYW1lID0gdHlwZS5uYW1lCisJCX0KKwkJaWYgKCF0eXBlTmFtZS5lcXVhbHMoIlN0cmluZyIpKSB7CisJCQlldmFsdWF0aW9uID0gJycndG9fY2hhcijCq2V2YWx1YXRpb27CuyknJycKKwkJfSAgIAorCX0KKwkJPC9wcmU+CisJICogCisJICovCisJcHVibGljIHN0YXRpYyBEYXRhVHlwZXMgdHlwZU9mT2RhU2NhbGFEYXRhVHlwZShEYXRhbWFydFByb3BlcnR5IGRhdGFtYXJ0UHJvcGVydHkpIHsKKwkJTEVudGl0eUF0dHJpYnV0ZSBlbnRpdHlBdHRyaWJ1dGUgPSBkYXRhbWFydFByb3BlcnR5LmdldFByb3BlcnR5UmVmKCk7CisJCUxTY2FsYXJUeXBlIHNjYWxhclR5cGUgPSBudWxsOworCQlDbGFzczw/PiBmaW5kQ2xhc3MgPSBudWxsOworCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOworCQlpZgkoZW50aXR5QXR0cmlidXRlICE9IG51bGwpIHsKKwkJCXNjYWxhclR5cGUgPSBlbnRpdHlBdHRyaWJ1dGUuZ2V0VHlwZSgpOworCQl9CisJCWlmCShzY2FsYXJUeXBlIGluc3RhbmNlb2YgTERhdGFUeXBlKSB7CisJCQlmaW5kQ2xhc3MgPSBzY2FsYXJUeXBlLmdldENsYXNzKCk7CisJCQlpZgkoZmluZENsYXNzICE9IG51bGwpIHsKKwkJCQl0eXBlTmFtZSA9IGZpbmRDbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZgkoc2NhbGFyVHlwZSAhPSBudWxsKSB7CisJCQl0eXBlTmFtZSA9IHNjYWxhclR5cGUuZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiB0eXBlT2ZOYXRpdmVEYXRhVHlwZSh0eXBlTmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBEYXRhVHlwZXMgdHlwZUZvcihMRGF0YVR5cGUgZGF0YVR5cGUpIHsKKwkJaWYJKGRhdGFUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBEYXRhVHlwZXMuQU5ZOworCQl9CisJCWlmCShkYXRhVHlwZS5pc0RhdGUoKSkgeworCQkJcmV0dXJuIERhdGFUeXBlcy5EQVRFOworCQl9CisJCXJldHVybiB0eXBlT2YoZGF0YVR5cGUuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlRm9yKEVUeXBlIGVUeXBlKSB7CisJCXN3aXRjaCAoZVR5cGUpIHsKKwkJCWNhc2UgQk9PTEVBTjoKKwkJCQlyZXR1cm4gRGF0YVR5cGVzLkJPT0xFQU47CisJCQljYXNlIERBVEU6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5EQVRFOworCQkJY2FzZSBGTE9BVDoKKwkJCQlyZXR1cm4gRGF0YVR5cGVzLkZMT0FUOworCQkJY2FzZSBET1VCTEU6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5ET1VCTEU7CisJCQljYXNlIElOVEVHRVI6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5JTlQ7CisJCQljYXNlIFNIT1JUOgorCQkJCXJldHVybiBEYXRhVHlwZXMuU0hPUlQ7CisJCQljYXNlIExPTkc6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5MT05HOworCQkJY2FzZSBTVFJJTkc6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5TVFJJTkc7CisJCQljYXNlIFRJTUU6CisJCQkJcmV0dXJuIERhdGFUeXBlcy5USU1FOworCQkJY2FzZSBCTE9QTUFQUElORzoKKwkJCQlyZXR1cm4gRGF0YVR5cGVzLkJMT0JNQVBQSU5HOworCQkJY2FzZSBMRU5VTToKKwkJCQlyZXR1cm4gRGF0YVR5cGVzLklOVDsKKwkJfQorCQlyZXR1cm4gRGF0YVR5cGVzLkFOWTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlcyB0eXBlRm9yKE9iamVjdCBvYmplY3QpIHsKKwkJaWYJKG9iamVjdCBpbnN0YW5jZW9mIEVUeXBlKSB7CisJCQlyZXR1cm4gdHlwZUZvcigoRVR5cGUpb2JqZWN0KTsKKwkJfQorCQllbHNlIGlmCShvYmplY3QgaW5zdGFuY2VvZiBMRGF0YVR5cGUpIHsKKwkJCXJldHVybiB0eXBlRm9yKChMRGF0YVR5cGUpb2JqZWN0KTsKKwkJfQorCQllbHNlIGlmCShvYmplY3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIEFOWTsKKwkJfQorCQllbHNlIHsKKwkJCURhdGFUeXBlcyByZXRjb2RlID0gdHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7CisJCQlpZgkocmV0Y29kZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIEFOWTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJldHVybiByZXRjb2RlOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBEYXRhVHlwZXMgdHlwZUZvcihDbGFzczw/PiBmaW5kQ2xhc3MpIHsKKwkJZm9yCShEYXRhVHlwZXMgc3RlcCA6IHZhbHVlcygpKSB7CisJCQlpZgkoZmluZENsYXNzLmVxdWFscyhEYXRhVHlwZS5nZXRDbGFzcyhzdGVwLmZCaXJ0RGF0YVR5cGVJZCkpKSB7CisJCQkJcmV0dXJuIHN0ZXA7CisJCQl9CisJCQllbHNlIGlmCShzdGVwLmZTdXBwb3J0ZWRDbGFzc2VzICE9IG51bGwpIHsKKwkJCQlmb3IJKENsYXNzPD8+IHN1cHBvcnRlZENsYXNzIDogc3RlcC5mU3VwcG9ydGVkQ2xhc3NlcykgeworCQkJCQlpZgkoZmluZENsYXNzLmVxdWFscyhzdXBwb3J0ZWRDbGFzcykpIHsKKwkJCQkJCXJldHVybiBzdGVwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBBTlk7CisJfQorCQorCS8qKiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmJpcnQuY29yZS5kYXRhLkRhdGFUeXBlfSAqLworCXByaXZhdGUgZmluYWwgaW50IGZCaXJ0RGF0YVR5cGVJZDsKKwkvKiogc2VlIDxjb2RlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wbHVnaW4ueG1sOmRhdGFUeXBlTWFwcGluZzwvY29kZT4gKi8KKwlwcml2YXRlIGZpbmFsIGludCBmTmF0aXZlT2RhRGF0YVR5cGVJZDsKKwkvKiogc2VlIDxjb2RlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydC9wbHVnaW4ueG1sOmRhdGFUeXBlTWFwcGluZzwvY29kZT4KKwkgKiAgc2VlIGZvciBleGFtcGxlIHtAbGluayBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkNPTFVNTl9EQVRBX1RZUEVfU1RSSU5HfQorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGZOYXRpdmVPZGFEYXRhVHlwZU5hbWU7CisJLyoqIHNlZSB7QGxpbmsgamF2YS5zcWwuVHlwZXN9IGhhcyB0byBiZSBkZWZpbmVkIGluIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9yZC5kYXRhbWFydCAvIHB1Z2luLnhtbCAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGZPZGFTY2FsYURhdGFUeXBlTmFtZTsKKwlwcml2YXRlIGZpbmFsIENsYXNzPD8+W10gZlN1cHBvcnRlZENsYXNzZXM7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL09kYUNvbm5Qcm9wZXJ0aWVzLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL09kYUNvbm5Qcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlYmQ2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vT2RhQ29ublByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjbGFzcyB3aGljaCBob3N0cyB0aGUgZGVmaW5pdGlvbnMgb2YgcGFja2FnZS13aWRlIGNvbnN0YW50cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9kYUNvbm5Qcm9wZXJ0aWVzIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9CVU5ETEVOQU1FID0gImJ1bmRsZVN5bWJvbGljTmFtZSI7IC8vJE5PTl9OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9DTEFTU05BTUUgPSAiZGF0YW1hcnRDbGFzcyI7IC8vJE5PTl9OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBTUFSVF9EQVRBU09VUkNFID0gImRhdGFTb3VyY2UiOyAvLyROT05fTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU1BUlRfREFUQVNPVVJDRU5BTUUgPSAiZGF0YVNvdXJjZU5hbWUiOyAvLyROT05fTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU1BUlRfREFUQVNFVE5BTUUgPSAiZGF0YVNldE5hbWUiOyAvLyROT05fTkxTLTEkCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL1BkZlByaW50U2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9QZGZQcmludFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRmODhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9QZGZQcmludFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb247CisKK2ltcG9ydCBqYXZhLmF3dC5wcmludC5QcmludGVySm9iOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC5wcmludC5Eb2NGbGF2b3I7CitpbXBvcnQgamF2YXgucHJpbnQuUHJpbnRTZXJ2aWNlOworaW1wb3J0IGphdmF4LnByaW50LlByaW50U2VydmljZUxvb2t1cDsKK2ltcG9ydCBqYXZheC5wcmludC5hdHRyaWJ1dGUuSGFzaFByaW50UmVxdWVzdEF0dHJpYnV0ZVNldDsKK2ltcG9ydCBqYXZheC5wcmludC5hdHRyaWJ1dGUuUHJpbnRSZXF1ZXN0QXR0cmlidXRlU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5wZGZib3gucGRtb2RlbC5QRERvY3VtZW50OworaW1wb3J0IG9yZy5hcGFjaGUucGRmYm94LnByaW50aW5nLlBERlBhZ2VhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXIuSVVzZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBIYW5kbGUgYW5kIHVzZSBwcmludCBzZXJ2aWNlcyBhdmFpbGFibGUgb24gdGhlIHdlYiBzZXJ2ZXIKKyAqLworcHVibGljIGNsYXNzIFBkZlByaW50U2VydmljZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBkZlByaW50U2VydmljZS5jbGFzcyk7CisJcHJpdmF0ZSBzdGF0aWMgUHJpbnRTZXJ2aWNlW10gcHJpbnRTZXJ2aWNlczsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHByaW50IHNlcnZpY2UgbmFtZSBhZnRlciByZS1sb29raW5nIHVwIGF2YWlsYWJsZSBwcmludCBzZXJ2aWNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlTG9va3VwRGVmYXVsdFByaW50U2VydmljZU5hbWUoKSB7CisJCXJldHVybiByZUxvb2t1cERlZmF1bHRQcmludFNlcnZpY2VOYW1lKHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHByaW50IHNlcnZpY2UgbmFtZSB3aXRob3V0IHJlLWxvb2tpbmcgdXAgYXZhaWxhYmxlIHByaW50IHNlcnZpY2VzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va3VwRGVmYXVsdFByaW50U2VydmljZU5hbWUoKSB7CisJCXJldHVybiByZUxvb2t1cERlZmF1bHRQcmludFNlcnZpY2VOYW1lKGZhbHNlKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlTG9va3VwRGVmYXVsdFByaW50U2VydmljZU5hbWUoYm9vbGVhbiByZUxvb2t1cCkgeworCQlQcmludFNlcnZpY2VbXSBwc3MgPSByZUxvb2t1cFByaW50U2VydmljZXMocmVMb29rdXApOworCQlpZgkocHNzLmxlbmd0aCA+IDApIHsKKwkJCXJldHVybiBwc3NbMF0uZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgbGlzdCBvZiBhdmFpbGFibGUgcHJpbnQgc2VydmljZSBuYW1lcyBhZnRlciByZS1sb29raW5nIHVwIGF2YWlsYWJsZSBwcmludCBzZXJ2aWNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gcmVMb29rdXBQcmludFNlcnZpY2VOYW1lcygpIHsKKwkJcmV0dXJuIHJlTG9va3VwRGVmYXVsdFByaW50U2VydmljZU5hbWVzKHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgbGlzdCBvZiBhdmFpbGFibGUgcHJpbnQgc2VydmljZSBuYW1lcyB3aXRob3V0IHJlLWxvb2tpbmcgdXAgYXZhaWxhYmxlIHByaW50IHNlcnZpY2VzCisJICovCisJcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb29rdXBQcmludFNlcnZpY2VOYW1lcygpIHsKKwkJcmV0dXJuIHJlTG9va3VwRGVmYXVsdFByaW50U2VydmljZU5hbWVzKGZhbHNlKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gcmVMb29rdXBEZWZhdWx0UHJpbnRTZXJ2aWNlTmFtZXMoYm9vbGVhbiByZUxvb2t1cCkgeworCQlTZXQ8U3RyaW5nPiBwc24gPSBuZXcgVHJlZVNldDw+KCk7CisJCVByaW50U2VydmljZVtdIHBzcyA9IHJlTG9va3VwUHJpbnRTZXJ2aWNlcyhyZUxvb2t1cCk7CisJCWlmCShwc3MubGVuZ3RoID4gMCkgeworCQkJZm9yCShQcmludFNlcnZpY2UgcHMgOiBwc3MpIHsKKwkJCQlwc24uYWRkKHBzLmdldE5hbWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHBzbjsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcHJpbnQgc2VydmljZXMgYWZ0ZXIgcmUtbG9va2luZyB1cCBhdmFpbGFibGUgcHJpbnQgc2VydmljZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFByaW50U2VydmljZVtdIHJlTG9va3VwUHJpbnRTZXJ2aWNlcygpIHsKKwkJcmV0dXJuIHJlTG9va3VwUHJpbnRTZXJ2aWNlcyh0cnVlKTsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcHJpbnQgc2VydmljZXMgd2l0aG91dCByZS1sb29raW5nIHVwIGF2YWlsYWJsZSBwcmludCBzZXJ2aWNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgUHJpbnRTZXJ2aWNlW10gbG9va3VwUHJpbnRTZXJ2aWNlcygpIHsKKwkJcmV0dXJuIHJlTG9va3VwUHJpbnRTZXJ2aWNlcyhmYWxzZSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFByaW50U2VydmljZVtdIHJlTG9va3VwUHJpbnRTZXJ2aWNlcyhib29sZWFuIHJlTG9va3VwKSB7CisJCWlmCShyZUxvb2t1cCB8fCAocHJpbnRTZXJ2aWNlcyA9PSBudWxsKSkgeworCQkJRG9jRmxhdm9yIGZsYXZvciA9IERvY0ZsYXZvci5TRVJWSUNFX0ZPUk1BVFRFRC5QQUdFQUJMRTsKKwkJCVByaW50UmVxdWVzdEF0dHJpYnV0ZVNldCBwYXR0cyA9IG5ldyBIYXNoUHJpbnRSZXF1ZXN0QXR0cmlidXRlU2V0KCk7CisJCQkvL3BhdHRzLmFkZChTaWRlcy5EVVBMRVgpOworCQkJcHJpbnRTZXJ2aWNlcyA9IFByaW50U2VydmljZUxvb2t1cC5sb29rdXBQcmludFNlcnZpY2VzKGZsYXZvciwgcGF0dHMpOworCQl9CisJCXJldHVybiBwcmludFNlcnZpY2VzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcHJpbnQgc2VydmljZQorCSAqIEByZXR1cm4gdGhlIHByaW50IHNlcnZpY2UgaW5zdGFuY2Ugd2l0aG91dCByZS1sb29raW5nIHVwCisJICovCisJcHVibGljIHN0YXRpYyBQcmludFNlcnZpY2UgZ2V0UHJpbnRTZXJ2aWNlKFN0cmluZyBuYW1lKSB7CisJCVByaW50U2VydmljZVtdIHBzcyA9IGxvb2t1cFByaW50U2VydmljZXMoKTsKKwkJaWYJKHBzcy5sZW5ndGggPiAwKSB7CisJCQlmb3IJKFByaW50U2VydmljZSBwcyA6IHBzcykgeworCQkJCWlmCShuYW1lLmVxdWFscyhwcy5nZXROYW1lKCkpKSB7CisJCQkJCXJldHVybiBwczsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHBzc1swXTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGJhc2VSZXBvcnQgdGhlIHJlcG9ydCB0byBiZSBwcmludGVkIGFzIHBkZgorCSAqIEBwYXJhbSBwcmludFNlcnZpY2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmludGVyIHNlcnZpY2UgdG8gYmUgdXNlZCB0byBwcmludCwgb3IgPGNvZGU+UGRmUHJpbnRTZXJ2aWNlLkRFRkFVTFRfUFJJTlRFUjwvY29kZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRSZXBvcnRBc1BkZihCYXNlUmVwb3J0IGJhc2VSZXBvcnQsIFN0cmluZyBwcmludFNlcnZpY2VOYW1lKSB7CisJCXByaW50UmVwb3J0QXNQZGYoYmFzZVJlcG9ydC5nZXRQREZQcmludCgpLCBwcmludFNlcnZpY2VOYW1lKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIHBkZklucHV0U3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgcGRmCisJICogQHBhcmFtIHByaW50U2VydmljZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZXIgc2VydmljZSB0byBiZSB1c2VkIHRvIHByaW50LCBvciA8Y29kZT5QZGZQcmludFNlcnZpY2UuREVGQVVMVF9QUklOVEVSPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFJlcG9ydEFzUGRmKElucHV0U3RyZWFtIHBkZklucHV0U3RyZWFtLCBTdHJpbmcgcHJpbnRTZXJ2aWNlTmFtZSkgeworCQlQcmludFNlcnZpY2UgcHJpbnRTZXJ2aWNlID0gZ2V0UHJpbnRTZXJ2aWNlKHByaW50U2VydmljZU5hbWUpOworCQlpZgkocHJpbnRTZXJ2aWNlICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCSAgICAgICAgUEREb2N1bWVudCBkb2N1bWVudCA9IFBERG9jdW1lbnQubG9hZChwZGZJbnB1dFN0cmVhbSk7CisJCSAgICAgICAgUHJpbnRlckpvYiBqb2IgPSBQcmludGVySm9iLmdldFByaW50ZXJKb2IoKTsKKwkJICAgICAgICBqb2Iuc2V0UGFnZWFibGUobmV3IFBERlBhZ2VhYmxlKGRvY3VtZW50KSk7CisJCSAgICAgICAgam9iLnNldFByaW50U2VydmljZShwcmludFNlcnZpY2UpOworCQkgICAgICAgIGpvYi5wcmludCgpOworCSAgICAgICAgfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HR0VSLmVycm9yKCJlcnJvciB3aGlsZSBwcmludGluZyBwZGYgaW5wdXQgc3RyZWFtIHRvICIrcHJpbnRTZXJ2aWNlTmFtZSwgZSk7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQHBhcmFtIHBkZklucHV0U3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgcGRmCisJICogQHBhcmFtIHByaW50U2VydmljZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZXIgc2VydmljZSB0byBiZSB1c2VkIHRvIHByaW50LCBvciA8Y29kZT5QZGZQcmludFNlcnZpY2UuREVGQVVMVF9QUklOVEVSPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFJlcG9ydEFzUGRmKEZpbGUgcGRmRmlsZSwgU3RyaW5nIHByaW50U2VydmljZU5hbWUpIHsKKwkJUHJpbnRTZXJ2aWNlIHByaW50U2VydmljZSA9IGdldFByaW50U2VydmljZShwcmludFNlcnZpY2VOYW1lKTsKKwkJaWYJKHByaW50U2VydmljZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkgICAgICAgIFBERG9jdW1lbnQgZG9jdW1lbnQgPSBQRERvY3VtZW50LmxvYWQocGRmRmlsZSk7CisJCSAgICAgICAgUHJpbnRlckpvYiBqb2IgPSBQcmludGVySm9iLmdldFByaW50ZXJKb2IoKTsKKwkJICAgICAgICBqb2Iuc2V0UGFnZWFibGUobmV3IFBERlBhZ2VhYmxlKGRvY3VtZW50KSk7CisJCSAgICAgICAgam9iLnNldFByaW50U2VydmljZShwcmludFNlcnZpY2UpOworCQkgICAgICAgIGpvYi5wcmludCgpOworCSAgICAgICAgfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HR0VSLmVycm9yKCJlcnJvciB3aGlsZSBwcmludGluZyBwZGYgZmlsZSB0byAiK3ByaW50U2VydmljZU5hbWUsIGUpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9QZGZTdHJlYW1SZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9QZGZTdHJlYW1SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2I3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL1BkZlN0cmVhbVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyLlJlbmRlcmluZzsKKworaW1wb3J0IGNvbS52YWFkaW4uc2VydmVyLkRvd25sb2FkU3RyZWFtOworaW1wb3J0IGNvbS52YWFkaW4uc2VydmVyLlN0cmVhbVJlc291cmNlOworCitwdWJsaWMgY2xhc3MgUGRmU3RyZWFtUmVzb3VyY2UgZXh0ZW5kcyBTdHJlYW1SZXNvdXJjZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDQwODAyNDQ0NTY4NTMzODIzN0w7CisJcHJpdmF0ZSBmaW5hbCBSZW5kZXJpbmcgZlJlbmRlcmVyOworCQorCXB1YmxpYyBQZGZTdHJlYW1SZXNvdXJjZShSZW5kZXJpbmcgcmVuZGVyZXIsIEJhc2VSZXBvcnQgYmFzZVJlcG9ydCwgU3RyaW5nIHJlcG9ydEZpbGVhbWUpIHsKKwkJc3VwZXIoYmFzZVJlcG9ydCwgcmVwb3J0RmlsZWFtZSk7CisJCWZSZW5kZXJlciA9IHJlbmRlcmVyOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEb3dubG9hZFN0cmVhbSBnZXRTdHJlYW0oKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQmFzZVJlcG9ydCAiK2dldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKyIgZ2V0U3RyZWFtKCkiKTsKKyAgICAgICAgZmluYWwgQmFzZVJlcG9ydCBzcyA9IChCYXNlUmVwb3J0KSBnZXRTdHJlYW1Tb3VyY2UoKTsKKyAgICAgICAgaWYgKHNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIERvd25sb2FkU3RyZWFtIGRzID0gbmV3IERvd25sb2FkU3RyZWFtKAorICAgICAgICAJCXNzLmdldFN0cmVhbShmUmVuZGVyZXIpLAorICAgICAgICAgICAgICAgIGdldE1JTUVUeXBlKCksCisgICAgICAgICAgICAgICAgZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIGRzLnNldEJ1ZmZlclNpemUoZ2V0QnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgZHMuc2V0Q2FjaGVUaW1lKGdldENhY2hlVGltZSgpKTsKKyAgICAgICAgcmV0dXJuIGRzOworICAgIH0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vUmVzb3VyY2VMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL1Jlc291cmNlTG9jYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDk0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL1Jlc291cmNlTG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbjsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLklSZXNvdXJjZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLk1vZHVsZUhhbmRsZTsKKworcHVibGljIGNsYXNzIFJlc291cmNlTG9jYXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZUxvY2F0b3IgeworCisJcHJpdmF0ZSBCYXNlUmVwb3J0IHJlcG9ydCA9IG51bGw7CisJCisJcHVibGljIFJlc291cmNlTG9jYXRvcihCYXNlUmVwb3J0IHJlcG9ydCkgeworCQlzdXBlcigpOworCQl0aGlzLnJlcG9ydCA9IHJlcG9ydDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShNb2R1bGVIYW5kbGUgbW9kdWxlSGFuZGxlLCBTdHJpbmcgZmlsZU5hbWUsIGludCB0eXBlKSB7CisJCXJldHVybiByZXBvcnQuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGZpbGVOYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShNb2R1bGVIYW5kbGUgbW9kdWxlSGFuZGxlLCBTdHJpbmcgZmlsZU5hbWUsCWludCB0eXBlLCBNYXAgYXBwQ29udGV4dCkgeworCQlyZXR1cm4gcmVwb3J0LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShmaWxlTmFtZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvQWx0VGV4dC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvQWx0VGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTFiODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9BbHRUZXh0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQWx0VGV4dCBleHRlbmRzIEl0ZW1UZXh0IHsKKwlwdWJsaWMgQWx0VGV4dChTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhcHBseShSZXBvcnRJdGVtSGFuZGxlIGl0ZW0pIHsKKwkJdHJ5IHsKKwkJCWl0ZW0uc2V0QWx0VGV4dCgoU3RyaW5nKSBmVmFsdWUpOworCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4OTBmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworCisKK3B1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlIHsKKwl2b2lkIGFwcGx5KFJlcG9ydEl0ZW1IYW5kbGUgaXRlbSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9IZWlnaHQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0hlaWdodC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTYxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9IZWlnaHQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5hdHRyaWJ1dGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuYWN0aXZpdHkuU2VtYW50aWNFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBIZWlnaHQgZXh0ZW5kcyBJdGVtRGltZW5zaW9uIHsKKwlwdWJsaWMgSGVpZ2h0KFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcih2YWx1ZSk7CisJfQorCXB1YmxpYyBIZWlnaHQoZG91YmxlIHZhbHVlKSB7CisJCXN1cGVyKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYXBwbHkoUmVwb3J0SXRlbUhhbmRsZSBpdGVtKSB7CisJCXRyeSB7CisJCQlpZgkoZlZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkJaXRlbS5zZXRIZWlnaHQoKFN0cmluZykgZlZhbHVlKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGZWYWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgeworCQkJCWl0ZW0uc2V0SGVpZ2h0KChEb3VibGUpIGZWYWx1ZSk7CisJCQl9CisJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvSXRlbURpbWVuc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvSXRlbURpbWVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2RhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9JdGVtRGltZW5zaW9uLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlOworCisKK2Fic3RyYWN0IGNsYXNzIEl0ZW1EaW1lbnNpb24gaW1wbGVtZW50cyBBdHRyaWJ1dGUgeworCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgZlZhbHVlOworCXB1YmxpYyBJdGVtRGltZW5zaW9uKFN0cmluZyB2YWx1ZSkgeworCQlmVmFsdWUgPSB2YWx1ZTsKKwl9CisJcHVibGljIEl0ZW1EaW1lbnNpb24oZG91YmxlIHZhbHVlKSB7CisJCWZWYWx1ZSA9IHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0l0ZW1Qcm9wZXJ0eS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvSXRlbVByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlZjExOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0l0ZW1Qcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5hY3Rpdml0eS5TZW1hbnRpY0V4Y2VwdGlvbjsKKworCithYnN0cmFjdCBjbGFzcyBJdGVtUHJvcGVydHkgZXh0ZW5kcyBJdGVtVGV4dCB7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBmUHJvcGVydHk7CisJcHVibGljIEl0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcih2YWx1ZSk7CisJCWZQcm9wZXJ0eSA9IHByb3BlcnR5OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShSZXBvcnRJdGVtSGFuZGxlIGl0ZW0pIHsKKwkJdHJ5IHsKKwkJCWl0ZW0uc2V0UHJvcGVydHkoZlByb3BlcnR5LCBmVmFsdWUpOworCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL0l0ZW1UZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9JdGVtVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmJmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9JdGVtVGV4dC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTsKKworCithYnN0cmFjdCBjbGFzcyBJdGVtVGV4dCBpbXBsZW1lbnRzIEF0dHJpYnV0ZSB7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBmVmFsdWU7CisJcHVibGljIEl0ZW1UZXh0KFN0cmluZyB2YWx1ZSkgeworCQlmVmFsdWUgPSB2YWx1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9Qb3NpdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvUG9zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE4MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvUG9zaXRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5hdHRyaWJ1dGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuYWN0aXZpdHkuU2VtYW50aWNFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBQb3NpdGlvbiBpbXBsZW1lbnRzIEF0dHJpYnV0ZSB7CisJcHJpdmF0ZSBPYmplY3QgZlg7CisJcHJpdmF0ZSBPYmplY3QgZlk7CisJCisJcHVibGljIFBvc2l0aW9uKFN0cmluZyB4LCBTdHJpbmcgeSkgeworCQlmWCA9IHg7CisJCWZZID0geTsKKwl9CisJcHVibGljIFBvc2l0aW9uKGRvdWJsZSB4LCBTdHJpbmcgeSkgeworCQlmWCA9IHg7CisJCWZZID0geTsKKwl9CisJcHVibGljIFBvc2l0aW9uKFN0cmluZyB4LCBkb3VibGUgeSkgeworCQlmWCA9IHg7CisJCWZZID0geTsKKwl9CisJcHVibGljIFBvc2l0aW9uKGRvdWJsZSB4LCBkb3VibGUgeSkgeworCQlmWCA9IHg7CisJCWZZID0geTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYXBwbHkoUmVwb3J0SXRlbUhhbmRsZSBpdGVtKSB7CisJCXRyeSB7CisJCQlpZgkoZlggaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlpdGVtLnNldFgoKFN0cmluZykgZlgpOworCQkJfQorCQkJZWxzZSBpZiAoZlggaW5zdGFuY2VvZiBEb3VibGUpIHsKKwkJCQlpdGVtLnNldFgoKERvdWJsZSkgZlgpOworCQkJfQorCQkJaWYJKGZZIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkJaXRlbS5zZXRZKChTdHJpbmcpIGZZKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGZZIGluc3RhbmNlb2YgRG91YmxlKSB7CisJCQkJaXRlbS5zZXRZKChEb3VibGUpIGZZKTsKKwkJCX0KKwkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSAKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9TdHlsZU5hbWUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1N0eWxlTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDU1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2F0dHJpYnV0ZS9TdHlsZU5hbWUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5hdHRyaWJ1dGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuYWN0aXZpdHkuU2VtYW50aWNFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmNvbW1hbmQuU3R5bGVFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBTdHlsZU5hbWUgZXh0ZW5kcyBJdGVtVGV4dCB7CisJcHVibGljIFN0eWxlTmFtZShTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhcHBseShSZXBvcnRJdGVtSGFuZGxlIGl0ZW0pIHsKKwkJdHJ5IHsKKwkJCWl0ZW0uc2V0U3R5bGVOYW1lKChTdHJpbmcpIGZWYWx1ZSk7CisJCX0KKwkJY2F0Y2ggKFN0eWxlRXhjZXB0aW9uIHNlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oc2UuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkrIjogIitzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQl9CisJCWNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1RleHRBbGlnbi5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvVGV4dEFsaWduLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMTA2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1RleHRBbGlnbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTsKKworCitwdWJsaWMgY2xhc3MgVGV4dEFsaWduIGV4dGVuZHMgSXRlbVByb3BlcnR5IHsKKwkKKwlwdWJsaWMgZW51bSBBbGlnbiB7CisJCWxlZnQsIGNlbnRlciwgcmlnaHQ7CisJfQorCQorCXB1YmxpYyBUZXh0QWxpZ24oQWxpZ24gdmFsdWUpIHsKKwkJc3VwZXIoInRleHRBbGlnbiIsIHZhbHVlLnRvU3RyaW5nKCkpOworCX0KKwlwdWJsaWMgVGV4dEFsaWduKFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcigidGV4dEFsaWduIiwgdmFsdWUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1ZlcnRpY2FsQWxpZ24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1ZlcnRpY2FsQWxpZ24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZiNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvVmVydGljYWxBbGlnbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZTsKKworCitwdWJsaWMgY2xhc3MgVmVydGljYWxBbGlnbiBleHRlbmRzIEl0ZW1Qcm9wZXJ0eSB7CisJCisJcHVibGljIGVudW0gQWxpZ24geworCQl0b3AsIG1pZGRsZSwgYm90dG9tOworCX0KKwkKKwlwdWJsaWMgVmVydGljYWxBbGlnbihBbGlnbiB2YWx1ZSkgeworCQlzdXBlcigidmVydGljYWxBbGlnbiIsIHZhbHVlLnRvU3RyaW5nKCkpOworCX0KKwlwdWJsaWMgVmVydGljYWxBbGlnbihTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIoInZlcnRpY2FsQWxpZ24iLCB2YWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9hdHRyaWJ1dGUvV2lkdGguamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1dpZHRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkYjc1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vYXR0cmlidXRlL1dpZHRoLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgV2lkdGggZXh0ZW5kcyBJdGVtRGltZW5zaW9uIHsKKwlwdWJsaWMgV2lkdGgoU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKHZhbHVlKTsKKwl9CisJcHVibGljIFdpZHRoKGRvdWJsZSB2YWx1ZSkgeworCQlzdXBlcih2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFwcGx5KFJlcG9ydEl0ZW1IYW5kbGUgaXRlbSkgeworCQl0cnkgeworCQkJaWYJKGZWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCWl0ZW0uc2V0V2lkdGgoKFN0cmluZykgZlZhbHVlKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGZWYWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgeworCQkJCWl0ZW0uc2V0V2lkdGgoKERvdWJsZSkgZlZhbHVlKTsKKwkJCX0KKwkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSAKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vQUNvbnRhaW5lckl0ZW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9BQ29udGFpbmVySXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmQyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vQUNvbnRhaW5lckl0ZW0uamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRGVzaWduRWxlbWVudEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbVRoZW1lSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TaGFyZWRTdHlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2xvdEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU3R5bGVIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5jb21tYW5kLkNvbnRlbnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmNvbW1hbmQuTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZC5TdHlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuRGVzaWduQ2hvaWNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5zdHJ1Y3R1cmVzLkhpZ2hsaWdodFJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLm1ldGFkYXRhLkRpbWVuc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmVsZW1lbnRzLmludGVyZmFjZXMuSVN0eWxlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQmFzZVN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkJvcmRlclN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1cnJlbmN5Rm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkN1c3RvbUZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRlVGltZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWFTdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuQnVpbGRJbkZvbnRGYW1pbHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGltZUZvcm1hdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Vb21vRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5Db2xvclV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUNvbnRhaW5lckl0ZW0gaW1wbGVtZW50cyBCYXNlSXRlbSB7CisKKwlwcm90ZWN0ZWQgZmluYWwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCBmV29ya3NldDsKKwkKKwlwdWJsaWMgQUNvbnRhaW5lckl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0KSB7CisJCWZXb3Jrc2V0ID0gd29ya3NldDsKKwl9CisJCisJYWJzdHJhY3QgU2xvdEhhbmRsZSBnZXRTbG90SGFuZGxlKCk7CisJCisJcHVibGljIHZvaWQgYWRkKEJhc2VJdGVtIGl0ZW0sIFN0eWxlIHN0eWxlLCBBdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJU2xvdEhhbmRsZSBjb250ZW50SGFuZGxlID0gZ2V0U2xvdEhhbmRsZSgpOworCQlSZXBvcnRJdGVtSGFuZGxlIGl0ZW1IYW5kbGUgPSBpdGVtLmdldEhhbmRsZSgpOworCQlhZGQoY29udGVudEhhbmRsZSwgaXRlbUhhbmRsZSwgc3R5bGUsIGF0dHJpYnV0ZXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGQoU2xvdEhhbmRsZSBjb250ZW50SGFuZGxlLCBSZXBvcnRJdGVtSGFuZGxlIGl0ZW1IYW5kbGUsIFN0eWxlIHN0eWxlLCBBdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgeworCQlpZgkoYXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQlmb3IJKEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKSB7CisJCQkJYXR0cmlidXRlLmFwcGx5KGl0ZW1IYW5kbGUpOworCQkJfQorCQl9CisJCXRyeSB7CisJCQljb250ZW50SGFuZGxlLmFkZChpdGVtSGFuZGxlKTsKKwkJCWlmCShzdHlsZSAhPSBudWxsKSB7CisJCQkJYXBwbHlTdHlsZShjb250ZW50SGFuZGxlLmdldEVsZW1lbnRIYW5kbGUoKSwgaXRlbUhhbmRsZSwgc3R5bGUpOworCQkJfQorCQl9CisJCWNhdGNoIChDb250ZW50RXhjZXB0aW9uIHwgTmFtZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYXBwbHlTdHlsZShEZXNpZ25FbGVtZW50SGFuZGxlIGRlc2lnbkhhbmRsZSwgRGVzaWduRWxlbWVudEhhbmRsZSBpdGVtSGFuZGxlLCBTdHlsZSBlbGVtZW50U3R5bGUsIFN0eWxlIGZvcmNlRXh0ZW5kcykgeworCQkvLyAtLS0gaWYgbm8gZXh0ZW5kcyBzdHlsZSBmb3JjaW5nIGlzIGdpdmVuIC0tLQorCQlpZgkoZm9yY2VFeHRlbmRzID09IG51bGwpIHsKKwkJCWFwcGx5U3R5bGUoZGVzaWduSGFuZGxlLCBpdGVtSGFuZGxlLCBlbGVtZW50U3R5bGUpOworCQl9CisJCS8vIC0tLSBubyBzcGVjaWFsIHN0eWxlIGlzIGdpdmVuIC0tLQorCQllbHNlIGlmCShlbGVtZW50U3R5bGUgPT0gbnVsbCkgeworCQkJYXBwbHlTdHlsZShkZXNpZ25IYW5kbGUsIGl0ZW1IYW5kbGUsIGZvcmNlRXh0ZW5kcyk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyAtLS0gc2F2ZSB0aGUgcHJldmlvdXMgZXh0ZW5kZWQgc3R5bGUgYW5kIHRoZSBwcmV2aW91cyBuYW1lIC0tLQorCQkJU3R5bGUgc2F2ZUV4dGVuZHMgPSBlbGVtZW50U3R5bGUuZ2V0RXh0ZW5kcygpOworCQkJU3RyaW5nIHNhdmVOYW1lID0gZWxlbWVudFN0eWxlLmdldE5hbWUoKTsKKworCQkJdHJ5IHsKKwkJCQkvLyAtLS0gc2V0IHRoZSBmb3JjZWQgZXh0ZW5kcyAtLS0KKwkJCQllbGVtZW50U3R5bGUuc2V0RXh0ZW5kcyhmb3JjZUV4dGVuZHMpOworCQkJCWVsZW1lbnRTdHlsZS5zZXROYW1lKGZvcmNlRXh0ZW5kcy5nZXROYW1lKCkrIl9fIitzYXZlTmFtZSk7CisJCQkJLy8gLS0tIG5vdyBhcHBseSB3aXRoIHRoZSB0ZW1wb3JhcmlseSBtb2RpZmllZCBzdHlsZSAtLS0KKwkJCQlhcHBseVN0eWxlKGRlc2lnbkhhbmRsZSwgaXRlbUhhbmRsZSwgZWxlbWVudFN0eWxlKTsKKwkJCX0KKwkJCWZpbmFsbHkgeworCQkJCS8vIC0tLSByZXN0b3JlIHRvIHRoZSBwcmV2aW91cyBleHRlbmRlZCBzdHlsZSBhbmQgdGhlIHByZXZpb3VzIG5hbWUgLS0tCisJCQkJZWxlbWVudFN0eWxlLnNldEV4dGVuZHMoc2F2ZUV4dGVuZHMpOworCQkJCWVsZW1lbnRTdHlsZS5zZXROYW1lKHNhdmVOYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGFwcGx5U3R5bGUoRGVzaWduRWxlbWVudEhhbmRsZSBkZXNpZ25IYW5kbGUsIERlc2lnbkVsZW1lbnRIYW5kbGUgaXRlbUhhbmRsZSwgU3R5bGUgc3R5bGUpIHsKKwkJdHJ5IHsKKwkJCVNoYXJlZFN0eWxlSGFuZGxlIHN0eWxlSGFuZGxlID0gZldvcmtzZXQuZ2V0U3R5bGVIYW5kbGVCeU5hbWUoc3R5bGUpOworCQkJaWYJKHN0eWxlSGFuZGxlID09IG51bGwpIHsKKwkJCQlzdHlsZUhhbmRsZSA9IGZXb3Jrc2V0LmZhY3RvcnkubmV3U3R5bGUoc3R5bGUuZ2V0TmFtZSgpKTsKKwkJCQlhcHBseVN0eWxlKHN0eWxlSGFuZGxlLCBzdHlsZSk7CisJCQkJZldvcmtzZXQuZGVzaWduLmdldFNsb3QoUmVwb3J0SXRlbVRoZW1lSGFuZGxlLlNUWUxFU19TTE9UKS5hZGQoc3R5bGVIYW5kbGUpOworCQkJCWZXb3Jrc2V0LnB1dFN0eWxlSGFuZGxlQnlOYW1lKHN0eWxlLCBzdHlsZUhhbmRsZSk7CisJCQl9CisJCQlpdGVtSGFuZGxlLnNldFN0eWxlKHN0eWxlSGFuZGxlKTsKKwkJfQorCQljYXRjaCAoQ29udGVudEV4Y2VwdGlvbiB8IE5hbWVFeGNlcHRpb24gfCBTdHlsZUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFwcGx5U3R5bGUoU3R5bGVIYW5kbGUgc3R5bGVIYW5kbGUsIEJhc2VTdHlsZSBzdHlsZSkgeworCQkvLyAtLS0gaWYgdGhpcyBzdHlsZSBoYXMgbWVkaWEgc3BlY2lmaWMgYXR0cmlidXRlcywgYWRkIHRoZXNlIGF0dHJpYnV0ZXMgZmlyc3QgLS0tCisJCWlmCShzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7CisJCQlmb3IJKE1lZGlhU3R5bGUgbWVkaWFTdHlsZSA6ICgoU3R5bGUpIHN0eWxlKS5nZXRNZWRpYXN0eWxlcygpKSB7CisJCQkJaWYJKGZXb3Jrc2V0LmlzUmVxdWVzdGVkTWVkaWEobWVkaWFTdHlsZSkpIHsKKwkJCQkJYXBwbHlTdHlsZShzdHlsZUhhbmRsZSwgbWVkaWFTdHlsZSk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZgkoc3R5bGVIYW5kbGUuZ2V0QmFja2dyb3VuZENvbG9yKCkgPT0gbnVsbCB8fCAhc3R5bGVIYW5kbGUuZ2V0QmFja2dyb3VuZENvbG9yKCkuaXNTZXQoKSkgeworCQkJaWYJKHN0eWxlLmdldEJhY2tncm91bmRjb2xvcigpICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CQUNLR1JPVU5EX0NPTE9SX1BST1AsIGFwcGx5Q29sb3Ioc3R5bGUuZ2V0QmFja2dyb3VuZGNvbG9yKCkpKTsKKwkJCQkJaWYJKHN0eWxlLmdldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSAhPSBudWxsKSB7CisJCQkJCQlBcnJheUxpc3Q8SGlnaGxpZ2h0UnVsZT4gaGlnaGxpZ2h0UnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJCUhpZ2hsaWdodFJ1bGUgcnVsZSA9IG5ldyBIaWdobGlnaHRSdWxlKAorCQkJCQkJCQkiZXEiLCAvL29wLCAKKwkJCQkJCQkJbnVsbCwgLy8gdjEsIAorCQkJCQkJCQludWxsLCAKKwkJCQkJCQkJInJvd1swXSUyIiAvL3Rlc3RFeHByZQorCQkJCQkJCSk7CisJCQkJCQlydWxlLnNldFZhbHVlMSgiMSIpOworCQkJCQkJcnVsZS5zZXRQcm9wZXJ0eShIaWdobGlnaHRSdWxlLkJBQ0tHUk9VTkRfQ09MT1JfTUVNQkVSLCBhcHBseUNvbG9yKHN0eWxlLmdldEJhY2tncm91bmRjb2xvcl9hbHRlcm5hdGUoKSkpOworCQkJCQkJaGlnaGxpZ2h0UnVsZXMuYWRkKHJ1bGUpOworCQkJCQkJc3R5bGVIYW5kbGUuZ2V0RWxlbWVudCgpLnNldFByb3BlcnR5KElTdHlsZU1vZGVsLkhJR0hMSUdIVF9SVUxFU19QUk9QLCBoaWdobGlnaHRSdWxlcyk7CisJCQkJCQkKKwkJCQkJCS8qKiBUT0RPIGdlbmVyYXRlIGJsb2NrIGZvciBhbHRlcm5hdGUgYmFja2dyb3VuZCBjb2xvcgorCSAgICAgICAgICAgICAgICAgICAgPGxpc3QtcHJvcGVydHkgbmFtZT0iaGlnaGxpZ2h0UnVsZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0cnVjdHVyZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3BlcmF0b3IiPmVxPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZENvbG9yIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uIG5hbWU9InRlc3RFeHByIj5yb3dbMF0lMjwvZXhwcmVzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBuYW1lPSJ2YWx1ZTEiPjE8L2V4cHJlc3Npb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0cnVjdHVyZT4KKwkgICAgICAgICAgICAgICAgICAgIDwvbGlzdC1wcm9wZXJ0eT4KKwkJCQkJCSovCisJCQkJCX0KKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmCShzdHlsZUhhbmRsZS5nZXRDb2xvcigpID09IG51bGwgfHwgIXN0eWxlSGFuZGxlLmdldENvbG9yKCkuaXNTZXQoKSkgeworCQkJaWYJKHN0eWxlLmdldFRleHRjb2xvcigpICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5DT0xPUl9QUk9QLCBhcHBseUNvbG9yKHN0eWxlLmdldFRleHRjb2xvcigpKSk7CisJCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZgkoc3R5bGUuZ2V0Rm9ybWF0KCkgaW5zdGFuY2VvZiBVb21vRm9ybWF0KSB7CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoRGVzaWduQ2hvaWNlQ29uc3RhbnRzLk5VTUJFUl9GT1JNQVRfVFlQRV9DVVNUT00pOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0TnVtYmVyRm9ybWF0KCkgPT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0eWxlSGFuZGxlLnNldE51bWJlckZvcm1hdCgoKFVvbW9Gb3JtYXQpc3R5bGUuZ2V0Rm9ybWF0KCkpLmdldFJlcG9ydF9wYXR0ZXJuKCkpOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYJKHN0eWxlLmdldEZvcm1hdCgpIGluc3RhbmNlb2YgTnVtYmVyRm9ybWF0KSB7CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoKChOdW1iZXJGb3JtYXQpc3R5bGUuZ2V0Rm9ybWF0KCkpLmdldFJlcG9ydF9jYXRlZ29yeSgpLmdldExpdGVyYWwoKSk7CisJCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmCShzdHlsZUhhbmRsZS5nZXROdW1iZXJGb3JtYXQoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0TnVtYmVyRm9ybWF0KCgoTnVtYmVyRm9ybWF0KXN0eWxlLmdldEZvcm1hdCgpKS5nZXRSZXBvcnRfcGF0dGVybigpKTsKKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmCShzdHlsZS5nZXRGb3JtYXQoKSBpbnN0YW5jZW9mIEN1cnJlbmN5Rm9ybWF0KSB7CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0TnVtYmVyRm9ybWF0Q2F0ZWdvcnkoKChDdXJyZW5jeUZvcm1hdClzdHlsZS5nZXRGb3JtYXQoKSkuZ2V0UmVwb3J0X2NhdGVnb3J5KCkuZ2V0TGl0ZXJhbCgpKTsKKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJaWYJKHN0eWxlSGFuZGxlLmdldE51bWJlckZvcm1hdCgpID09IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzdHlsZUhhbmRsZS5zZXROdW1iZXJGb3JtYXQoKChDdXJyZW5jeUZvcm1hdClzdHlsZS5nZXRGb3JtYXQoKSkuZ2V0UmVwb3J0X3BhdHRlcm4oKSk7CisJCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZgkoc3R5bGUuZ2V0Rm9ybWF0KCkgaW5zdGFuY2VvZiBEYXRlVGltZUZvcm1hdCkgeworCQkJaWYJKHN0eWxlSGFuZGxlLmdldERhdGVUaW1lRm9ybWF0Q2F0ZWdvcnkoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0RGF0ZVRpbWVGb3JtYXRDYXRlZ29yeSgoKERhdGVUaW1lRm9ybWF0KXN0eWxlLmdldEZvcm1hdCgpKS5nZXRSZXBvcnRfY2F0ZWdvcnkoKS5nZXRMaXRlcmFsKCkpOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0RGF0ZVRpbWVGb3JtYXQoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0RGF0ZVRpbWVGb3JtYXQoKChEYXRlVGltZUZvcm1hdClzdHlsZS5nZXRGb3JtYXQoKSkuZ2V0UmVwb3J0X3BhdHRlcm4oKSk7CisJCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZgkoc3R5bGUuZ2V0Rm9ybWF0KCkgaW5zdGFuY2VvZiBEYXRlRm9ybWF0KSB7CisJCQlpZgkoc3R5bGVIYW5kbGUuZ2V0RGF0ZUZvcm1hdENhdGVnb3J5KCkgPT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0eWxlSGFuZGxlLnNldERhdGVGb3JtYXRDYXRlZ29yeSgoKERhdGVGb3JtYXQpc3R5bGUuZ2V0Rm9ybWF0KCkpLmdldFJlcG9ydF9jYXRlZ29yeSgpLmdldExpdGVyYWwoKSk7CisJCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmCShzdHlsZUhhbmRsZS5nZXREYXRlRm9ybWF0KCkgPT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0eWxlSGFuZGxlLnNldERhdGVGb3JtYXQoKChEYXRlRm9ybWF0KXN0eWxlLmdldEZvcm1hdCgpKS5nZXRSZXBvcnRfcGF0dGVybigpKTsKKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmCShzdHlsZS5nZXRGb3JtYXQoKSBpbnN0YW5jZW9mIFRpbWVGb3JtYXQpIHsKKwkJCWlmCShzdHlsZUhhbmRsZS5nZXRUaW1lRm9ybWF0Q2F0ZWdvcnkoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0VGltZUZvcm1hdENhdGVnb3J5KCgoVGltZUZvcm1hdClzdHlsZS5nZXRGb3JtYXQoKSkuZ2V0UmVwb3J0X2NhdGVnb3J5KCkuZ2V0TGl0ZXJhbCgpKTsKKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJaWYJKHN0eWxlSGFuZGxlLmdldFRpbWVGb3JtYXQoKSA9PSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0VGltZUZvcm1hdCgoKFRpbWVGb3JtYXQpc3R5bGUuZ2V0Rm9ybWF0KCkpLmdldFJlcG9ydF9wYXR0ZXJuKCkpOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYJKHN0eWxlSGFuZGxlLmdldFRleHRBbGlnbigpID09IG51bGwpIHsKKwkJCWlmCSghc3R5bGUuZ2V0VGV4dGFsaWduKCkuZ2V0TGl0ZXJhbCgpLmlzRW1wdHkoKSkgeworCQkJCXRyeSB7CisJCQkJCXN0eWxlSGFuZGxlLnNldFRleHRBbGlnbihzdHlsZS5nZXRUZXh0YWxpZ24oKS5nZXRMaXRlcmFsKCkpOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmICgoc3R5bGUuZ2V0Rm9ybWF0KCkgIT0gbnVsbCkgJiYgKCFzdHlsZS5nZXRGb3JtYXQoKS5nZXRUZXh0YWxpZ24oKS5nZXRMaXRlcmFsKCkuaXNFbXB0eSgpKSkgeworCQkJCXRyeSB7CisJCQkJCXN0eWxlSGFuZGxlLnNldFRleHRBbGlnbihzdHlsZS5nZXRGb3JtYXQoKS5nZXRUZXh0YWxpZ24oKS5nZXRMaXRlcmFsKCkpOworCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKy8vCQlzc2hIZWFkZXIuc2V0Rm9udFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5GT05UX1NUWUxFX0lUQUxJQyk7CisvLwkJc3NoSGVhZGVyLnNldEZvbnRXZWlnaHQoRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkZPTlRfV0VJR0hUX0JPTEQpOworLy8JCXNzaEhlYWRlci5nZXRCYWNrZ3JvdW5kQ29sb3IoKS5zZXRTdHJpbmdWYWx1ZSgieWVsbG93Iik7CisKKwkJaWYJKHN0eWxlLmdldEZvbnQoKSAhPSBudWxsKSB7CisJCQlhcHBseUZvbnQoc3R5bGVIYW5kbGUsIHN0eWxlLmdldEZvbnQoKSk7CisJCX0KKwkJCisJCWlmCShzdHlsZS5nZXRCb3JkZXJUb3AoKSAhPSBudWxsKSB7CisJCQlhcHBseUJvcmRlclRvcChzdHlsZUhhbmRsZSwgc3R5bGUuZ2V0Qm9yZGVyVG9wKCkpOworCQl9CisJCWlmCShzdHlsZS5nZXRCb3JkZXJCb3R0b20oKSAhPSBudWxsKSB7CisJCQlhcHBseUJvcmRlckJvdHRvbShzdHlsZUhhbmRsZSwgc3R5bGUuZ2V0Qm9yZGVyQm90dG9tKCkpOworCQl9CisJCWlmCShzdHlsZS5nZXRCb3JkZXJMZWZ0KCkgIT0gbnVsbCkgeworCQkJYXBwbHlCb3JkZXJMZWZ0KHN0eWxlSGFuZGxlLCBzdHlsZS5nZXRCb3JkZXJMZWZ0KCkpOworCQl9CisJCWlmCShzdHlsZS5nZXRCb3JkZXJSaWdodCgpICE9IG51bGwpIHsKKwkJCWFwcGx5Qm9yZGVyUmlnaHQoc3R5bGVIYW5kbGUsIHN0eWxlLmdldEJvcmRlclJpZ2h0KCkpOworCQl9CisJCQorCQlhcHBseVBhZGRpbmcoc3R5bGVIYW5kbGUsIHN0eWxlKTsKKwkJYXBwbHlNYXJnaW4oc3R5bGVIYW5kbGUsIHN0eWxlKTsKKworCQkvLyAtLS0gaWYgdGhpcyBzdHlsZSB3YXMgZXh0ZW5kZWQsIGFkZCB0aGVzZSBhdHRyaWJ1dGVzIGF0IGxhc3QgLS0tCisJCWlmCShzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7CisJCQlpZgkoKChTdHlsZSlzdHlsZSkuZ2V0RXh0ZW5kcygpICE9IG51bGwpIHsKKwkJCQlhcHBseVN0eWxlKHN0eWxlSGFuZGxlLCAoKFN0eWxlKXN0eWxlKS5nZXRFeHRlbmRzKCkpOworCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5Q29sb3IoQ29sb3IgY29sb3IpIHsKKwkJaWYJKGNvbG9yID09IG51bGwpIHsKKwkJCXJldHVybiAoU3RyaW5nKW51bGw7CisJCX0KKwkJZWxzZSBpZiAoY29sb3IuZ2V0Q29sb3IoKSA9PSBudWxsKSB7CisJCQlTdHJpbmcgcmVzdWx0ID0gYXBwbHlDb2xvcihjb2xvci5nZXRCYXNlY29sb3IoKSk7CisJCQlTdHJpbmcgdGFyZ2V0c3RyaW5nID0gbnVsbDsKKwkJCWRvdWJsZSB0YXJnZXRmYWN0b3IgPSAwOworCQkJdHJ5IHsKKwkJCQlpZgkoY29sb3IuZ2V0RGFya2Vuc2J5KCkgIT0gbnVsbCkgeworCQkJCQl0YXJnZXRmYWN0b3IgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIGNvbG9yLmdldERhcmtlbnNieSgpKSk7CisJCQkJCXRhcmdldHN0cmluZyA9ICIjMDAwMDAwIjsKKwkJCQl9CisJCQkJZWxzZSBpZgkoY29sb3IuZ2V0TGlnaHRlbnNieSgpICE9IG51bGwpIHsKKwkJCQkJdGFyZ2V0ZmFjdG9yID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBjb2xvci5nZXRMaWdodGVuc2J5KCkpKTsKKwkJCQkJdGFyZ2V0c3RyaW5nID0gIiNmZmZmZmYiOworCQkJCX0KKwkJCQllbHNlIGlmIChjb2xvci5nZXRUcmFuc2Zvcm1zYnkoKSAhPSBudWxsKSB7CisJCQkJCXRhcmdldGZhY3RvciA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgY29sb3IuZ2V0VHJhbnNmb3Jtc2J5KCkpKTsKKwkJCQkJdGFyZ2V0c3RyaW5nID0gYXBwbHlDb2xvcihjb2xvci5nZXRUYXJnZXRjb2xvcigpKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXRhcmdldGZhY3RvciA9IDA7CisJCQkJfQorCQkJCWlmCSh0YXJnZXRmYWN0b3IgIT0gMCkgeworCQkJCQlqYXZhLmF3dC5Db2xvciBzb3VyY2UgPSBDb2xvclV0aWxpdGllcy5jb252ZXJ0VG9Bd3RDb2xvcihyZXN1bHQpOworCQkJCQlqYXZhLmF3dC5Db2xvciB0YXJnZXQgPSBDb2xvclV0aWxpdGllcy5jb252ZXJ0VG9Bd3RDb2xvcih0YXJnZXRzdHJpbmcpOworCQkJCQlkb3VibGUgc291cmNlZmFjdG9yID0gMTAwLXRhcmdldGZhY3RvcjsgCisJCQkJCWludCByID0gKChpbnQpKCgoZG91YmxlKXRhcmdldC5nZXRSZWQoKSkqdGFyZ2V0ZmFjdG9yICsgKChkb3VibGUpc291cmNlLmdldFJlZCgpKnNvdXJjZWZhY3RvcikpKSAvIDEwMDsKKwkJCQkJaW50IGcgPSAoKGludCkoKChkb3VibGUpdGFyZ2V0LmdldEdyZWVuKCkpKnRhcmdldGZhY3RvciArICgoZG91YmxlKXNvdXJjZS5nZXRHcmVlbigpKnNvdXJjZWZhY3RvcikpKSAvIDEwMDsKKwkJCQkJaW50IGIgPSAoKGludCkoKChkb3VibGUpdGFyZ2V0LmdldEJsdWUoKSkqdGFyZ2V0ZmFjdG9yICsgKChkb3VibGUpc291cmNlLmdldEJsdWUoKSpzb3VyY2VmYWN0b3IpKSkgLyAxMDA7CisJCQkJCWludCBhID0gKChpbnQpKCgoZG91YmxlKXRhcmdldC5nZXRBbHBoYSgpKSp0YXJnZXRmYWN0b3IgKyAoKGRvdWJsZSlzb3VyY2UuZ2V0QWxwaGEoKSpzb3VyY2VmYWN0b3IpKSkgLyAxMDA7CisJCQkJCWlmCShhIDwgMjU1KSB7CisJCQkJCQlyZXN1bHQgPSBTdHJpbmcuZm9ybWF0KCJyZ2JhKCVkLCVkLCVkLCVmKSIsIHIsIGcsIGIsICgoZG91YmxlKWEpLzI1Ni4wKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXJlc3VsdCA9IFN0cmluZy5mb3JtYXQoIiMlMDJYJTAyWCUwMlgiLCByLCBnLCBiKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIGNvbG9yLmdldENvbG9yKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYXBwbHlQYWRkaW5nKFN0eWxlSGFuZGxlIHN0eWxlSGFuZGxlLCBCYXNlU3R5bGUgc3R5bGUpIHsKKwkJaWYJKCFzdHlsZUhhbmRsZS5nZXRQYWRkaW5nVG9wKCkuaXNTZXQoKSAmJiAhIk5VTEwiLmVxdWFscyhzdHlsZS5nZXRQYWRkaW5nVG9wVW5pdCgpLm5hbWUoKSkpIHsKKwkJCXRyeSB7CisJCQkJRGltZW5zaW9uVmFsdWUgZGltID0gbmV3IERpbWVuc2lvblZhbHVlKHN0eWxlLmdldFBhZGRpbmdUb3BWYWx1ZSgpLCBzdHlsZS5nZXRQYWRkaW5nVG9wVW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5QQURESU5HX1RPUF9QUk9QLCBkaW0udG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQlpZgkoIXN0eWxlSGFuZGxlLmdldFBhZGRpbmdCb3R0b20oKS5pc1NldCgpICYmICEiTlVMTCIuZXF1YWxzKHN0eWxlLmdldFBhZGRpbmdCb3R0b21Vbml0KCkubmFtZSgpKSkgeworCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoc3R5bGUuZ2V0UGFkZGluZ0JvdHRvbVZhbHVlKCksIHN0eWxlLmdldFBhZGRpbmdCb3R0b21Vbml0KCkubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJCXN0eWxlSGFuZGxlLnNldFByb3BlcnR5KElTdHlsZU1vZGVsLlBBRERJTkdfQk9UVE9NX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0UGFkZGluZ0xlZnQoKS5pc1NldCgpICYmICEiTlVMTCIuZXF1YWxzKHN0eWxlLmdldFBhZGRpbmdMZWZ0VW5pdCgpLm5hbWUoKSkpIHsKKwkJCXRyeSB7CisJCQkJRGltZW5zaW9uVmFsdWUgZGltID0gbmV3IERpbWVuc2lvblZhbHVlKHN0eWxlLmdldFBhZGRpbmdMZWZ0VmFsdWUoKSwgc3R5bGUuZ2V0UGFkZGluZ0xlZnRVbml0KCkubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJCXN0eWxlSGFuZGxlLnNldFByb3BlcnR5KElTdHlsZU1vZGVsLlBBRERJTkdfTEVGVF9QUk9QLCBkaW0udG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQlpZgkoIXN0eWxlSGFuZGxlLmdldFBhZGRpbmdSaWdodCgpLmlzU2V0KCkgJiYgISJOVUxMIi5lcXVhbHMoc3R5bGUuZ2V0UGFkZGluZ1JpZ2h0VW5pdCgpLm5hbWUoKSkpIHsKKwkJCXRyeSB7CisJCQkJRGltZW5zaW9uVmFsdWUgZGltID0gbmV3IERpbWVuc2lvblZhbHVlKHN0eWxlLmdldFBhZGRpbmdSaWdodFZhbHVlKCksIHN0eWxlLmdldFBhZGRpbmdSaWdodFVuaXQoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuUEFERElOR19SSUdIVF9QUk9QLCBkaW0udG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhcHBseU1hcmdpbihTdHlsZUhhbmRsZSBzdHlsZUhhbmRsZSwgQmFzZVN0eWxlIHN0eWxlKSB7CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0TWFyZ2luVG9wKCkuaXNTZXQoKSAmJiAhIk5VTEwiLmVxdWFscyhzdHlsZS5nZXRNYXJnaW5Ub3BVbml0KCkubmFtZSgpKSkgeworCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoc3R5bGUuZ2V0TWFyZ2luVG9wVmFsdWUoKSwgc3R5bGUuZ2V0TWFyZ2luVG9wVW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5NQVJHSU5fVE9QX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0TWFyZ2luQm90dG9tKCkuaXNTZXQoKSAmJiAhIk5VTEwiLmVxdWFscyhzdHlsZS5nZXRNYXJnaW5Cb3R0b21Vbml0KCkubmFtZSgpKSkgeworCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoc3R5bGUuZ2V0TWFyZ2luQm90dG9tVmFsdWUoKSwgc3R5bGUuZ2V0TWFyZ2luQm90dG9tVW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5NQVJHSU5fQk9UVE9NX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0TWFyZ2luTGVmdCgpLmlzU2V0KCkgJiYgISJOVUxMIi5lcXVhbHMoc3R5bGUuZ2V0TWFyZ2luTGVmdFVuaXQoKS5uYW1lKCkpKSB7CisJCQl0cnkgeworCQkJCURpbWVuc2lvblZhbHVlIGRpbSA9IG5ldyBEaW1lbnNpb25WYWx1ZShzdHlsZS5nZXRNYXJnaW5MZWZ0VmFsdWUoKSwgc3R5bGUuZ2V0TWFyZ2luTGVmdFVuaXQoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuTUFSR0lOX0xFRlRfUFJPUCwgZGltLnRvU3RyaW5nKCkpOworCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwkJaWYJKCFzdHlsZUhhbmRsZS5nZXRNYXJnaW5SaWdodCgpLmlzU2V0KCkgJiYgISJOVUxMIi5lcXVhbHMoc3R5bGUuZ2V0TWFyZ2luUmlnaHRVbml0KCkubmFtZSgpKSkgeworCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoc3R5bGUuZ2V0TWFyZ2luUmlnaHRWYWx1ZSgpLCBzdHlsZS5nZXRNYXJnaW5SaWdodFVuaXQoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuTUFSR0lOX1JJR0hUX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBseUJvcmRlclRvcChTdHlsZUhhbmRsZSBzdHlsZUhhbmRsZSwgQm9yZGVyU3R5bGUgYm9yZGVyKSB7CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0Qm9yZGVyVG9wV2lkdGgoKS5pc1NldCgpICYmIGJvcmRlciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXN0eWxlSGFuZGxlLnNldEJvcmRlclRvcFN0eWxlKGJvcmRlci5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoYm9yZGVyLmdldFdpZHRodmFsdWUoKSwgYm9yZGVyLmdldFdpZHRodW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CT1JERVJfVE9QX1dJRFRIX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CT1JERVJfVE9QX0NPTE9SX1BST1AsIGFwcGx5Q29sb3IoYm9yZGVyLmdldENvbG9yKCkpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBseUJvcmRlckxlZnQoU3R5bGVIYW5kbGUgc3R5bGVIYW5kbGUsIEJvcmRlclN0eWxlIGJvcmRlcikgeworCQlpZgkoIXN0eWxlSGFuZGxlLmdldEJvcmRlckxlZnRXaWR0aCgpLmlzU2V0KCkgJiYgYm9yZGVyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJc3R5bGVIYW5kbGUuc2V0Qm9yZGVyTGVmdFN0eWxlKGJvcmRlci5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoYm9yZGVyLmdldFdpZHRodmFsdWUoKSwgYm9yZGVyLmdldFdpZHRodW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CT1JERVJfTEVGVF9XSURUSF9QUk9QLCBkaW0udG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuQk9SREVSX0xFRlRfQ09MT1JfUFJPUCwgYXBwbHlDb2xvcihib3JkZXIuZ2V0Q29sb3IoKSkpOworCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0JCQkKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFwcGx5Qm9yZGVyUmlnaHQoU3R5bGVIYW5kbGUgc3R5bGVIYW5kbGUsIEJvcmRlclN0eWxlIGJvcmRlcikgeworCQlpZgkoIXN0eWxlSGFuZGxlLmdldEJvcmRlclJpZ2h0V2lkdGgoKS5pc1NldCgpICYmIGJvcmRlciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXN0eWxlSGFuZGxlLnNldEJvcmRlclJpZ2h0U3R5bGUoYm9yZGVyLmdldFR5cGUoKS5nZXROYW1lKCkpOworCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQl0cnkgeworCQkJCURpbWVuc2lvblZhbHVlIGRpbSA9IG5ldyBEaW1lbnNpb25WYWx1ZShib3JkZXIuZ2V0V2lkdGh2YWx1ZSgpLCBib3JkZXIuZ2V0V2lkdGh1bml0KCkubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJCXN0eWxlSGFuZGxlLnNldFByb3BlcnR5KElTdHlsZU1vZGVsLkJPUkRFUl9SSUdIVF9XSURUSF9QUk9QLCBkaW0udG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuQk9SREVSX1JJR0hUX0NPTE9SX1BST1AsIGFwcGx5Q29sb3IoYm9yZGVyLmdldENvbG9yKCkpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CQkJCisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBseUJvcmRlckJvdHRvbShTdHlsZUhhbmRsZSBzdHlsZUhhbmRsZSwgQm9yZGVyU3R5bGUgYm9yZGVyKSB7CisJCWlmCSghc3R5bGVIYW5kbGUuZ2V0Qm9yZGVyQm90dG9tV2lkdGgoKS5pc1NldCgpICYmIGJvcmRlciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXN0eWxlSGFuZGxlLnNldEJvcmRlckJvdHRvbVN0eWxlKGJvcmRlci5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoYm9yZGVyLmdldFdpZHRodmFsdWUoKSwgYm9yZGVyLmdldFdpZHRodW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CT1JERVJfQk9UVE9NX1dJRFRIX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5CT1JERVJfQk9UVE9NX0NPTE9SX1BST1AsIGFwcGx5Q29sb3IoYm9yZGVyLmdldENvbG9yKCkpKTsKKwkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CQkJCisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBseUZvbnQoU3R5bGVIYW5kbGUgc3R5bGVIYW5kbGUsIEZvbnQgZm9udCkgeworCQlpZgkoc3R5bGVIYW5kbGUuZ2V0Rm9udEZhbWlseUhhbmRsZSgpID09IG51bGwgfHwgIXN0eWxlSGFuZGxlLmdldEZvbnRGYW1pbHlIYW5kbGUoKS5pc1NldCgpKSB7CisJCQlpZgkoZm9udC5nZXRGYW1pbHkoKSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJRm9udEZhbWlseSBmYW1pbHkgPSBmb250LmdldEZhbWlseSgpOworCQkJCQlpZgkoZmFtaWx5IGluc3RhbmNlb2YgQnVpbGRJbkZvbnRGYW1pbHkpIHsKKwkJCQkJCXN0eWxlSGFuZGxlLnNldFByb3BlcnR5KElTdHlsZU1vZGVsLkZPTlRfRkFNSUxZX1BST1AsICgoQnVpbGRJbkZvbnRGYW1pbHkpIGZhbWlseSkuZ2V0Q3VzdG9tKCkuZ2V0TGl0ZXJhbCgpKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChmYW1pbHkgaW5zdGFuY2VvZiBDdXN0b21Gb250RmFtaWx5KSB7CisJCQkJCQlzdHlsZUhhbmRsZS5zZXRQcm9wZXJ0eShJU3R5bGVNb2RlbC5GT05UX0ZBTUlMWV9QUk9QLCAiXCIiKygoQ3VzdG9tRm9udEZhbWlseSkgZmFtaWx5KS5nZXRDdXN0b20oKSsiXCIiKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYJKHN0eWxlSGFuZGxlLmdldEZvbnRTaXplKCkgPT0gbnVsbCB8fCAhc3R5bGVIYW5kbGUuZ2V0Rm9udFNpemUoKS5pc1NldCgpKSB7CisJCQlpZgkoZm9udC5nZXRTaXpldW5pdCgpICE9IG51bGwgJiYgZm9udC5nZXRTaXpldmFsdWUoKSA+IDApIHsKKwkJCQl0cnkgeworCQkJCQlEaW1lbnNpb25WYWx1ZSBkaW0gPSBuZXcgRGltZW5zaW9uVmFsdWUoZm9udC5nZXRTaXpldmFsdWUoKSwgZm9udC5nZXRTaXpldW5pdCgpLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQkJc3R5bGVIYW5kbGUuc2V0UHJvcGVydHkoSVN0eWxlTW9kZWwuRk9OVF9TSVpFX1BST1AsIGRpbS50b1N0cmluZygpKTsKKwkJCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmCShmb250LmdldEV4dGVuZHMoKSAhPSBudWxsKSB7CisJCQlhcHBseUZvbnQoc3R5bGVIYW5kbGUsIGZvbnQuZ2V0RXh0ZW5kcygpKTsKKwkJfQorCQlpZgkoZm9udC5nZXRTdHlsZSgpICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJc3R5bGVIYW5kbGUuc2V0Rm9udFN0eWxlKGZvbnQuZ2V0U3R5bGUoKS5nZXRMaXRlcmFsKCkpOworCQkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vQXV0b1RleHRJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vQXV0b1RleHRJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViOTQxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9BdXRvVGV4dEl0ZW0uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkF1dG9UZXh0SGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuYWN0aXZpdHkuU2VtYW50aWNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworCitwdWJsaWMgY2xhc3MgQXV0b1RleHRJdGVtIGltcGxlbWVudHMgQmFzZUl0ZW0geworCisJcHJpdmF0ZSBmaW5hbCBBdXRvVGV4dEhhbmRsZSBmSXRlbTsKKwkKKwlwdWJsaWMgQXV0b1RleHRJdGVtKFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya3NldCwgU3RyaW5nIGF1dG9UZXh0KSB7CisJCWZJdGVtID0gd29ya3NldC5mYWN0b3J5Lm5ld0F1dG9UZXh0KG51bGwpOworCQl0cnkgeworCQkJZkl0ZW0uc2V0QXV0b1RleHRUeXBlKGF1dG9UZXh0KTsKKwkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVwb3J0SXRlbUhhbmRsZSBnZXRIYW5kbGUoKSB7CisJCXJldHVybiBmSXRlbTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9CYXNlSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0Jhc2VJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4ODBlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9CYXNlSXRlbS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuRGVzaWduQ2hvaWNlQ29uc3RhbnRzOworCitwdWJsaWMgaW50ZXJmYWNlIEJhc2VJdGVtIHsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05URU5UX1RZUEVfQVVUTyA9IERlc2lnbkNob2ljZUNvbnN0YW50cy5URVhUX0RBVEFfQ09OVEVOVF9UWVBFX0FVVE87CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEVOVF9UWVBFX1BMQUlOID0gRGVzaWduQ2hvaWNlQ29uc3RhbnRzLlRFWFRfREFUQV9DT05URU5UX1RZUEVfUExBSU47CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEVOVF9UWVBFX0hUTUwgPSBEZXNpZ25DaG9pY2VDb25zdGFudHMuVEVYVF9EQVRBX0NPTlRFTlRfVFlQRV9IVE1MOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRFTlRfVFlQRV9SVEYgPSBEZXNpZ25DaG9pY2VDb25zdGFudHMuVEVYVF9EQVRBX0NPTlRFTlRfVFlQRV9SVEY7CisJCisJUmVwb3J0SXRlbUhhbmRsZSBnZXRIYW5kbGUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9Cb2R5SXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0JvZHlJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9Cb2R5SXRlbS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0RGVzaWduSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TbG90SGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsLlJlcG9ydEdlbmVyYXRvcldvcmtTZXQ7CisKK3B1YmxpYyBjbGFzcyBCb2R5SXRlbSBleHRlbmRzIENvbnRhaW5lckl0ZW0geworCisJcHJpdmF0ZSBmaW5hbCBSZXBvcnREZXNpZ25IYW5kbGUgZkRlc2lnbjsKKworCXB1YmxpYyBCb2R5SXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQpIHsKKwkJc3VwZXIod29ya3NldCk7CisJCWZEZXNpZ24gPSB3b3Jrc2V0LmRlc2lnbjsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTbG90SGFuZGxlIGdldFNsb3RIYW5kbGUoKSB7CisJCXJldHVybiBmRGVzaWduLmdldEJvZHkoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9DZWxsSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0NlbGxJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlMDdlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9DZWxsSXRlbS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuQ2VsbEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2xvdEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuYWN0aXZpdHkuU2VtYW50aWNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworCitwdWJsaWMgY2xhc3MgQ2VsbEl0ZW0gZXh0ZW5kcyBDb250YWluZXJJdGVtIHsKKworCXByaXZhdGUgZmluYWwgQ2VsbEhhbmRsZSBmSXRlbTsKKworCXByb3RlY3RlZCBDZWxsSXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQsIENlbGxIYW5kbGUgY2VsbCkgeworCQlzdXBlcih3b3Jrc2V0KTsKKwkJZkl0ZW0gPSBjZWxsOworCX0KKwkKKwlwdWJsaWMgQ2VsbEl0ZW0gc2V0Q29sdW1uU3BhbihpbnQgY29sdW1uc3BhbikgeworCQl0cnkgeworCQkJY29sdW1uc3BhbiA9IE1hdGgubWF4KDEsIGNvbHVtbnNwYW4pOworCQkJaWYJKGNvbHVtbnNwYW4gIT0gZkl0ZW0uZ2V0Q29sdW1uU3BhbigpKSB7CisJCQkJZkl0ZW0uc2V0Q29sdW1uU3Bhbihjb2x1bW5zcGFuKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTbG90SGFuZGxlIGdldFNsb3RIYW5kbGUoKSB7CisJCXJldHVybiBmSXRlbS5nZXRDb250ZW50KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vQ29udGFpbmVySXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0NvbnRhaW5lckl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIzNTIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0NvbnRhaW5lckl0ZW0uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5EYXRhU2V0SGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5hY3Rpdml0eS5TZW1hbnRpY0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuc3RydWN0dXJlcy5Db21wdXRlZENvbHVtbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLlN0eWxlTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLlRleHRBbGlnbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLlRleHRBbGlnbi5BbGlnbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLldpZHRoOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsLlJlcG9ydEdlbmVyYXRvcldvcmtTZXQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXJJdGVtIGV4dGVuZHMgQUNvbnRhaW5lckl0ZW0geworCisJcHVibGljIENvbnRhaW5lckl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0KSB7CisJCXN1cGVyKHdvcmtzZXQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRIZWFkZXIoaW50IGxldmVsLCBTdHJpbmcgaTE4bktleSwgU3RyaW5nIHRpdGxlLCBTdHlsZSBzdHlsZSkgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJYWRkKAorCQkJbmV3IFRleHRJdGVtKGZXb3Jrc2V0LCBpMThuS2V5LCAiPGgiK2xldmVsKyI+Iit0aXRsZSsiPC9oIitsZXZlbCsiPiIsIEJhc2VJdGVtLkNPTlRFTlRfVFlQRV9IVE1MKSwKKwkJCXN0eWxlLAorCQkJbmV3IFdpZHRoKCIxMDAlIiksCisJCQluZXcgVGV4dEFsaWduKEFsaWduLmNlbnRlciksCisJCQluZXcgU3R5bGVOYW1lKCJoIitsZXZlbCkKKwkJKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRMYWJlbChTdHJpbmcgaTE4bktleSwgU3RyaW5nIHRleHQsIFN0eWxlIHN0eWxlKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24geworCQlhZGQoCisJCQluZXcgTGFiZWxJdGVtKGZXb3Jrc2V0LCBpMThuS2V5LCB0ZXh0KSwKKwkJCXN0eWxlCisJCSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgaTE4bktleSwgU3RyaW5nIHRleHQsIFN0eWxlIHN0eWxlKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24geworCQlhZGQoCisJCQluZXcgVGV4dEl0ZW0oZldvcmtzZXQsIGkxOG5LZXksIHRleHQsIEJhc2VJdGVtLkNPTlRFTlRfVFlQRV9QTEFJTiksCisJCQlzdHlsZQorCQkpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZEF1dG9UZXh0KFN0cmluZyB0eXBlLCBTdHlsZSBzdHlsZSkgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJYWRkKAorCQkJbmV3IEF1dG9UZXh0SXRlbShmV29ya3NldCwgdHlwZSksCisJCQlzdHlsZQorCQkpOworCX0KKworCXB1YmxpYyBUYWJsZUl0ZW0gY3JlYXRlVGFibGUoKSB7CisJCXJldHVybiBuZXcgVGFibGVJdGVtKGZXb3Jrc2V0KTsKKwl9CisKKwlwdWJsaWMgVGFibGVJdGVtIGNyZWF0ZVRhYmxlKGludCBjb2x1bW5zKSB7CisJCXJldHVybiBuZXcgVGFibGVJdGVtKGZXb3Jrc2V0LCBjb2x1bW5zKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVGFibGUoRGF0YVNldEhhbmRsZSBkYXRhU2V0LCBXaXRoSGVhZGVyRm9vdGVyIHdpdGhIZWFkZXJGb290ZXIsIEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4gYm91bmRDb2x1bW5zLCBEYXRhbWFydFRhYmxlR3JvdXBbXSBncm91cHMsIFN0eWxlIHByb3BlcnRpZXNTdHlsZSwgRGF0YW1hcnRUYWJsZVByb3BlcnR5W10gdGFibGVQcm9wZXJ0aWVzLCBTdHlsZSBzdHlsZSwgQXR0cmlidXRlW10gYXR0cmlidXRlcykgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJYWRkKAorCQkJbmV3IFRhYmxlSXRlbShmV29ya3NldCwgZGF0YVNldCwgd2l0aEhlYWRlckZvb3RlciwgYm91bmRDb2x1bW5zLCBncm91cHMsIHByb3BlcnRpZXNTdHlsZSwgdGFibGVQcm9wZXJ0aWVzKSwKKwkJCXN0eWxlLAorCQkJYXR0cmlidXRlcworCQkpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZERhdGEoRGF0YW1hcnRUYWJsZVByb3BlcnR5IHRhYmxlUHJvcGVydHksIFN0eWxlIHN0eWxlKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24geworCQlhZGQoCisJCQluZXcgRGF0YUl0ZW0oZldvcmtzZXQsIHRhYmxlUHJvcGVydHkpLAorCQkJc3R5bGUKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vRGF0YUl0ZW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9EYXRhSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2QzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vRGF0YUl0ZW0uamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5EYXRhSXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRXhwcmVzc2lvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlN0cnVjdHVyZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5zdHJ1Y3R1cmVzLkFnZ3JlZ2F0aW9uQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuQ29tcHV0ZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5QXR0cmlidXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUHVyZUFnZ3JlZ2F0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJhc2VBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHVyZUFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlVW5hcnlBZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZVZhbHVlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uRGF0YVR5cGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsLlJlcG9ydEdlbmVyYXRvcldvcmtTZXQ7CisKK3B1YmxpYyBjbGFzcyBEYXRhSXRlbSBpbXBsZW1lbnRzIEJhc2VJdGVtIHsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU1BMQVlOQU1FX0FHR1JFR0FUSU9OX1BSRUZJWCA9ICJBR0dSRUdBVElPTl8iOworCXByaXZhdGUgZmluYWwgRGF0YUl0ZW1IYW5kbGUgZkl0ZW07CisKKwlwdWJsaWMgc3RhdGljIENvbXB1dGVkQ29sdW1uIGNyZWF0ZUNvbXB1dGVkQ29sdW1uKFRhYmxlQWdncmVnYXRpb24gYWdncmVnYXRpb24pIHsKKwkJRUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4gdmFsdWVSZWZzID0gYWdncmVnYXRpb24uZ2V0QWdncmVnYXRpb24oKS5nZXRWYWx1ZVJlZnMoKTsKKwkJRW51bTw/PiBmdW5jdGlvbiA9IERhdGFJdGVtLmdldEFnZ3JlZ2F0ZUZ1bmN0aW9uRW51bShhZ2dyZWdhdGlvbik7CisJCURhdGFUeXBlcyBkYXRhVHlwZSA9IERhdGFUeXBlcy5TVFJJTkc7CisJCVN0cmluZyBwcmVmaXggPSAiIjsKKwkJaWYJKCF2YWx1ZVJlZnMuaXNFbXB0eSgpKSB7CisJCQlEYXRhbWFydFByb3BlcnR5IHJlZmVyZW5jZSA9IHZhbHVlUmVmcy5nZXQoMCk7CisJCQkvLyAtLS0gZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uIC0tLQorCQkJaWYJKHJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJTEVudGl0eUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSByZWZlcmVuY2UuZ2V0UHJvcGVydHlSZWYoKTsKKwkJCQlkYXRhVHlwZSA9IERhdGFUeXBlcy50eXBlRm9yKGF0dHJpYnV0ZS5nZXRUeXBlKCkpOworCQkJfQorCQl9CisJCWVsc2UgaWYJKGZ1bmN0aW9uLmVxdWFscyhQdXJlQWdncmVnYXRpb25UeXBlRW51bS5DT1VOVCkpIHsKKwkJCWRhdGFUeXBlID0gRGF0YVR5cGVzLklOVEVHRVI7CisJCQlwcmVmaXggPSBESVNQTEFZTkFNRV9BR0dSRUdBVElPTl9QUkVGSVg7CisJCX0KKwkJZWxzZSBpZgkoZnVuY3Rpb24uZXF1YWxzKFB1cmVBZ2dyZWdhdGlvblR5cGVFbnVtLlJVTk5JTkdDT1VOVCkpIHsKKwkJCWRhdGFUeXBlID0gRGF0YVR5cGVzLklOVEVHRVI7CisJCQlwcmVmaXggPSBESVNQTEFZTkFNRV9BR0dSRUdBVElPTl9QUkVGSVg7CisJCX0KKwkJU3RyaW5nIG5hbWUgPSBEYXRhSXRlbS5nZXRSZXN1bHRTZXRDb2x1bW4oYWdncmVnYXRpb24pOworCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBuYW1lOworLy8JCWlmCShJMThOS2V5R2VuZXJhdG9yLmtleShhZ2dyZWdhdGlvbi5nZXRUZXh0KCkpID09IG51bGwpIHsKKwkJCWlmCShhZ2dyZWdhdGlvbi5nZXRUZXh0KCkgIT0gbnVsbCkgeworCQkJCWRpc3BsYXlOYW1lID0gYWdncmVnYXRpb24uZ2V0VGV4dCgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOworCQl9CisvLwkJfQorCQkvLyAtLS0gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFjY2VzcyB2aWEgdGFibGUgLS0tCisJCUNvbXB1dGVkQ29sdW1uIGFnZ3JlZ2F0aW9uQ29sdW1uID0gU3RydWN0dXJlRmFjdG9yeS5jcmVhdGVDb21wdXRlZENvbHVtbigpOworCQlhZ2dyZWdhdGlvbkNvbHVtbi5zZXROYW1lKG5hbWUpOworCQlhZ2dyZWdhdGlvbkNvbHVtbi5zZXREaXNwbGF5TmFtZShwcmVmaXgrZGlzcGxheU5hbWUpOworCQlhZ2dyZWdhdGlvbkNvbHVtbi5zZXREYXRhVHlwZShkYXRhVHlwZS5nZXROYXRpdmVPZGFEYXRhVHlwZU5hbWUoKSk7CisJCVN0cmluZyBncm91cE9uID0gRGF0YUl0ZW0uZ2V0R3JvdXBPbihhZ2dyZWdhdGlvbik7CisJCWlmCShncm91cE9uICE9IG51bGwpIHsKKwkJCWFnZ3JlZ2F0aW9uQ29sdW1uLnNldEFnZ3JlZ2F0ZU9uKGdyb3VwT24pOworCQl9CisJCWFnZ3JlZ2F0aW9uQ29sdW1uLnNldEFnZ3JlZ2F0ZUZ1bmN0aW9uKERhdGFJdGVtLmdldEFnZ3JlZ2F0ZUZ1bmN0aW9uTmFtZShhZ2dyZWdhdGlvbikpOworCQlmb3IJKERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkgOiB2YWx1ZVJlZnMpIHsKKwkJCUFnZ3JlZ2F0aW9uQXJndW1lbnQgYXJndW1lbnQgPSBTdHJ1Y3R1cmVGYWN0b3J5LmNyZWF0ZUFnZ3JlZ2F0aW9uQXJndW1lbnQoKTsKKwkJCWFyZ3VtZW50LnNldE5hbWUoIkV4cHJlc3Npb24iKTsKKwkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBFeHByZXNzaW9uKCJkYXRhU2V0Um93W1wiIiArIHByb3BlcnR5LmdldFByb3BlcnR5UmVmKCkuZ2V0TmFtZSgpICsgIlwiXSIsIEV4cHJlc3Npb25UeXBlLkpBVkFTQ1JJUFQpOworCQkJYXJndW1lbnQuc2V0RXhwcmVzc2lvblByb3BlcnR5KCJ2YWx1ZSIsIGV4cHJlc3Npb24pOworCQkJYWdncmVnYXRpb25Db2x1bW4uYWRkQXJndW1lbnQoYXJndW1lbnQpOworCQl9CisJCWFnZ3JlZ2F0aW9uQ29sdW1uLnNldEFsbG93RXhwb3J0KHRydWUpOworCQlyZXR1cm4gYWdncmVnYXRpb25Db2x1bW47CisJfQorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc3VsdFNldENvbHVtbihUYWJsZVZhbHVlRWxlbWVudCBlbGVtZW50KSB7CisJCWlmCShlbGVtZW50IGluc3RhbmNlb2YgVGFibGVBZ2dyZWdhdGlvbikgeworCQkJVGFibGVCYXNlQWdncmVnYXRpb24gYWdncmVnYXRpb24gPSAoKFRhYmxlQWdncmVnYXRpb24pIGVsZW1lbnQpLmdldEFnZ3JlZ2F0aW9uKCk7CisJCQlTdHJpbmcgZ3JvdXBPbiA9IGdldEdyb3VwT24oZWxlbWVudCk7CisJCQlTdHJpbmcgZnVuY3Rpb24gPSBnZXRBZ2dyZWdhdGVGdW5jdGlvbk5hbWUoZWxlbWVudCk7CisJCQlTdHJpbmcgcmVzdWx0U2V0Q29sdW1uID0gKGdyb3VwT24gPT0gbnVsbCA/ICIiIDogZ3JvdXBPbisiXyIpK2Z1bmN0aW9uOworCQkJZm9yCShEYXRhbWFydFByb3BlcnR5IHZhbHVlUmVmIDogYWdncmVnYXRpb24uZ2V0VmFsdWVSZWZzKCkpIHsKKwkJCQlyZXN1bHRTZXRDb2x1bW4gKz0gIl8iK3ZhbHVlUmVmLmdldFByb3BlcnR5UmVmKCkuZ2V0TmFtZSgpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdFNldENvbHVtbjsKKwkJfQorCQllbHNlIGlmCShlbGVtZW50IGluc3RhbmNlb2YgVGFibGVQcm9wZXJ0eSkgeworCQkJcmV0dXJuICgoVGFibGVQcm9wZXJ0eSkgZWxlbWVudCkuZ2V0VmFsdWVSZWYoKS5nZXRQcm9wZXJ0eVJlZigpLmdldE5hbWUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVudW08Pz4gZ2V0QWdncmVnYXRlRnVuY3Rpb25FbnVtKFRhYmxlVmFsdWVFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYJKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUFnZ3JlZ2F0aW9uKSB7CisJCQlUYWJsZUJhc2VBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbiA9ICgoVGFibGVBZ2dyZWdhdGlvbikgZWxlbWVudCkuZ2V0QWdncmVnYXRpb24oKTsKKwkJCWlmCShhZ2dyZWdhdGlvbiBpbnN0YW5jZW9mIFRhYmxlUHVyZUFnZ3JlZ2F0aW9uKSB7CisJCQkJcmV0dXJuICgoVGFibGVQdXJlQWdncmVnYXRpb24pYWdncmVnYXRpb24pLmdldEFnZ3JlZ2F0aW9uKCk7CisJCQl9CisJCQllbHNlIGlmCShhZ2dyZWdhdGlvbiBpbnN0YW5jZW9mIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbikgeworCQkJCXJldHVybiAoKFRhYmxlVW5hcnlBZ2dyZWdhdGlvbilhZ2dyZWdhdGlvbikuZ2V0QWdncmVnYXRpb24oKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGFnZ3JlZ2F0aW9uIGluc3RhbmNlb2YgVGFibGVCaW5hcnlBZ2dyZWdhdGlvbikgeworCQkJCXJldHVybiAoKFRhYmxlQmluYXJ5QWdncmVnYXRpb24pYWdncmVnYXRpb24pLmdldEFnZ3JlZ2F0aW9uKCk7CisJCQl9CisJCQllbHNlIGlmIChhZ2dyZWdhdGlvbiBpbnN0YW5jZW9mIFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbikgeworCQkJCXJldHVybiAoKFRhYmxlTXVsdGlwbGVBZ2dyZWdhdGlvbilhZ2dyZWdhdGlvbikuZ2V0QWdncmVnYXRpb24oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBZ2dyZWdhdGVGdW5jdGlvbk5hbWUoVGFibGVWYWx1ZUVsZW1lbnQgZWxlbWVudCkgeworCQlpZgkoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlQWdncmVnYXRpb24pIHsKKwkJCVRhYmxlQmFzZUFnZ3JlZ2F0aW9uIGFnZ3JlZ2F0aW9uID0gKChUYWJsZUFnZ3JlZ2F0aW9uKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGlvbigpOworCQkJaWYJKGFnZ3JlZ2F0aW9uIGluc3RhbmNlb2YgVGFibGVQdXJlQWdncmVnYXRpb24pIHsKKwkJCQlyZXR1cm4gKChUYWJsZVB1cmVBZ2dyZWdhdGlvbilhZ2dyZWdhdGlvbikuZ2V0QWdncmVnYXRpb24oKS5nZXROYW1lKCk7CisJCQl9CisJCQllbHNlIGlmCShhZ2dyZWdhdGlvbiBpbnN0YW5jZW9mIFRhYmxlVW5hcnlBZ2dyZWdhdGlvbikgeworCQkJCXJldHVybiAoKFRhYmxlVW5hcnlBZ2dyZWdhdGlvbilhZ2dyZWdhdGlvbikuZ2V0QWdncmVnYXRpb24oKS5nZXROYW1lKCk7CisJCQl9CisJCQllbHNlIGlmIChhZ2dyZWdhdGlvbiBpbnN0YW5jZW9mIFRhYmxlQmluYXJ5QWdncmVnYXRpb24pIHsKKwkJCQlyZXR1cm4gKChUYWJsZUJpbmFyeUFnZ3JlZ2F0aW9uKWFnZ3JlZ2F0aW9uKS5nZXRBZ2dyZWdhdGlvbigpLmdldE5hbWUoKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGFnZ3JlZ2F0aW9uIGluc3RhbmNlb2YgVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKSB7CisJCQkJcmV0dXJuICgoVGFibGVNdWx0aXBsZUFnZ3JlZ2F0aW9uKWFnZ3JlZ2F0aW9uKS5nZXRBZ2dyZWdhdGlvbigpLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cE9uKFRhYmxlVmFsdWVFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYJKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUFnZ3JlZ2F0aW9uKSB7CisJCQlpZgkoKChUYWJsZUFnZ3JlZ2F0aW9uKWVsZW1lbnQpLmdldE9uR3JvdXAoKSA9PSBudWxsKSB7CisJCQkJRU9iamVjdCBjb250YWluZXIgPSBlbGVtZW50OworCQkJCXdoaWxlCShjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKKwkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKKwkJCQkJaWYJKGNvbnRhaW5lciBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGVHcm91cCkgeworCQkJCQkJcmV0dXJuICgoRGF0YW1hcnRUYWJsZUdyb3VwKSBjb250YWluZXIpLmdldE5hbWUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXJldHVybiAoKFRhYmxlQWdncmVnYXRpb24pZWxlbWVudCkuZ2V0T25Hcm91cCgpLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIERhdGFJdGVtKFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya3NldCwgRGF0YW1hcnRUYWJsZVByb3BlcnR5IHRhYmxlUHJvcGVydHkpIHsKKwkJZkl0ZW0gPSB3b3Jrc2V0Lm5ld0RhdGFJdGVtKCIiKTsKKwkJdHJ5IHsKKwkJCVRhYmxlVmFsdWVFbGVtZW50IGVsZW1lbnQgPSB0YWJsZVByb3BlcnR5LmdldENvbHVtbigpOworCQkJZkl0ZW0uc2V0UmVzdWx0U2V0Q29sdW1uKGdldFJlc3VsdFNldENvbHVtbihlbGVtZW50KSk7CisJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gZkl0ZW07CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0dyaWRJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vR3JpZEl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc0NTJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0dyaWRJdGVtLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5DZWxsSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5HcmlkSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5Sb3dIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNsb3RIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZS5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWwuUmVwb3J0R2VuZXJhdG9yV29ya1NldDsKKworcHVibGljIGNsYXNzIEdyaWRJdGVtIGV4dGVuZHMgQUNvbnRhaW5lckl0ZW0geworCisJcHJpdmF0ZSBmaW5hbCBHcmlkSGFuZGxlIGZJdGVtOworCisJcHVibGljIEdyaWRJdGVtKFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya3NldCwgaW50IGNvbHVtbkNvdW50LCBpbnQgcm93Q291bnQpIHsKKwkJc3VwZXIod29ya3NldCk7CisJCWZJdGVtID0gd29ya3NldC5mYWN0b3J5Lm5ld0dyaWRJdGVtKG51bGwsIGNvbHVtbkNvdW50LCByb3dDb3VudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gZkl0ZW07CisJfQorCisJQE92ZXJyaWRlCisJU2xvdEhhbmRsZSBnZXRTbG90SGFuZGxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlARGVwcmVjYXRlZAorCXB1YmxpYyB2b2lkIGFkZChCYXNlSXRlbSBpdGVtLCBTdHlsZSBzdHlsZSwgQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHRocm93cyBTZW1hbnRpY0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTZW1hbnRpY0V4Y2VwdGlvbihmSXRlbS5nZXRFbGVtZW50KCksICJjYW4ndCBhZGQgaXRlbSBkaXJlY3RseSB0byBncmlkLCB1c2UgYWRkKGNvbHVtbixyb3csaXRlbSxhdHRyaWJ1dGVzKSBpbnN0ZWFkIik7CisJfQorCisJcHVibGljIHZvaWQgYXBwbHlTdHlsZShpbnQgcm93Tm8sIFN0eWxlIHN0eWxlKSB7CisJCWFwcGx5U3R5bGUoZldvcmtzZXQuZGVzaWduLCBmSXRlbS5nZXRSb3dzKCkuZ2V0KHJvd05vKSwgc3R5bGUpOworCX0KKwkKKwlwdWJsaWMgQ2VsbEl0ZW0gZ2V0Q2VsbChpbnQgY29sdW1uTm8sIGludCByb3dObykgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJUm93SGFuZGxlIHJvdyA9IG51bGw7CisJCUNlbGxIYW5kbGUgY2VsbCA9IG51bGw7CisJCXRyeSB7CisJCQlyb3cgPSAoUm93SGFuZGxlKSBmSXRlbS5nZXRSb3dzKCkuZ2V0KHJvd05vKTsKKwkJCWlmCShyb3cgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBTZW1hbnRpY0V4Y2VwdGlvbihmSXRlbS5nZXRFbGVtZW50KCksICJjYW4ndCByZXNvbHZlIHJvd05vICIrcm93Tm8pOworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFNlbWFudGljRXhjZXB0aW9uKGZJdGVtLmdldEVsZW1lbnQoKSwgImNhbid0IHJlc29sdmUgcm93Tm8gIityb3dObywgZSk7CisJCX0KKwkJdHJ5IHsKKwkJCWNlbGwgPSAoQ2VsbEhhbmRsZSlyb3cuZ2V0Q2VsbHMoKS5nZXQoY29sdW1uTm8pOworCQkJaWYJKGNlbGwgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBTZW1hbnRpY0V4Y2VwdGlvbihmSXRlbS5nZXRFbGVtZW50KCksICJjYW4ndCByZXNvbHZlIGNvbHVtbk5vICIrY29sdW1uTm8pOworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFNlbWFudGljRXhjZXB0aW9uKGZJdGVtLmdldEVsZW1lbnQoKSwgImNhbid0IHJlc29sdmUgY29sdW1uTm8gIitjb2x1bW5ObywgZSk7CisJCX0KKwkJcmV0dXJuIG5ldyBDZWxsSXRlbShmV29ya3NldCwgY2VsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0ltYWdlSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL0ltYWdlSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vSW1hZ2VJdGVtLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07CisKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5FeHByZXNzaW9uSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5FeHByZXNzaW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuSW1hZ2VIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlN0cnVjdHVyZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLkRlc2lnbkNob2ljZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuc3RydWN0dXJlcy5FbWJlZGRlZEltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmVsZW1lbnRzLmludGVyZmFjZXMuSUltYWdlSXRlbU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnRoZW1lcy5JVGhlbWVSZXNvdXJjZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkudGhlbWVzLklUaGVtZVJlc291cmNlU2VydmljZS5UaGVtZVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworCitwdWJsaWMgY2xhc3MgSW1hZ2VJdGVtIGltcGxlbWVudHMgQmFzZUl0ZW0geworCisJcHJpdmF0ZSBmaW5hbCBJbWFnZUhhbmRsZSBmSXRlbTsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIElUaGVtZVJlc291cmNlU2VydmljZSB0aGVtZVJlc291cmNlU2VydmljZTsgCisJCisJcHVibGljIEltYWdlSXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2l6ZSwgZG91YmxlIHNjYWxlLCBTdHJpbmcgc291cmNlLCBTdHJpbmcgZmlsZW5hbWUpIHsKKwkJZkl0ZW0gPSB3b3Jrc2V0LmZhY3RvcnkubmV3SW1hZ2UobmFtZSk7CisJCXRyeSB7CisJCQlmSXRlbS5zZXRTaXplKHNpemUpOworCQkJaWYJKHNjYWxlIDw9IDAuMCkgeworCQkJCXNjYWxlID0gMS4wOworCQkJfQorCQkJZkl0ZW0uc2V0U2NhbGUoc2NhbGUpOworCQkJZkl0ZW0uc2V0U291cmNlKHNvdXJjZSk7CisJCQlzd2l0Y2ggKHNvdXJjZSkgeworCQkJCWNhc2UgRGVzaWduQ2hvaWNlQ29uc3RhbnRzLklNQUdFX1JFRl9UWVBFX1VSTDoKKwkJCQkJZkl0ZW0uc2V0VVJMKGZpbGVuYW1lKTsKKwkJCQkJRXhwcmVzc2lvbkhhbmRsZSBlaDEgPSBmSXRlbS5nZXRFeHByZXNzaW9uUHJvcGVydHkoSUltYWdlSXRlbU1vZGVsLlVSSV9QUk9QKTsKKwkJCQkJZWgxLnNldFR5cGUoRXhwcmVzc2lvblR5cGUuQ09OU1RBTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9SRUZfVFlQRV9GSUxFOgorCQkJCQlmSXRlbS5zZXRGaWxlKGZpbGVuYW1lKTsKKwkJCQkJRXhwcmVzc2lvbkhhbmRsZSBlaDIgPSBmSXRlbS5nZXRFeHByZXNzaW9uUHJvcGVydHkoSUltYWdlSXRlbU1vZGVsLlVSSV9QUk9QKTsKKwkJCQkJZWgyLnNldFR5cGUoRXhwcmVzc2lvblR5cGUuQ09OU1RBTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9SRUZfVFlQRV9FTUJFRDoKKwkJCQkJU3RyaW5nIGltYWdlSWQgPSBmaWxlbmFtZS5yZXBsYWNlQWxsKCJcXFciLCAiIik7CisJCQkJCUVtYmVkZGVkSW1hZ2UgZWkgPSB3b3Jrc2V0LmdldEVtYmVkZGVkSW1hZ2UoaW1hZ2VJZCk7CisJCQkJCWlmCShlaSA9PSBudWxsKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWlmCSh0aGVtZVJlc291cmNlU2VydmljZSAhPSBudWxsKSB7CisJCQkJCQkJCVN0cmluZyB1cmkgPSB0aGVtZVJlc291cmNlU2VydmljZS5nZXRUaGVtZVVSSShmaWxlbmFtZSwgVGhlbWVSZXNvdXJjZVR5cGUuSUNPTik7CisJCQkJCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHRoZW1lUmVzb3VyY2VTZXJ2aWNlLmdldFRoZW1lUmVzb3VyY2VJbnB1dFN0cmVhbSh1cmkpOworCQkJCQkJCQlTdHJpbmdbXSB0b2tlbnMgPSB1cmkuc3BsaXQoIlxcLiIpOworCQkJCQkJCQlTdHJpbmcgZmlsZWV4dGVuc2lvbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdOworCQkJCQkJCQlCdWZmZXJlZEltYWdlIG9yaWdpbmFsSW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsKKwkJCQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCQkJCUltYWdlSU8ud3JpdGUob3JpZ2luYWxJbWFnZSwgZmlsZWV4dGVuc2lvbiwgYmFvcyk7CisJCQkJCQkJCWJhb3MuZmx1c2goKTsKKwkJCQkJCQkJYnl0ZVtdIGltYWdlSW5CeXRlID0gYmFvcy50b0J5dGVBcnJheSgpOworCQkJCQkJCQliYW9zLmNsb3NlKCk7CisJCQkJCQkJCWVpID0gU3RydWN0dXJlRmFjdG9yeS5jcmVhdGVFbWJlZGRlZEltYWdlKCk7CisJCQkJCQkJCWVpLnNldFR5cGUoZ2V0SW1hZ2VUeXBlKGZpbGVleHRlbnNpb24pKTsKKwkJCQkJCQkJZWkuc2V0RGF0YShpbWFnZUluQnl0ZSk7CisJCQkJCQkJCWVpLnNldE5hbWUoaW1hZ2VJZCk7CisJCQkJCQkJCXdvcmtzZXQucHV0RW1iZWRkZWRJbWFnZShpbWFnZUlkLCBlaSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJd29ya3NldC5kZXNpZ24uYWRkSW1hZ2UoZWkpOworCQkJCQlmSXRlbS5zZXRJbWFnZU5hbWUoaW1hZ2VJZCk7CisJLy8JCQkJZWkuZ2V0SGFuZGxlKGltYWdlKQorCS8vCQkJCWltYWdlLmFkZEVsZW1lbnQoZWkuZ2V0SGFuZGxlKGltYWdlKSwgMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSZXBvcnRJdGVtSGFuZGxlIGdldEhhbmRsZSgpIHsKKwkJcmV0dXJuIGZJdGVtOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEltYWdlVHlwZShTdHJpbmcgZmlsZWV4dGVuc2lvbikgeworCQlzd2l0Y2ggKGZpbGVleHRlbnNpb24udG9Mb3dlckNhc2UoKSkgeworCQkJY2FzZSAiYm1wIjogCXJldHVybiBEZXNpZ25DaG9pY2VDb25zdGFudHMuSU1BR0VfVFlQRV9JTUFHRV9CTVA7CisJCQljYXNlICJnaWYiOiAJcmV0dXJuIERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9UWVBFX0lNQUdFX0dJRjsKKwkJCWNhc2UgInBuZyI6IAlyZXR1cm4gRGVzaWduQ2hvaWNlQ29uc3RhbnRzLklNQUdFX1RZUEVfSU1BR0VfUE5HOworCQkJLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfVFlQRV9JTUFHRV9YX1BORyA9ICJpbWFnZS94LXBuZyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgImpwZyI6CQorCQkJY2FzZSAianBlZyI6CXJldHVybiBEZXNpZ25DaG9pY2VDb25zdGFudHMuSU1BR0VfVFlQRV9JTUFHRV9KUEVHOworCQkJY2FzZSAiaWNvIjogCXJldHVybiBEZXNpZ25DaG9pY2VDb25zdGFudHMuSU1BR0VfVFlQRV9JTUFHRV9JQ087CisJCQljYXNlICJ0aWZmIjoJcmV0dXJuIERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9UWVBFX0lNQUdFX1RJRkY7CisJCQljYXNlICJzdmciOgkJcmV0dXJuIERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9UWVBFX0lNQUdFX1NWRzsKKwkJCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1RZUEVfSU1BR0VfWF9JQ09OID0gImltYWdlL3gtaWNvbiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vTGFiZWxJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vTGFiZWxJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2M2YwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9MYWJlbEl0ZW0uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkxhYmVsSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5hY3Rpdml0eS5TZW1hbnRpY0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsLlJlcG9ydEdlbmVyYXRvcldvcmtTZXQ7CisKK3B1YmxpYyBjbGFzcyBMYWJlbEl0ZW0gaW1wbGVtZW50cyBCYXNlSXRlbSB7CisKKwlwcml2YXRlIGZpbmFsIExhYmVsSGFuZGxlIGZJdGVtOworCQorCXB1YmxpYyBMYWJlbEl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0LCBTdHJpbmcgaTE4bktleSwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7CisJCWZJdGVtID0gd29ya3NldC5mYWN0b3J5Lm5ld0xhYmVsKG51bGwpOworCQl0cnkgeworCQkJZkl0ZW0uc2V0VGV4dChkZWZhdWx0VGV4dCk7CisJCQlmSXRlbS5zZXRUZXh0S2V5KGkxOG5LZXkpOworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oImtleToiK2kxOG5LZXkrIiBkZWZhdWx0OiIrZGVmYXVsdFRleHQpOworCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSZXBvcnRJdGVtSGFuZGxlIGdldEhhbmRsZSgpIHsKKwkJcmV0dXJuIGZJdGVtOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL1BhZ2VGb290ZXJJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vUGFnZUZvb3Rlckl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZiZGViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL1BhZ2VGb290ZXJJdGVtLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnRJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TaW1wbGVNYXN0ZXJQYWdlSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TbG90SGFuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWwuUmVwb3J0R2VuZXJhdG9yV29ya1NldDsKKworcHVibGljIGNsYXNzIFBhZ2VGb290ZXJJdGVtIGV4dGVuZHMgQ29udGFpbmVySXRlbSB7CisKKwlwcml2YXRlIGZpbmFsIFNpbXBsZU1hc3RlclBhZ2VIYW5kbGUgZk1hc3RlclBhZ2U7CisKKwlwdWJsaWMgUGFnZUZvb3Rlckl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0LCBTaW1wbGVNYXN0ZXJQYWdlSGFuZGxlIG1hc3RlclBhZ2UpIHsKKwkJc3VwZXIod29ya3NldCk7CisJCWZNYXN0ZXJQYWdlID0gbWFzdGVyUGFnZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTbG90SGFuZGxlIGdldFNsb3RIYW5kbGUoKSB7CisJCXJldHVybiBmTWFzdGVyUGFnZS5nZXRQYWdlRm9vdGVyKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vUGFnZUhlYWRlckl0ZW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9QYWdlSGVhZGVySXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmVmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL2l0ZW0vUGFnZUhlYWRlckl0ZW0uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNpbXBsZU1hc3RlclBhZ2VIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNsb3RIYW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworCitwdWJsaWMgY2xhc3MgUGFnZUhlYWRlckl0ZW0gZXh0ZW5kcyBDb250YWluZXJJdGVtIHsKKworCXByaXZhdGUgZmluYWwgU2ltcGxlTWFzdGVyUGFnZUhhbmRsZSBmTWFzdGVyUGFnZTsKKworCXB1YmxpYyBQYWdlSGVhZGVySXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQsIFNpbXBsZU1hc3RlclBhZ2VIYW5kbGUgbWFzdGVyUGFnZSkgeworCQlzdXBlcih3b3Jrc2V0KTsKKwkJZk1hc3RlclBhZ2UgPSBtYXN0ZXJQYWdlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVwb3J0SXRlbUhhbmRsZSBnZXRIYW5kbGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCVNsb3RIYW5kbGUgZ2V0U2xvdEhhbmRsZSgpIHsKKwkJcmV0dXJuIGZNYXN0ZXJQYWdlLmdldFBhZ2VIZWFkZXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9UYWJsZUl0ZW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9UYWJsZUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJjNDBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL1RhYmxlSXRlbS5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5DZWxsSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5EYXRhSXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRGF0YVNldEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRGVzaWduRWxlbWVudEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuTGFiZWxIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJvd0hhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2xvdEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuVGFibGVHcm91cEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuVGFibGVIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5jb21tYW5kLkNvbnRlbnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmNvbW1hbmQuTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuc3RydWN0dXJlcy5Db21wdXRlZENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5lbGVtZW50cy5pbnRlcmZhY2VzLklMaXN0aW5nRWxlbWVudE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmVsZW1lbnRzLmludGVyZmFjZXMuSVJlcG9ydEl0ZW1Nb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG4uSTE4TktleUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Db250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZUdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cEZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlR3JvdXBIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZVByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZENlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZFJvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5Tb21lR3JpZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdHlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5UYWJsZUFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGFibGVWYWx1ZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuV2l0aEhlYWRlckZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5XaXRoU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWwuUmVwb3J0R2VuZXJhdG9yV29ya1NldDsKKworcHVibGljIGNsYXNzIFRhYmxlSXRlbSBleHRlbmRzIEFDb250YWluZXJJdGVtIHsKKworCXByaXZhdGUgZmluYWwgVGFibGVIYW5kbGUgZkl0ZW07CisJCisJcHVibGljIFRhYmxlSXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQpIHsKKwkJc3VwZXIod29ya3NldCk7CisJCWZJdGVtID0gd29ya3NldC5mYWN0b3J5Lm5ld1RhYmxlSXRlbShudWxsKTsKKwl9CisJCisJcHVibGljIFRhYmxlSXRlbShSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtzZXQsIGludCBjb2x1bW5zKSB7CisJCXN1cGVyKHdvcmtzZXQpOworCQlmSXRlbSA9IHdvcmtzZXQuZmFjdG9yeS5uZXdUYWJsZUl0ZW0obnVsbCwgY29sdW1ucyk7CisJfQorCQorCXB1YmxpYyBUYWJsZUl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0LCBEYXRhU2V0SGFuZGxlIGRhdGFTZXQsIFdpdGhIZWFkZXJGb290ZXIgd2l0aEhlYWRlckZvb3RlciwgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBib3VuZENvbHVtbnMsIERhdGFtYXJ0VGFibGVHcm91cFtdIGdyb3VwcywgU3R5bGUgcHJvcGVydGllc1N0eWxlLCBEYXRhbWFydFRhYmxlUHJvcGVydHlbXSB0YWJsZVByb3BlcnRpZXMpIHsKKwkJc3VwZXIod29ya3NldCk7CisJCWlmCSgoYm91bmRDb2x1bW5zICE9IG51bGwpICYmICFib3VuZENvbHVtbnMuaXNFbXB0eSgpKSB7CisJCQlmSXRlbSA9IHdvcmtzZXQuZmFjdG9yeS5uZXdUYWJsZUl0ZW0obnVsbCwgdGFibGVQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwID8gYm91bmRDb2x1bW5zLnNpemUoKSA6IHRhYmxlUHJvcGVydGllcy5sZW5ndGgpOworCQl9CisJCWVsc2UgeworCQkJZkl0ZW0gPSB3b3Jrc2V0LmZhY3RvcnkubmV3VGFibGVJdGVtKG51bGwpOworCQl9CisJCXNldERhdGFTZXQoZGF0YVNldCk7CisJCXRyeSB7CisJCQlmSXRlbS5zZXRSZXBlYXRIZWFkZXIodHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJc2V0Qm91bmRDb2x1bW5zKHdvcmtzZXQucmVwb3J0LmdldERhdGFtYXJ0UmVmKCksIHdpdGhIZWFkZXJGb290ZXIsIGJvdW5kQ29sdW1ucywgZ3JvdXBzLCBwcm9wZXJ0aWVzU3R5bGUsIHRhYmxlUHJvcGVydGllcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlcG9ydEl0ZW1IYW5kbGUgZ2V0SGFuZGxlKCkgeworCQlyZXR1cm4gZkl0ZW07CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVNldChEYXRhU2V0SGFuZGxlIGRhdGFTZXQpIHsKKwkJdHJ5IHsKKwkJCWZJdGVtLnNldERhdGFTZXQoZGF0YVNldCk7CisJCX0gY2F0Y2ggKFNlbWFudGljRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0Qm91bmRDb2x1bW5zKERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCwgV2l0aEhlYWRlckZvb3RlciB3aXRoSGVhZGVyRm9vdGVyLCBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+IGJvdW5kQ29sdW1ucywgRGF0YW1hcnRUYWJsZUdyb3VwW10gZ3JvdXBzLCBTdHlsZSBwcm9wZXJ0aWVzU3R5bGUsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eVtdIHRhYmxlUHJvcGVydGllcykgeworCQlpZgkoKGJvdW5kQ29sdW1ucyAhPSBudWxsKSAmJiAhYm91bmRDb2x1bW5zLmlzRW1wdHkoKSkgeworCQkJQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBzaG93bkNvbHVtbnM7CisJCQlpbnQgY29sdW1uQ291bnQgPSAwOworCisJCQkvLyAtLS0gdGFibGUgZGV0YWlscyBpbmZvcm1hdGlvbjogc2hvd24gY29sdW1ucyBhbmQgbWF4aW11bSBjb2x1bW5zIC0tLQorCQkJaWYJKHRhYmxlUHJvcGVydGllcy5sZW5ndGggPT0gMCkgeworCQkJCXNob3duQ29sdW1ucyA9IGJvdW5kQ29sdW1uczsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNob3duQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+KCk7CisJCQkJZm9yCShEYXRhbWFydFRhYmxlUHJvcGVydHkgdGFibGVQcm9wZXJ0eSA6IHRhYmxlUHJvcGVydGllcykgeworCQkJCQlpZgkodGFibGVQcm9wZXJ0eS5nZXRDb2x1bW4oKSBpbnN0YW5jZW9mIFRhYmxlQWdncmVnYXRpb24pIHsKKwkJCQkJCXNob3duQ29sdW1ucy5hZGQoRGF0YUl0ZW0uY3JlYXRlQ29tcHV0ZWRDb2x1bW4oKFRhYmxlQWdncmVnYXRpb24pIHRhYmxlUHJvcGVydHkuZ2V0Q29sdW1uKCkpKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmCSh0YWJsZVByb3BlcnR5LmdldENvbHVtbigpIGluc3RhbmNlb2YgVGFibGVQcm9wZXJ0eSkgeworCQkJCQkJZm9yCShpbnQgY29sdW1uTm89MDsgY29sdW1uTm8gPCBib3VuZENvbHVtbnMuc2l6ZSgpOyBjb2x1bW5ObysrKSB7CisJCQkJCQkJRGF0YW1hcnRQcm9wZXJ0eSBkYXRhbWFydFByb3BlcnR5ID0gKChUYWJsZVByb3BlcnR5KXRhYmxlUHJvcGVydHkuZ2V0Q29sdW1uKCkpLmdldFZhbHVlUmVmKCk7CisJCQkJCQkJaWYJKGJvdW5kQ29sdW1ucy5nZXQoY29sdW1uTm8pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGRhdGFtYXJ0UHJvcGVydHkuZ2V0UHJvcGVydHlSZWYoKS5nZXROYW1lKCkpKSB7CisJCQkJCQkJCXNob3duQ29sdW1ucy5hZGQoYm91bmRDb2x1bW5zLmdldChjb2x1bW5ObykpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2x1bW5Db3VudCA9IHNob3duQ29sdW1ucy5zaXplKCk7CisKKwkJCS8vIC0tLSBlYWNoIGdyb3VwIC0tLQorCQkJZm9yCShEYXRhbWFydFRhYmxlR3JvdXAgZ3JvdXAgOiBncm91cHMpIHsKKwkJCQl0cnkgeworCQkJCQlUYWJsZUdyb3VwSGFuZGxlIGdyb3VwSGFuZGxlID0gZldvcmtzZXQuZmFjdG9yeS5uZXdUYWJsZUdyb3VwKCk7CisJCQkJCWdyb3VwSGFuZGxlLnNldE5hbWUoZ3JvdXAuZ2V0TmFtZSgpKTsKKwkJCQkJZ3JvdXBIYW5kbGUuc2V0SGlkZURldGFpbChmYWxzZSk7CisJCQkJCWdyb3VwSGFuZGxlLnNldEtleUV4cHIoInJvd1tcIiIrZ3JvdXAuZ2V0R3JvdXBpbmdSZWYoKS5nZXRQcm9wZXJ0eVJlZigpLmdldE5hbWUoKSsiXCJdIik7CisJCQkJCQorCQkJCQlpZgkoZ3JvdXAuZ2V0SGVhZGVyKCkgIT0gbnVsbCB8fCBncm91cC5pc0RldGFpbGhlYWRlcigpKSB7CisJCQkJCQlncm91cEhhbmRsZS5zZXRSZXBlYXRIZWFkZXIodHJ1ZSk7CisJCQkJCQlEYXRhbWFydFRhYmxlR3JvdXBIZWFkZXIgaGVhZGVyID0gZ3JvdXAuZ2V0SGVhZGVyKCk7CisJCQkJCQlTbG90SGFuZGxlIGhlYWRlckhhbmRsZSA9IGdyb3VwSGFuZGxlLmdldEhlYWRlcigpOworCQkJCQkJaWYJKGhlYWRlciAhPSBudWxsKSB7CisJCQkJCQkJYWRkR3JvdXBIZWFkZXJGb290ZXIoZGF0YW1hcnQsIGhlYWRlckhhbmRsZSwgaGVhZGVyLCBjb2x1bW5Db3VudCk7CisJCQkJCQl9CisJCQkJCQlpZgkoZ3JvdXAuaXNEZXRhaWxoZWFkZXIoKSkgeworCQkJCQkJCWhlYWRlckhhbmRsZS5hZGQoCisJCQkJCQkJCQlhZGRDb2x1bW5IZWFkZXJzKAorCQkJCQkJCQkJCWZXb3Jrc2V0LmZhY3RvcnkubmV3VGFibGVSb3coY29sdW1uQ291bnQpLAorCQkJCQkJCQkJCWdyb3VwLmdldEhlYWRlcnN0eWxlKCksCisJCQkJCQkJCQkJc2hvd25Db2x1bW5zLAorCQkJCQkJCQkJCXRhYmxlUHJvcGVydGllcykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlpZgkoZ3JvdXAuZ2V0Rm9vdGVyKCkgIT0gbnVsbCB8fCBncm91cC5pc0RldGFpbGZvb3RlcigpKSB7CisJCQkJCQlEYXRhbWFydFRhYmxlR3JvdXBGb290ZXIgZm9vdGVyID0gZ3JvdXAuZ2V0Rm9vdGVyKCk7CisJCQkJCQlTbG90SGFuZGxlIGZvb3RlckhhbmRsZSA9IGdyb3VwSGFuZGxlLmdldEZvb3RlcigpOworCQkJCQkJaWYJKGdyb3VwLmlzRGV0YWlsZm9vdGVyKCkpIHsKKwkJCQkJCQlmb290ZXJIYW5kbGUuYWRkKAorCQkJCQkJCQlhZGRDb2x1bW5IZWFkZXJzKAorCQkJCQkJCQkJZldvcmtzZXQuZmFjdG9yeS5uZXdUYWJsZVJvdyhjb2x1bW5Db3VudCksCisJCQkJCQkJCQlncm91cC5nZXRGb290ZXJzdHlsZSgpLAorCQkJCQkJCQkJc2hvd25Db2x1bW5zLAorCQkJCQkJCQkJdGFibGVQcm9wZXJ0aWVzKSk7CisJCQkJCQl9CisJCQkJCQlpZgkoZm9vdGVyICE9IG51bGwpIHsKKwkJCQkJCQlhZGRHcm91cEhlYWRlckZvb3RlcihkYXRhbWFydCwgZm9vdGVySGFuZGxlLCBmb290ZXIsIGNvbHVtbkNvdW50KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJZkl0ZW0uYWRkRWxlbWVudChncm91cEhhbmRsZSwgSUxpc3RpbmdFbGVtZW50TW9kZWwuR1JPVVBfU0xPVCk7CisJCQkJfQorCQkJCWNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyAtLS0gdGFibGUgZGV0YWlscyAtLS0KKwkJCS8vIC0tLSBoZWFkZXIgLS0tCisJCQl0cnkgeworCQkJCWlmCSh3aXRoSGVhZGVyRm9vdGVyLmlzRGV0YWlsaGVhZGVyKCkpIHsKKwkJCQkJYWRkQ29sdW1uSGVhZGVycygKKwkJCQkJCShSb3dIYW5kbGUpZkl0ZW0uZ2V0SGVhZGVyKCkuZ2V0KDApLAorCQkJCQkJd2l0aEhlYWRlckZvb3Rlci5nZXRIZWFkZXJzdHlsZSgpLAorCQkJCQkJc2hvd25Db2x1bW5zLAorCQkJCQkJdGFibGVQcm9wZXJ0aWVzKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gLS0tIGRldGFpbCBieSBkYXRhIC0tLQorCQkJCVJvd0hhbmRsZSB0YWJsZWRldGFpbCA9IChSb3dIYW5kbGUpZkl0ZW0uZ2V0RGV0YWlsICgpLmdldCgwKTsKKwkJCQlpZgkocHJvcGVydGllc1N0eWxlICE9IG51bGwpIHsKKwkJCQkJYXBwbHlTdHlsZShudWxsLCB0YWJsZWRldGFpbCwgcHJvcGVydGllc1N0eWxlKTsKKwkJCQl9CisJCQkJZm9yIChpbnQgY29sdW1uTm89MDsgY29sdW1uTm8gPCBzaG93bkNvbHVtbnMuc2l6ZSgpOyBjb2x1bW5ObysrICkgeyAKKwkJCQkJQ2VsbEhhbmRsZSBjZWxsID0gKENlbGxIYW5kbGUpIHRhYmxlZGV0YWlsLmdldENlbGxzKCkuZ2V0KGNvbHVtbk5vKTsKKwkJCQkJRGF0YUl0ZW1IYW5kbGUgZGF0YSA9IGZXb3Jrc2V0Lm5ld0RhdGFJdGVtKCIiKTsgLy8iZGF0YV8iK2N4Q2VsbFRhYmxlLmdldEhlYWRlck5hbWUoY29sdW1uTm8pKTsKKwkJCQkJZGF0YS5zZXRSZXN1bHRTZXRDb2x1bW4oLyoiZGF0YVNldFJvd1tcIiIgKyAqL3Nob3duQ29sdW1ucy5nZXQoY29sdW1uTm8pLmdldE5hbWUoKS8qICsgIlwiXSIqLyk7CisJCQkJCWNlbGwuZ2V0Q29udGVudCggKS5hZGQoIGRhdGEgKTsKKwkJCQkJYXBwbHlUYWJsZVByb3BlcnR5U3R5bGUoZGF0YSwgc2hvd25Db2x1bW5zLmdldChjb2x1bW5ObykuZ2V0TmFtZSgpLCB0YWJsZVByb3BlcnRpZXMsIHByb3BlcnRpZXNTdHlsZSk7CisJCQkJfQorCQkJCQorCQkJCWlmCSh3aXRoSGVhZGVyRm9vdGVyLmlzRGV0YWlsZm9vdGVyKCkpIHsKKwkJCQkJYWRkQ29sdW1uSGVhZGVycygKKwkJCQkJCShSb3dIYW5kbGUpZkl0ZW0uZ2V0Rm9vdGVyKCkuZ2V0KDApLAorCQkJCQkJd2l0aEhlYWRlckZvb3Rlci5nZXRIZWFkZXJzdHlsZSgpLAorCQkJCQkJc2hvd25Db2x1bW5zLAorCQkJCQkJdGFibGVQcm9wZXJ0aWVzKTsKKwkJCQkJfQorCisJCQkJLy8gLS0tIGFkZCBhbnkgYWdncmVnYXRpb24gY29sdW1ucyAtLS0KKwkJCQlmb3IJKERhdGFtYXJ0VGFibGVHcm91cCBncm91cCA6IGdyb3VwcykgeworCQkJCQlpZgkoZ3JvdXAuZ2V0SGVhZGVyKCkgIT0gbnVsbCkgeworCQkJCQkJaWYJKGdyb3VwLmdldEhlYWRlcigpICE9IG51bGwpIHsKKwkJCQkJCQlmb3IJKEdyaWRSb3cgcm93IDogZ3JvdXAuZ2V0SGVhZGVyKCkuZ2V0Um93cygpKSB7CisJCQkJCQkJCWZvcgkoR3JpZENlbGwgY2VsbCA6IHJvdy5nZXRDZWxscygpKSB7CisJCQkJCQkJCQlhZGRSZXN1bHRTZXRDb2x1bW4oc2hvd25Db2x1bW5zLCBjZWxsKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZgkoZ3JvdXAuZ2V0Rm9vdGVyKCkgIT0gbnVsbCkgeworCQkJCQkJaWYJKGdyb3VwLmdldEZvb3RlcigpICE9IG51bGwpIHsKKwkJCQkJCQlmb3IJKEdyaWRSb3cgcm93IDogZ3JvdXAuZ2V0Rm9vdGVyKCkuZ2V0Um93cygpKSB7CisJCQkJCQkJCWZvcgkoR3JpZENlbGwgY2VsbCA6IHJvdy5nZXRDZWxscygpKSB7CisJCQkJCQkJCQlhZGRSZXN1bHRTZXRDb2x1bW4oc2hvd25Db2x1bW5zLCBjZWxsKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQkvLyAtLS0gc2V0IGFsbCBib3VuZCBlbGVtZW50cyAtLS0KKwkJCQlmSXRlbS5nZXRFbGVtZW50KCkuc2V0UHJvcGVydHkoSVJlcG9ydEl0ZW1Nb2RlbC5CT1VORF9EQVRBX0NPTFVNTlNfUFJPUCwgc2hvd25Db2x1bW5zKTsKKwkJCX0KKwkJCWNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRHcm91cEhlYWRlckZvb3RlcihEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIFNsb3RIYW5kbGUgaGVhZGVyRm9vdGVySGFuZGxlLCBPYmplY3QgaGVhZGVyRm9vdGVyLCBpbnQgY29sdW1uQ291bnQpIHsKKwkJZm9yCShHcmlkUm93IHJvdyA6ICgoU29tZUdyaWQpaGVhZGVyRm9vdGVyKS5nZXRSb3dzKCkpIHsKKwkJCVN0eWxlIHJvd1N0eWxlID0gbnVsbDsKKwkJCWludCByb3dDb2x1bW5zID0gY29sdW1uQ291bnQ7CisJCQlmb3IJKEdyaWRDZWxsIGNlbGwgOiByb3cuZ2V0Q2VsbHMoKSkgeworCQkJCWlmCShjZWxsLmdldENvbHVtbnNwYW4oKSA+IDEpIHsKKwkJCQkJcm93Q29sdW1ucyA9IE1hdGgubWF4KDEsIHJvd0NvbHVtbnMgLSAoY2VsbC5nZXRDb2x1bW5zcGFuKCktMSkpOworCQkJCX0KKwkJCX0KKwkJCVJvd0hhbmRsZSByb3dIYW5kbGUgPSBmV29ya3NldC5mYWN0b3J5Lm5ld1RhYmxlUm93KHJvd0NvbHVtbnMpOworCQkJaWYJKHJvdy5nZXRTdHlsZSgpICE9IG51bGwpIHsKKwkJCQlyb3dTdHlsZSA9IHJvdy5nZXRTdHlsZSgpOworCQkJfQorCQkJZWxzZSBpZgkoKChXaXRoU3R5bGUpaGVhZGVyRm9vdGVyKS5nZXRTdHlsZSgpICE9IG51bGwpIHsKKwkJCQlyb3dTdHlsZSA9ICgoV2l0aFN0eWxlKWhlYWRlckZvb3RlcikuZ2V0U3R5bGUoKTsKKwkJCX0KKwkJCWlmCShyb3dTdHlsZSAhPSBudWxsKSB7CisJCQkJYXBwbHlTdHlsZShmSXRlbS5nZXREZXNpZ25IYW5kbGUoKSwgcm93SGFuZGxlLCByb3dTdHlsZSk7CisJCQl9CisJCQlpbnQgY29sdW1uTm8gPSAwOworCQkJZm9yCShHcmlkQ2VsbCBjZWxsIDogcm93LmdldENlbGxzKCkpIHsKKwkJCQlDZWxsSXRlbSBjZWxsSXRlbSA9IG5ldyBDZWxsSXRlbShmV29ya3NldCwgKENlbGxIYW5kbGUpIHJvd0hhbmRsZS5nZXRDZWxscygpLmdldChjb2x1bW5ObykpOworCQkJCWZXb3Jrc2V0LmdlbmVyYXRvci5nZW5lcmF0ZUl0ZW1zKGRhdGFtYXJ0LCBmV29ya3NldCwgY2VsbEl0ZW0uc2V0Q29sdW1uU3BhbihjZWxsLmdldENvbHVtbnNwYW4oKSksIGNlbGwuZ2V0RWxlbWVudHMoKS50b0FycmF5KG5ldyBFbGVtZW50WzBdKSk7CisJCQkJY29sdW1uTm8rKzsKKwkJCQlpZgkoY29sdW1uTm8gPj0gcm93Q29sdW1ucykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl0cnkgeworCQkJCWhlYWRlckZvb3RlckhhbmRsZS5hZGQocm93SGFuZGxlKTsKKwkJCX0gY2F0Y2ggKENvbnRlbnRFeGNlcHRpb24gfCBOYW1lRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBseVRhYmxlUHJvcGVydHlTdHlsZShEZXNpZ25FbGVtZW50SGFuZGxlIGVsZW1lbnRIYW5kbGUsIFN0cmluZyBjb2x1bW5OYW1lLCBEYXRhbWFydFRhYmxlUHJvcGVydHlbXSB0YWJsZVByb3BlcnRpZXMsIFN0eWxlIGZvcmNlRXh0ZW5kcykgeworCQlTdHlsZSBlbGVtZW50U3R5bGUgPSBudWxsOworCQlpZgkodGFibGVQcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCWZvcgkoRGF0YW1hcnRUYWJsZVByb3BlcnR5IHRhYmxlUHJvcGVydHkgOiB0YWJsZVByb3BlcnRpZXMpIHsKKwkJCQlpZgkodGFibGVQcm9wZXJ0eS5nZXRDb2x1bW4oKSBpbnN0YW5jZW9mIFRhYmxlUHJvcGVydHkpIHsKKwkJCQkJaWYJKHRhYmxlUHJvcGVydHkuZ2V0U3R5bGUoKSAhPSBudWxsKSB7CisJCQkJCQlEYXRhbWFydFByb3BlcnR5IGRhdGFtYXJ0UHJvcGVydHkgPSAoKFRhYmxlUHJvcGVydHkpdGFibGVQcm9wZXJ0eS5nZXRDb2x1bW4oKSkuZ2V0VmFsdWVSZWYoKTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJaWYJKGNvbHVtbk5hbWUuZXF1YWxzSWdub3JlQ2FzZShkYXRhbWFydFByb3BlcnR5LmdldFByb3BlcnR5UmVmKCkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQllbGVtZW50U3R5bGUgPSB0YWJsZVByb3BlcnR5LmdldFN0eWxlKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWFwcGx5U3R5bGUoZkl0ZW0uZ2V0RGVzaWduSGFuZGxlKCksIGVsZW1lbnRIYW5kbGUsIGVsZW1lbnRTdHlsZSwgZm9yY2VFeHRlbmRzKTsKKwl9CisJCisJcHJpdmF0ZSBSb3dIYW5kbGUgYWRkQ29sdW1uSGVhZGVycyhSb3dIYW5kbGUgcm93SGFuZGxlLCBTdHlsZSBzdHlsZSwgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBzaG93bkNvbHVtbnMsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eVtdIHRhYmxlUHJvcGVydGllcykgdGhyb3dzIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJaWYJKHN0eWxlICE9IG51bGwpIHsKKwkJCWFwcGx5U3R5bGUoZkl0ZW0uZ2V0RGVzaWduSGFuZGxlKCksIHJvd0hhbmRsZSwgc3R5bGUpOworCQl9CisJCWZvciAoaW50IGNvbHVtbk5vPTA7IGNvbHVtbk5vIDwgc2hvd25Db2x1bW5zLnNpemUoKTsgY29sdW1uTm8rKykgeworCQkJQ29tcHV0ZWRDb2x1bW4gY29sdW1uID0gc2hvd25Db2x1bW5zLmdldChjb2x1bW5Obyk7CisJCQlMYWJlbEhhbmRsZSBsYWJlbCA9IGZXb3Jrc2V0LmZhY3RvcnkubmV3TGFiZWwoIiIpOworCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gY29sdW1uLmdldERpc3BsYXlOYW1lKCk7CisJCQlpZgkoZGlzcGxheU5hbWUuc3RhcnRzV2l0aChEYXRhSXRlbS5ESVNQTEFZTkFNRV9BR0dSRUdBVElPTl9QUkVGSVgpKSB7CisJCQkJZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZS5zdWJzdHJpbmcoRGF0YUl0ZW0uRElTUExBWU5BTUVfQUdHUkVHQVRJT05fUFJFRklYLmxlbmd0aCgpKTsKKwkJCQlsYWJlbC5zZXRUZXh0S2V5KEkxOE5LZXlHZW5lcmF0b3Iua2V5KGRpc3BsYXlOYW1lKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlsYWJlbC5zZXRUZXh0S2V5KEkxOE5LZXlHZW5lcmF0b3Iua2V5KGNvbHVtbi5nZXREaXNwbGF5TmFtZSgpKSk7CisJCQl9CisJCQlsYWJlbC5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7CisJCQlhcHBseVRhYmxlUHJvcGVydHlTdHlsZShsYWJlbCwgY29sdW1uLmdldE5hbWUoKSwgdGFibGVQcm9wZXJ0aWVzLCBzdHlsZSk7CisJCQlDZWxsSGFuZGxlIGNlbGwgPSAoQ2VsbEhhbmRsZSkgcm93SGFuZGxlLmdldENlbGxzKCkuZ2V0KGNvbHVtbk5vKTsKKwkJCWNlbGwuZ2V0Q29udGVudCgpLmFkZChsYWJlbCk7CisJCX0KKwkJcmV0dXJuIHJvd0hhbmRsZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFJlc3VsdFNldENvbHVtbihBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+IGxpc3QsIENvbnRhaW5lciBjb250YWluZXIpIHsKKwkJZm9yCShFbGVtZW50IGVsZW1lbnQgOiBjb250YWluZXIuZ2V0RWxlbWVudHMoKSkgeworCQkJaWYJKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250YWluZXIpIHsKKwkJCQlhZGRSZXN1bHRTZXRDb2x1bW4obGlzdCwgKENvbnRhaW5lcikgZWxlbWVudCk7CisJCQl9CisJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZVByb3BlcnR5KSB7CisJCQkJVGFibGVWYWx1ZUVsZW1lbnQgdmFsdWUgPSAoKERhdGFtYXJ0VGFibGVQcm9wZXJ0eSllbGVtZW50KS5nZXRDb2x1bW4oKTsKKwkJCQlpZgkodmFsdWUgaW5zdGFuY2VvZiBUYWJsZUFnZ3JlZ2F0aW9uKSB7CisJCQkJCWxpc3QuYWRkKERhdGFJdGVtLmNyZWF0ZUNvbXB1dGVkQ29sdW1uKChUYWJsZUFnZ3JlZ2F0aW9uKSB2YWx1ZSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlTbG90SGFuZGxlIGdldFNsb3RIYW5kbGUoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9UZXh0SXRlbS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2NvbW1vbi9pdGVtL1RleHRJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkYThiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vaXRlbS9UZXh0SXRlbS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0SXRlbUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuVGV4dEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWwuUmVwb3J0R2VuZXJhdG9yV29ya1NldDsKKworcHVibGljIGNsYXNzIFRleHRJdGVtIGltcGxlbWVudHMgQmFzZUl0ZW0geworCisJcHJpdmF0ZSBmaW5hbCBUZXh0SXRlbUhhbmRsZSBmSXRlbTsKKwkKKwlwdWJsaWMgVGV4dEl0ZW0oUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3Jrc2V0LCBTdHJpbmcgaTE4bktleSwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50VHlwZSkgeworCQlmSXRlbSA9IHdvcmtzZXQuZmFjdG9yeS5uZXdUZXh0SXRlbShudWxsKTsKKwkJdHJ5IHsKKwkJCWZJdGVtLnNldENvbnRlbnRLZXkoaTE4bktleSk7CisJCQlmSXRlbS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisJCQlmSXRlbS5zZXRDb250ZW50KGNvbnRlbnQpOworCQl9IGNhdGNoIChTZW1hbnRpY0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSZXBvcnRJdGVtSGFuZGxlIGdldEhhbmRsZSgpIHsKKwkJcmV0dXJuIGZJdGVtOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2Zvcm1hdHRpbmcvUmVwb3J0RFNMRm9ybWF0dGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2Zvcm1hdHRpbmcvUmVwb3J0RFNMRm9ybWF0dGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzEzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvZm9ybWF0dGluZy9SZXBvcnREU0xGb3JtYXR0ZXIueHRlbmQKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mb3JtYXR0aW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZUZvcm1hdHRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmZvcm1hdHRpbmcuaW1wbC5Gb3JtYXR0aW5nQ29uZmlnCisvL2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5zZXJ2aWNlcy5SZXBvcnREU0xHcmFtbWFyQWNjZXNzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy54dGV4dC5HZW5lcmljRm9ybWF0dGVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VydmljZXMuWHR5cGVHcmFtbWFyQWNjZXNzCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuUGFyc2VyUnVsZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkdyYW1tYXJVdGlsCisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjdXN0b20gZm9ybWF0dGluZyBkZXNjcmlwdGlvbi4KKyAqIAorICogc2VlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjZm9ybWF0dGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdCAKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitjbGFzcyBSZXBvcnREU0xGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyIHsKKworLy8JQEluamVjdCBleHRlbnNpb24gUmVwb3J0RFNMR3JhbW1hckFjY2VzcworCUBJbmplY3QgWHR5cGVHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MKKworCW92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUZvcm1hdHRpbmcoRm9ybWF0dGluZ0NvbmZpZyBjKSB7CisJCXZhbCBnZW5lcmljRm9ybWF0dGVyID0gbmV3IEdlbmVyaWNGb3JtYXR0ZXIoKQorCQl2YXIgUGFyc2VyUnVsZSBpbXBvcnREZWYgID0gIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZSggZ3JhbW1hci5ncmFtbWFyLCAiUmVwb3J0SW1wb3J0IiApIGFzIFBhcnNlclJ1bGUKKwkJdmFyIFBhcnNlclJ1bGUgZm9udERlZiAgICA9ICBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoIGdyYW1tYXIuZ3JhbW1hciwgIkZvbnRGYW1pbHkiICAgKSBhcyBQYXJzZXJSdWxlCisJCXZhciBQYXJzZXJSdWxlIGFnZ0RlZiAgICAgPSAgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKCBncmFtbWFyLmdyYW1tYXIsICJUYWJsZUJhc2VBZ2dyZWdhdGlvbiIgKSBhcyBQYXJzZXJSdWxlCisKKwkJLy8JZHNsLXNwZWNpZmljIGZvcm1hdHRpbmc6CisJCWNvbmZpZy5zZXRMaW5ld3JhcCggMSwgMSwgMiApLmFmdGVyKCBpbXBvcnREZWYgKQorCQlnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoIGMsIGdyYW1tYXIuZ3JhbW1hciwgIlBhZ2VUZW1wbGF0ZSIgKQorCQlnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoIGMsIGdyYW1tYXIuZ3JhbW1hciwgIlNvbWVGb3JtYXRzIiAgICkKKwkJZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKCBjLCBncmFtbWFyLmdyYW1tYXIsICJDb2xvcnMiICAgICAgICApCisJCWdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyggYywgZ3JhbW1hci5ncmFtbWFyLCAiRm9udHMiICAgICAgICAgKQorCQlnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoIGMsIGdyYW1tYXIuZ3JhbW1hciwgIk1lZGlhcyIgICAgICAgICkKKwkJZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKCBjLCBncmFtbWFyLmdyYW1tYXIsICJTdHlsZXMiICAgICAgICApCisJCWdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyggYywgZ3JhbW1hci5ncmFtbWFyLCAiUmVwb3J0IiAgICAgICAgKQorCQljb25maWcuc2V0Tm9MaW5ld3JhcCgpLmJlZm9yZSggZm9udERlZiApCisJCWNvbmZpZy5zZXROb0xpbmV3cmFwKCkuYmVmb3JlKCBhZ2dEZWYgICkKKworCQkvLwljb21tb24gZm9ybWF0dGluZzoKKwkJZ2VuZXJpY0Zvcm1hdHRlci5nZW5lcmljRm9ybWF0dGluZyggYywgZ3JhbW1hciwgZ3JhbW1hckFjY2VzcyApCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1JlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU0N2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1JlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKQEAgLTAsMCArMSwyOTAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbAorCitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLkNvbnRhaW5lci5GaWx0ZXIKK2ltcG9ydCBjb20udmFhZGluLnVpLkxhYmVsCitpbXBvcnQgY29tLnZhYWRpbi51aS5WZXJ0aWNhbExheW91dAoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0CitpbXBvcnQgamF2YS51dGlsLlNldAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveQoraW1wb3J0IGphdmF4LmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcgoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLk1BcHBsaWNhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5JUHJlc2VudGF0aW9uRW5naW5lCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxUeXBlZFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZXZlbnRicm9rZXIuRXZlbnRCcm9rZXJNc2cKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkudGhlbWVzLklUaGVtZVJlc291cmNlU2VydmljZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXIuSVVzZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmNvbnN0YW50cy5HZW5lcmF0b3JDb25zdGFudHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25QYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5qdm1tb2RlbC5EYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZW5kZXJpbmdFbnVtCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0RGVzaWduRmlsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0UGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5BYnN0cmFjdFJlcG9ydEJlYW4KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uQmFzZVJlcG9ydAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1EZWNsYXJlZFR5cGUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVmlzaWJpbGl0eQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZVByb3ZpZGVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuQWJzdHJhY3RNb2RlbEluZmVycmVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtVHlwZXNCdWlsZGVyCisKKy8qKgorICogPHA+SW5mZXJzIGEgSlZNIG1vZGVsIGZyb20gdGhlIHNvdXJjZSBtb2RlbC48L3A+IAorICoKKyAqIDxwPlRoZSBKVk0gbW9kZWwgc2hvdWxkIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUgCisgKiB3aGljaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsLiBPdGhlciBtb2RlbHMgbGluayBhZ2FpbnN0IHRoZSBKVk0gbW9kZWwgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZSBtb2RlbC48L3A+ICAgICAKKyAqLworY2xhc3MgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlciBleHRlbmRzIEFic3RyYWN0TW9kZWxJbmZlcnJlciB7CisKKyAgICAvKioKKyAgICAgKiBjb252ZW5pZW5jZSBBUEkgdG8gYnVpbGQgYW5kIGluaXRpYWxpemUgSlZNIHR5cGVzIGFuZCB0aGVpciBtZW1iZXJzLgorICAgICAqLworCUBJbmplY3QgZXh0ZW5zaW9uIEp2bVR5cGVzQnVpbGRlcgorCUBJbmplY3QgZXh0ZW5zaW9uIElRdWFsaWZpZWROYW1lUHJvdmlkZXIKKwlASW5qZWN0IGV4dGVuc2lvbiBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIKKworCWRlZiBkaXNwYXRjaCB2b2lkIGluZmVyKFJlcG9ydFBhY2thZ2UgcGNrZywgSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yIGFjY2VwdG9yLCBib29sZWFuIGlzUHJlSW5kZXhpbmdQaGFzZSkgeworCQlwY2tnLnJlcG9ydHMuZm9yRWFjaFsgcmVwb3J0IHwKKwkJCXZhciBjbHMgPSByZXBvcnQudG9DbGFzcyhyZXBvcnQuZnVsbHlRdWFsaWZpZWROYW1lKyJSZXBvcnQiKQorCSAgIAkJYWNjZXB0b3IuYWNjZXB0KGNscywgWworCQkgICAgICAgIGdldFN1cGVyVHlwZXMoKS5hZGQoX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQmFzZVJlcG9ydCkpCisJCQkgCWRvY3VtZW50YXRpb24gPSBHZW5lcmF0b3JDb25zdGFudHMuR0VORVJBVEVEX0NMQVNTRVNfRE9DVU1FTlRBVElPTgorICAgCQkJCWl0LnRvQ29uc3RydWN0b3IocmVwb3J0KQorICAgCQkJCWl0LnRvT3BlcmF0aW9ucyhwY2tnLCByZXBvcnQpCisgICAJCQldKQorCQkJY2xzLmFkZFJlcG9ydEJlYW4ocGNrZywgcmVwb3J0LCBhY2NlcHRvcikKKwkJXQorCX0KKwkKKwlkZWYgdm9pZCBhZGRSZXBvcnRCZWFuKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBSZXBvcnRQYWNrYWdlIHBja2csIFJlcG9ydCByZXBvcnQsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvcikgeworCQl2YXIgYmVhbkNscyA9IHJlcG9ydC50b0NsYXNzKCJCZWFuIikKKyAgICAgICAgdHlwZS5tZW1iZXJzICs9IGJlYW5DbHMKKyAgIAkJYWNjZXB0b3IuYWNjZXB0KGJlYW5DbHMsIFsKKwkgICAgICAgIGdldFN1cGVyVHlwZXMoKS5hZGQoX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQWJzdHJhY3RSZXBvcnRCZWFuKSkKKwkJIAlkb2N1bWVudGF0aW9uID0gR2VuZXJhdG9yQ29uc3RhbnRzLkdFTkVSQVRFRF9DTEFTU0VTX0RPQ1VNRU5UQVRJT04KKwkJCXN0YXRpYyA9IHRydWUKKwkJCWl0Lm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJjcmVhdGVSZXBvcnQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihCYXNlUmVwb3J0KSwgWworCQkJCXZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRAorCQkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUpCisJCQkJYm9keSA9IFsKKwkJCQkJYXBwZW5kKCcnJ3JldHVybiBuZXcgwqtyZXBvcnQuZnVsbHlRdWFsaWZpZWROYW1lwrtSZXBvcnQobnVsbCxudWxsLG51bGwpOycnJykKKwkJCQldCisJCQldKQorCQldKQorCX0KKwkKKwlkZWYgdm9pZCB0b0NvbnN0cnVjdG9yKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBSZXBvcnQgcmVwb3J0KSB7CisJCXR5cGUubWVtYmVycyArPSByZXBvcnQudG9Db25zdHJ1Y3RvcihbCisJCQlkb2N1bWVudGF0aW9uID0gcmVwb3J0LmRvY3VtZW50YXRpb24KKwkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoSW5qZWN0KQorICAgCQkJcGFyYW1ldGVycyArPSByZXBvcnQudG9QYXJhbWV0ZXIoInBhcmVudCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0KSkKKyAgIAkJCXBhcmFtZXRlcnMgKz0gcmVwb3J0LnRvUGFyYW1ldGVyKCJjb250ZXh0IiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSUVjbGlwc2VDb250ZXh0KSkKKyAgIAkJCXBhcmFtZXRlcnMgKz0gcmVwb3J0LnRvUGFyYW1ldGVyKCJhcHAiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihNQXBwbGljYXRpb24pKQorCQkJYm9keSA9IFsgYXBwZW5kKCcnJ3N1cGVyKHBhcmVudCxjb250ZXh0LGFwcCk7JycnKV0KKwkJXSkKKwl9CisJCisJZGVmIHZvaWQgdG9PcGVyYXRpb25zKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBSZXBvcnRQYWNrYWdlIHBja2csIFJlcG9ydCByZXBvcnQpIHsKKwkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b0ZpZWxkKCJldmVudEJyb2tlciIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElFdmVudEJyb2tlcikpIFthbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdCldCisJCXR5cGUubWVtYmVycyArPSByZXBvcnQudG9GaWVsZCgicmVuZGVyaW5nRW5naW5lIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSVByZXNlbnRhdGlvbkVuZ2luZSkpWworCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QpXQorCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvRmllbGQoInRoZW1lUmVzb3VyY2VTZXJ2aWNlIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSVRoZW1lUmVzb3VyY2VTZXJ2aWNlKSlbCisJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdCldCisJCWlmKHJlcG9ydC50b29sYmFyICE9IG51bGwpIHsKKwkJCXZhciBwYWNrYWdlTmFtZSA9IChyZXBvcnQudG9vbGJhci5lQ29udGFpbmVyIGFzIEFjdGlvblBhY2thZ2UpLmZ1bGx5UXVhbGlmaWVkTmFtZS50b1N0cmluZworCQkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b0ZpZWxkKCJ0b29sYmFyQ2xhc3MiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZignJyfCq3BhY2thZ2VOYW1lwrsuwqtyZXBvcnQudG9vbGJhci5uYW1lLnRvU3RyaW5nLnRvRmlyc3RVcHBlcsK7QWN0aW9uJycnKSkKKwkJfQorCQkKKyAgIAkJLy8gY3JlYXRlIHZpZXcKKyAgIAkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b01ldGhvZCgiY3JlYXRlVmlldyIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisgICAJCQlwYXJhbWV0ZXJzICs9IHJlcG9ydC50b1BhcmFtZXRlcigicGFyZW50IiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoVmVydGljYWxMYXlvdXQpKQorICAgCQkJYm9keSA9IFsgYXBwZW5kKCcnJ8KrcmVwb3J0LmNyZWF0ZVZpZXfCuycnJyldCisgICAJCV0pCisJCS8vIHN1YnNjcmliZSB0byBldmVudEJyb2tlcgorCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJzdWJzY3JpYmUiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkOjpUWVBFKSwgWworCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKFBvc3RDb25zdHJ1Y3QpCisJCQlib2R5ID0gWworCQkgICAJCS8vIGdldCBhbGwgZW50aXRpZXMgcmVxdWVzdGVkIGluIHRoaXMgcmVwb3J0CisJCSAgIAkJdmFyIGVudGl0ZXMgPSBmaW5kUmVxdWVzdGVkRW50aXRpZXMocmVwb3J0KQorCQkJCWZvciAoTEVudGl0eSBlbnRpdHkgOiBlbnRpdGVzKSB7CisJCQkJCWFwcGVuZCgnJycKKwkJCQkJCWV2ZW50QnJva2VyLnN1YnNjcmliZShFdmVudEJyb2tlck1zZy5SRUZSRVNIX1ZJRVcrIsKrRXZlbnRCcm9rZXJNc2cuZ2V0RW50aXR5SWRNb2RpZmllZENhdGVnb3J5KChlbnRpdHkuZUNvbnRhaW5lciBhcyBMVHlwZWRQYWNrYWdlKS5uYW1lLCBlbnRpdHkubmFtZSnCuyIsIGZNb2RpZmllZEVudGl0eUlkc0xpc3RlbmVyKTsKKwkJCQkJJycnKQorCQkJCX0KKwkJCV0KKwkJXSkKKwkJLy8gdW5zdWJzY3JpYmUgZnJvbSBldmVudEJyb2tlcgorCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJ1bnN1YnNjcmliZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoUHJlRGVzdHJveSkKKwkJCWJvZHkgPSBbCisJCQkJYXBwZW5kKCcnJworCQkJCQlldmVudEJyb2tlci51bnN1YnNjcmliZShmTW9kaWZpZWRFbnRpdHlJZHNMaXN0ZW5lcik7CisJCQkJJycnKQorCQkJXQorCQldKQorCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJnZXRSZW5kZXJpbmdBcyIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElSZXBvcnRQcm92aWRlci5SZW5kZXJpbmcpLCBbCisJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUpCisJCQlib2R5ID0gWworCQkJCXN3aXRjaCAocmVwb3J0LnJlbmRlcmluZykgeworCQkJCQljYXNlIFJlbmRlcmluZ0VudW0uSFRNTDoKKwkJCQkJCWFwcGVuZCgnJydyZXR1cm4gUmVuZGVyaW5nLkhUTUxfU1RSRUFNOycnJykKKwkJCQkJY2FzZSBSZW5kZXJpbmdFbnVtLlBERjoKKwkJCQkJCWFwcGVuZCgnJydyZXR1cm4gUmVuZGVyaW5nLlBERl9TVFJFQU07JycnKQorCQkJCX0KKwkJCV0KKwkJXSkKKwkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b01ldGhvZCgiZ2V0UmVwb3J0TmFtZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZyksIFsKKwkJCXZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRAorCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCWJvZHkgPSBbYXBwZW5kKCcnJ3JldHVybiAiwqtyZXBvcnQubmFtZcK7IjsnJycpXQorCQldKQorCQlpZgkocGNrZy5leHRlcm5hbENzc1VSSUJ1bmRsZSAhPSBudWxsIHx8IHJlcG9ydC5leHRlcm5hbENzc1VSSUJ1bmRsZSAhPSBudWxsKSB7CisJCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJnZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZyksIFsKKwkJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKE92ZXJyaWRlKQorCQkJCWJvZHkgPSBbCisJCQkJCWlmCShyZXBvcnQuZXh0ZXJuYWxDc3NVUklCdW5kbGUgIT0gbnVsbCkgeworCQkJCQkJYXBwZW5kKCcnJ3JldHVybiAiwqtyZXBvcnQuZXh0ZXJuYWxDc3NVUklCdW5kbGXCuyI7JycnKQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJYXBwZW5kKCcnJ3JldHVybiAiwqtwY2tnLmV4dGVybmFsQ3NzVVJJQnVuZGxlwrsiOycnJykKKwkJCQkJfQorCQkJCV0KKwkJCV0pCisJCX0KKwkJaWYJKHBja2cuZXh0ZXJuYWxDc3NVUkkgIT0gbnVsbCB8fCByZXBvcnQuZXh0ZXJuYWxDc3NVUkkgIT0gbnVsbCkgeworCQkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b01ldGhvZCgiZ2V0RXh0ZXJuYWxDc3NVUkkiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcpLCBbCisJCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCQlib2R5ID0gWworCQkJCQlpZgkocmVwb3J0LmV4dGVybmFsQ3NzVVJJICE9IG51bGwpIHsKKwkJCQkJCWFwcGVuZCgnJydyZXR1cm4gIsKrcmVwb3J0LmV4dGVybmFsQ3NzVVJJwrsiOycnJykKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWFwcGVuZCgnJydyZXR1cm4gIsKrcGNrZy5leHRlcm5hbENzc1VSScK7IjsnJycpCisJCQkJCX0KKwkJCQldCisJCQldKQorCQl9CisJCXR5cGUubWVtYmVycyArPSByZXBvcnQudG9NZXRob2QoImdldERhdGFtYXJ0SW5zdGFuY2UiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRGF0YU1hcnQpLCBbCisJCQlkb2N1bWVudGF0aW9uID0gcmVwb3J0LmRhdGFtYXJ0UmVmLmRvY3VtZW50YXRpb24KKwkJCXZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRAorCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCWJvZHkgPSBbCisJCQkJYXBwZW5kKCcnJ3JldHVybiBuZXcgwqtyZXBvcnQuZGF0YW1hcnRSZWYuZnVsbHlRdWFsaWZpZWROYW1lwrtEYXRhbWFydCgpOycnJykKKwkJCV0KKwkJXSkKKwkJaWYJKHJlcG9ydC5kZXNpZ24gaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25GaWxlKSB7CisJCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJnZXRSZXBvcnREZXNpZ25GaWxlbmFtZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZyksIFsKKwkJCQlkb2N1bWVudGF0aW9uID0gcmVwb3J0LmRlc2lnbi5kb2N1bWVudGF0aW9uCisJCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCQlib2R5ID0gWworCQkJCQlhcHBlbmQoJycncmV0dXJuICLCqyhyZXBvcnQuZGVzaWduIGFzIFJlcG9ydERlc2lnbkZpbGUpLm5hbWXCuyI7JycnKQorCQkJCV0KKwkJCV0pCisJCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJidWlsZFJlcG9ydCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKHZvaWQpLCBbCisJCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCQlib2R5ID0gW11dKQorCQl9CisJCWVsc2UgaWYgKHJlcG9ydC5kZXNpZ24gaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25UZW1wbGF0ZSkgeworCQkJdHlwZS5tZW1iZXJzICs9IHJlcG9ydC50b01ldGhvZCgiZ2V0UmVwb3J0RGVzaWduRmlsZW5hbWUiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcpLCBbCisJCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQkJYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZSkKKwkJCQlib2R5ID0gWworCQkJCQlhcHBlbmQoJycncmV0dXJuIG51bGw7JycnKQorCQkJCV0KKwkJCV0pCisJCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJidWlsZFJlcG9ydCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKHZvaWQpLCBbCisJCQkJZG9jdW1lbnRhdGlvbiA9IHJlcG9ydC5kZXNpZ24uZG9jdW1lbnRhdGlvbgorCQkJCXZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRAorCQkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUpCisJCQkJYm9keSA9IFsKKwkJCQldCisJCQldKQorCQl9CisgICAJCXR5cGUubWVtYmVycyArPSByZXBvcnQudG9NZXRob2QoImFwcGx5QmVhbkZpbHRlciIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisgICAJCQlwYXJhbWV0ZXJzICs9IHJlcG9ydC50b1BhcmFtZXRlcigiZmlsdGVyIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoRmlsdGVyKSkKKyAgIAkJCWJvZHkgPSBbCisvLwkJCQlpZgkoZHRvUXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7CisJICAgCQkJCWFwcGVuZCgnJycKKwkgICAJCQkJCS8vICEhISBubyBkYXRhbWFydCwgZW50aXR5IGFuZCBEVE8gZm91bmQgZm9yIHRoZSByZXBvcnQgLS0+IG5vdGhpbmcgY2FuIGJlIGRvbmUgaW4gaGVyZSAhISEKKwkJICAgCQkJJycnKQorLy8JCQkJfQorLy8JCQkJZWxzZSB7CisvLwkgICAJCQkJYXBwZW5kKCcnJworLy8JCSAgIAkJCQlpZgkoZmlsdGVyICE9IG51bGwpIHsKKy8vCQkgICAJCQkJCWZGaWx0ZXJHZW5lcmF0b3IgPSBSZXBvcnRCZWFuRmlsdGVyR2VuZXJhdG9yLmZpbHRlcigiwqtlbnRpdHkuZnVsbHlRdWFsaWZpZWROYW1lLnRvU3RyaW5nwrsiLCBmaWx0ZXIpOworLy8JCSAgIAkJCQl9CisvLwkJICAgCQkJJycnKQorLy8JICAgCQkJfQorCSAgIAkJXQorICAgCQldKQorICAgCQl0eXBlLm1lbWJlcnMgKz0gcmVwb3J0LnRvTWV0aG9kKCJhcHBseUJlYW5EdG8iLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkOjpUWVBFKSwgWworICAgCQkJcGFyYW1ldGVycyArPSByZXBvcnQudG9QYXJhbWV0ZXIoImR0byIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKE9iamVjdCkpCisgICAJCQlib2R5ID0gWworLy8JCQkJaWYJKGR0b1F1YWxpZmllZE5hbWUgPT0gbnVsbCkgeworCSAgIAkJCQlhcHBlbmQoJycnCisJICAgCQkJCQkvLyAhISEgbm8gZGF0YW1hcnQsIGVudGl0eSBhbmQgRFRPIGZvdW5kIGZvciB0aGUgcmVwb3J0IC0tPiBub3RoaW5nIGNhbiBiZSBkb25lIGluIGhlcmUgISEhCisJCSAgIAkJCScnJykKKy8vCQkJCX0KKy8vCQkJCWVsc2UgeworLy8JICAgCQkJCWFwcGVuZCgnJycKKy8vCQkgICAJCQkJaWYJKGR0byAhPSBudWxsKSB7CisvLwkJICAgCQkJCQlmRmlsdGVyR2VuZXJhdG9yID0gUmVwb3J0QmVhbkZpbHRlckdlbmVyYXRvci5kdG8oZHRvLCAoKMKrZHRvUXVhbGlmaWVkTmFtZcK7KWR0bykuZ2V0SWQoKSk7CisvLwkJICAgCQkJCX0KKy8vCQkgICAJCQknJycpCisvLwkJCQl9CisJICAgCQldCisgICAJCV0pCisJfQorCQorCS8qKgorCSAqIGdldCBhIHNldCBvZiBhbGwgZW50aXRpZXMgdXNlZCBpbiB0aGUgZ2l2ZW4gcmVwb3J0CisJICovCisJZGVmIFNldDxMRW50aXR5PiBmaW5kUmVxdWVzdGVkRW50aXRpZXMoUmVwb3J0IHJlcG9ydCkgeworCQl2YXIgZW50aXRpZXMgPSBuZXcgSGFzaFNldDxMRW50aXR5PigpCisJCWVudGl0aWVzLmFkZEFsbChyZXBvcnQuZGF0YW1hcnRSZWYuZmluZEFsbEVudGl0aWVzKCkpCisJCXJldHVybiBlbnRpdGllcworCX0KKworCWRlZiBjcmVhdGVWaWV3KFJlcG9ydCByZXBvcnQpIAorCQknJycKKwkJZldvcmtzZXQJPSBuZXcgUmVwb3J0R2VuZXJhdG9yV29ya1NldCgpOworCQnCq0lGIHJlcG9ydC50b29sYmFyICE9IG51bGzCuworCQl0b29sYmFyQ2xhc3MgPSBuZXcgwqtyZXBvcnQudG9vbGJhci5uYW1lLnRvU3RyaW5nLnRvRmlyc3RVcHBlcsK7QWN0aW9uKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworCQl0b29sYmFyQ2xhc3MuY3JlYXRlVG9vbGJhcihnZXRDb250ZXh0KCksIHJlbmRlcmluZ0VuZ2luZSwgdGhlbWVSZXNvdXJjZVNlcnZpY2UpOworCQlhZGRQREZEb3dubG9hZCh0b29sYmFyQ2xhc3MpOworCQnCq0VORElGwrsKKwkJY3JlYXRlRmlsdGVyKCk7CisJCScnJworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1JlcG9ydEdlbmVyYXRvcldvcmtTZXQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9qdm1tb2RlbC9SZXBvcnRHZW5lcmF0b3JXb3JrU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzZDBjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9qdm1tb2RlbC9SZXBvcnRHZW5lcmF0b3JXb3JrU2V0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRGF0YUl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5PZGFEYXRhU2V0SGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5SZXBvcnREZXNpZ25IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNoYXJlZFN0eWxlSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5zdHJ1Y3R1cmVzLkNvbXB1dGVkQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5zdHJ1Y3R1cmVzLkVtYmVkZGVkSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuT2RhUmVzdWx0U2V0Q29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmVsZW1lbnRzLkRhdGFJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmVsZW1lbnRzLmludGVyZmFjZXMuSURhdGFJdGVtTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwubWV0YWRhdGEuRWxlbWVudFByb3BlcnR5RGVmbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRSb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLk1lZGlhU3R5bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlOworCisvKioKKyAqIG9ubHkgdXNlIGluc2lkZSB7QGxpbmsgUmVwb3J0TW9kZWxHZW5lcmF0b3J9CisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHsKKwlwdWJsaWMgUmVwb3J0TW9kZWxHZW5lcmF0b3IgZ2VuZXJhdG9yOworCXB1YmxpYyBSZXBvcnQgcmVwb3J0OworCXB1YmxpYyBSZXBvcnREZXNpZ25IYW5kbGUgZGVzaWduOworCXB1YmxpYyBFbGVtZW50RmFjdG9yeSBmYWN0b3J5OworCXB1YmxpYyBNYXA8U3RyaW5nLE9kYURhdGFTZXRIYW5kbGU+IGRhdGFTZXRzID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgTWFwPFN0cmluZyxBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPj4gZlJlc3VsdFNldENvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4+IGZDb21wdXRlZENvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHVibGljIGludCBmUG9zaXRpb24gPSAwOworCXByaXZhdGUgTWFwPFN0cmluZyxTaGFyZWRTdHlsZUhhbmRsZT4gZlN0eWxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2hhcmVkU3R5bGVIYW5kbGU+KCk7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLEVtYmVkZGVkSW1hZ2U+IGZFbWJlZGRlZEltYWdlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIFN0cmluZyB0cmFuc2xhdG9yUGFja2FnZU5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgcmVzdWx0U2V0VHJhbnNsYXRvclBhY2thZ2VOYW1lOworCXByaXZhdGUgTWVkaWEgZlJlcXVlc3RlZE1lZGlhOworCXB1YmxpYyBEYXRhbWFydFJvbGUgcm9sZTsKKwkKKwlwdWJsaWMgY2xhc3MgRGF0YUl0ZW1Gb3JEc2wgZXh0ZW5kcyBEYXRhSXRlbSB7CisJCXByaXZhdGUgU3RyaW5nIGZSZXN1bHRTZXRDb2x1bW4gPSBudWxsOworCQlwdWJsaWMgRGF0YUl0ZW1Gb3JEc2woU3RyaW5nIG5hbWUpIHsKKwkJCXN1cGVyKG5hbWUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KEVsZW1lbnRQcm9wZXJ0eURlZm4gcHJvcCwgT2JqZWN0IHZhbHVlKSB7CisJCQlpZgkoSURhdGFJdGVtTW9kZWwuUkVTVUxUX1NFVF9DT0xVTU5fUFJPUC5lcXVhbHMocHJvcC5nZXROYW1lKCkpKSB7CisJCQkJaWYJKChmUmVzdWx0U2V0Q29sdW1uID09IG51bGwpICYmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKwkJCQkJZlJlc3VsdFNldENvbHVtbiA9IChTdHJpbmcpIHZhbHVlOworCQkJCQlzdXBlci5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChmUmVzdWx0U2V0Q29sdW1uICE9IG51bGwpICYmICFmUmVzdWx0U2V0Q29sdW1uLmVxdWFscyh2YWx1ZSkpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJyZS1zZXQ/ICIrSURhdGFJdGVtTW9kZWwuUkVTVUxUX1NFVF9DT0xVTU5fUFJPUCsiICIrZlJlc3VsdFNldENvbHVtbisiIC0tPiAiK3ZhbHVlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzdXBlci5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdGVkTWVkaWEoTWVkaWEgcmVxdWVzdGVkTWVkaWEpIHsKKwkJZlJlcXVlc3RlZE1lZGlhID0gcmVxdWVzdGVkTWVkaWE7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkTWVkaWEoTWVkaWEgY2hlY2tNZWRpYSkgeworCQlpZgkoZlJlcXVlc3RlZE1lZGlhID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZlJlcXVlc3RlZE1lZGlhLmVxdWFscyhjaGVja01lZGlhKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRNZWRpYShNZWRpYVN0eWxlIGNoZWNrTWVkaWFTdHlsZSkgeworCQlpZgkoY2hlY2tNZWRpYVN0eWxlID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gaXNSZXF1ZXN0ZWRNZWRpYShjaGVja01lZGlhU3R5bGUuZ2V0TWVkaWEoKSk7CisJfQorCQorCXB1YmxpYyBEYXRhSXRlbUhhbmRsZSBuZXdEYXRhSXRlbSAoU3RyaW5nIG5hbWUpIHsKKwkJRGF0YUl0ZW1Gb3JEc2wgZWxlbWVudCA9IG5ldyBEYXRhSXRlbUZvckRzbChuYW1lKTsKKwkJZGVzaWduLmdldE1vZHVsZSgpLm1ha2VVbmlxdWVOYW1lKCBlbGVtZW50ICk7CisJCXJldHVybiBlbGVtZW50LmhhbmRsZShkZXNpZ24uZ2V0TW9kdWxlKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCBwdXRSZXN1bHRTZXRDb2x1bW5zKFN0cmluZyBkYXRhU2V0TmFtZSwgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4gcmVzdWx0U2V0Q29sdW1ucykgeworCQlmUmVzdWx0U2V0Q29sdW1ucy5wdXQoZGF0YVNldE5hbWUsIHJlc3VsdFNldENvbHVtbnMpOworCX0KKwkKKwlwdWJsaWMgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4gZ2V0UmVzdWx0U2V0Q29sdW1ucyhTdHJpbmcgZGF0YVNldE5hbWUpIHsKKwkJcmV0dXJuIGZSZXN1bHRTZXRDb2x1bW5zLmdldChkYXRhU2V0TmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHB1dENvbXB1dGVkQ29sdW1ucyhTdHJpbmcgZGF0YVNldE5hbWUsIEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4gY29tcHV0ZWRDb2x1bW5zKSB7CisJCWZDb21wdXRlZENvbHVtbnMucHV0KGRhdGFTZXROYW1lLCBjb21wdXRlZENvbHVtbnMpOworCX0KKwkKKwlwdWJsaWMgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBnZXRDb21wdXRlZENvbHVtbnMoU3RyaW5nIGRhdGFTZXROYW1lKSB7CisJCXJldHVybiBmQ29tcHV0ZWRDb2x1bW5zLmdldChkYXRhU2V0TmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHB1dFN0eWxlSGFuZGxlQnlOYW1lKFN0eWxlIHN0eWxlLCBTaGFyZWRTdHlsZUhhbmRsZSBzdHlsZUhhbmRsZSkgeworCQlmU3R5bGVzLnB1dChzdHlsZS5nZXROYW1lKCksIHN0eWxlSGFuZGxlKTsKKwl9CisJCisJcHVibGljIFNoYXJlZFN0eWxlSGFuZGxlIGdldFN0eWxlSGFuZGxlQnlOYW1lKFN0eWxlIHN0eWxlKSB7CisJCXJldHVybiBmU3R5bGVzLmdldChzdHlsZS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBwdXRFbWJlZGRlZEltYWdlKFN0cmluZyBpbWFnZUlkLCBFbWJlZGRlZEltYWdlIGVtYmVkZGVkSW1hZ2UpIHsKKwkJZkVtYmVkZGVkSW1hZ2VzLnB1dChpbWFnZUlkLCBlbWJlZGRlZEltYWdlKTsKKwl9CisJCisJcHVibGljIEVtYmVkZGVkSW1hZ2UgZ2V0RW1iZWRkZWRJbWFnZShTdHJpbmcgaW1hZ2VJZCkgeworCQlyZXR1cm4gZkVtYmVkZGVkSW1hZ2VzLmdldChpbWFnZUlkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0TW9kZWxHZW5lcmF0b3IueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0TW9kZWxHZW5lcmF0b3IueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMDJmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9qdm1tb2RlbC9SZXBvcnRNb2RlbEdlbmVyYXRvci54dGVuZApAQCAtMCwwICsxLDU1MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBjb20uaWJtLmljdS51dGlsLlVMb2NhbGUKK2ltcG9ydCBjb20udmFhZGluLmRhdGEuQ29udGFpbmVyLkZpbHRlcgoraW1wb3J0IGNvbS52YWFkaW4uc2VydmVyLlNpemVhYmxlLlVuaXQKK2ltcG9ydCBjb20udmFhZGluLnNlcnZlci5TdHJlYW1SZXNvdXJjZQoraW1wb3J0IGNvbS52YWFkaW4udWkuQWJzdHJhY3RDb21wb25lbnQKK2ltcG9ydCBjb20udmFhZGluLnVpLkJyb3dzZXJGcmFtZQoraW1wb3J0IGNvbS52YWFkaW4udWkuQnV0dG9uCitpbXBvcnQgY29tLnZhYWRpbi51aS5Ib3Jpem9udGFsTGF5b3V0CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0KK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdAoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGUKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRAoraW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5JRGVzaWduRW5naW5lCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLk9kYURhdGFTZXRIYW5kbGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU3RydWN0dXJlRmFjdG9yeQoraW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5jb21tYW5kLkNvbnRlbnRFeGNlcHRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZC5DdXN0b21Nc2dFeGNlcHRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29yZS5JTW9kdWxlTW9kZWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuZWxlbWVudHMuc3RydWN0dXJlcy5DYWNoZWRNZXRhRGF0YQoraW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5zdHJ1Y3R1cmVzLkNvbXB1dGVkQ29sdW1uCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuT2RhUmVzdWx0U2V0Q29sdW1uCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLm1ldGFkYXRhLkRpbWVuc2lvblZhbHVlCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuZWxlbWVudHMuaW50ZXJmYWNlcy5JRGF0YVNldE1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VXRpbHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLmVudGl0eS54dGV4dC5leHRlbnNpb25zLk5hbWluZ0V4dGVuc2lvbnMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUF0dHJpYnV0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZXZlbnRicm9rZXIuRXZlbnRCcm9rZXJNc2cKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5yZXBvcnQuSVJlcG9ydFByb3ZpZGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5lbnRpdHloZWxwZXIuRGF0YVR5cGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5WaWV3TGF5b3V0TWFuYWdlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWN0aW9uLmNvbW1vbi5JVG9vbGJhckFjdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMuZ2VuZXJhdG9yLkJhc2ljRHNsR2VuZXJhdG9yVXRpbHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0Q3ViZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEVudGl0eQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRSb2xlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFRhc2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLmp2bW1vZGVsLkRhdGFtYXJ0RFNMSnZtTW9kZWxJbmZlcnJlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bi5EU0xPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG4uSTE4TktleUdlbmVyYXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bi5JMThOTW9kZWxHZW5lcmF0b3IKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5FbGVtZW50CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuR3JpZAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkltYWdlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTGFiZWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlRm9vdGVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUhlYWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VUZW1wbGF0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0TW9kZWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuU3R5bGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5TdWJTdWJUaXRsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRpdGxlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkJhc2VSZXBvcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uQmlydEVuZ2luZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5EYXRhVHlwZXMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uT2RhQ29ublByb3BlcnRpZXMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uYXR0cmlidXRlLkF0dHJpYnV0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5hdHRyaWJ1dGUuV2lkdGgKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5Cb2R5SXRlbQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLkNvbnRhaW5lckl0ZW0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5HcmlkSXRlbQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLkltYWdlSXRlbQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLlBhZ2VGb290ZXJJdGVtCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLml0ZW0uUGFnZUhlYWRlckl0ZW0KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuSUZpbGVTeXN0ZW1BY2Nlc3MKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkdlbmVyYXRvckNvbmZpZworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkltcG9ydE1hbmFnZXIKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXIKKworY2xhc3MgUmVwb3J0TW9kZWxHZW5lcmF0b3IgZXh0ZW5kcyBJMThOTW9kZWxHZW5lcmF0b3IgeworCUBJbmplY3QgZXh0ZW5zaW9uIElRdWFsaWZpZWROYW1lUHJvdmlkZXIKKwlASW5qZWN0IGV4dGVuc2lvbiBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgZGF0YW1hcnRJbmZlcnJlcgorCUBJbmplY3QgZXh0ZW5zaW9uIE5hbWluZ0V4dGVuc2lvbnMKKwlASW5qZWN0IGV4dGVuc2lvbiBCYXNpY0RzbEdlbmVyYXRvclV0aWxzCisgICAgCisJQEluamVjdAorCUBFeHRlbnNpb24KKwlwcml2YXRlIERhdGFUeXBlIGR0VHlwZTsKKwkKKwlzdGF0aWMgdmFyIGRlc2lnbkVuZ2luZSA9IG51bGwKKwkKKwlvdmVycmlkZSB2b2lkIGRvR2VuZXJhdGUoUmVzb3VyY2UgaW5wdXQsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeworCQlhZGRUcmFuc2xhdGFibGVzKCcnJ8KrQmFzZVJlcG9ydC5DQVBUSU9OX0kxOE5LRVlfU0FWRV9QREbCuyzCq0Jhc2VSZXBvcnQuQ0FQVElPTl9JMThOS0VZX1BSSU5UX1BERsK7JycnKQorCQlzdXBlci5kb0dlbmVyYXRlKGlucHV0LCBmc2EpCisJfQorCQorCWRlZiBkaXNwYXRjaCB2b2lkIGludGVybmFsRG9HZW5lcmF0ZShSZXBvcnRNb2RlbCBvcmdNb2RlbCwgSUZpbGVTeXN0ZW1BY2Nlc3MgZnNhKSB7CisJCWRlc2lnbkVuZ2luZSA9IEJpcnRFbmdpbmUuY3JlYXRlRGVzaWduRW5naW5lKCkKKwkJZm9yIChwa2c6b3JnTW9kZWwucGNrZykgeworCQkJZm9yCShyZXBvcnQgOiBwa2cucmVwb3J0cykgeworCQkJCXRyeSB7CisJCQkJCWdlbmVyYXRlUmVwb3J0RmlsZShwa2csIHJlcG9ydCwgZnNhKQorCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UKKwkJCQl9CisJCQl9CisJCX0KKyAgIAl9CisgICAJCisgICAJcHJpdmF0ZSBkZWYgdm9pZCBnZW5lcmF0ZVJlcG9ydEZpbGUoUmVwb3J0UGFja2FnZSBwY2tnLCBSZXBvcnQgcmVwb3J0LCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgIAkJaWYJKHJlcG9ydC5kZXNpZ24gaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25UZW1wbGF0ZSkgeworCQkJZ2VuZXJhdGVSZXBvcnRSb2xlRmlsZShwY2tnLCByZXBvcnQsIG51bGwsIGZzYSkKKwkJCWZvcihyb2xlIDogcmVwb3J0LmRhdGFtYXJ0UmVmLnJvbGVzKSB7CisgICAJCQkJZ2VuZXJhdGVSZXBvcnRSb2xlRmlsZShwY2tnLCByZXBvcnQsIHJvbGUsIGZzYSkKKwkJCX0KKwkJfQorCX0KKwkJCisgICAJcHJpdmF0ZSBkZWYgdm9pZCBnZW5lcmF0ZVJlcG9ydFJvbGVGaWxlKFJlcG9ydFBhY2thZ2UgcGNrZywgUmVwb3J0IHJlcG9ydCwgRGF0YW1hcnRSb2xlIHJvbGUsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeworCQl2YXIgd29ya1NldCA9IG5ldyBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0KCkKKwkJd29ya1NldC5nZW5lcmF0b3IgPSB0aGlzCisJCXdvcmtTZXQucmVwb3J0ID0gcmVwb3J0CisJCXdvcmtTZXQucm9sZSA9IHJvbGUKKwkJLy8gLS0tIGdlbmVyYXRlIGZ1bGwgcGF0aCBuYW1lIHRvIHRoZSByZXBvcnQgZGVzaWduIGZpbGUgdG8gYmUgZ2VuZXJhdGVkIC0tLQorCQl2YXIgdGVtcGxhdGUgPSByZXBvcnQuZGVzaWduIGFzIFJlcG9ydERlc2lnblRlbXBsYXRlCisJCXZhciBwY2tnTmFtZSA9IHBja2cuZnVsbHlRdWFsaWZpZWROYW1lLnRvU3RyaW5nCisJCXZhciBwY2tnTmFtZVBhdGggPSBwY2tnTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCIvIikKKwkJdmFyIGZpbGVuYW1lID0gJycnwqtyZXBvcnQubmFtZcK7wqtJRiByb2xlIT1udWxswrvCq3JvbGUuYXNzaWduZWRSb2xlLm5hbWXCu8KrRU5ESUbCuy5ycHRkZXNpZ24nJycKKwkJdmFyIGZ1bGxwYXRoID0gJycnwqtwY2tnTmFtZVBhdGjCuy/Cq2ZpbGVuYW1lwrsnJycKKworCQkvLyAtLS0gZ2V0IG1hbmFnaW5nIEJJUlQgaW5zdGFuY2VzIC0tLQorCQl2YXIgc2Vzc2lvbiA9IChkZXNpZ25FbmdpbmUgYXMgSURlc2lnbkVuZ2luZSkubmV3U2Vzc2lvbkhhbmRsZShVTG9jYWxlLmZvckxvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKSkKKwkJLy8gLS0tIENyZWF0ZSBhIG5ldyByZXBvcnQgZGVzaWduIC0tLQorCQl3b3JrU2V0LmRlc2lnbiA9IHNlc3Npb24uY3JlYXRlRGVzaWduKCkKKwkJLy8gLS0tIFRoZSBlbGVtZW50IGZhY3RvcnkgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhlIHZhcmlvdXMgQklSVCBlbGVtZW50cyAtLS0KKwkJd29ya1NldC5mYWN0b3J5ID0gd29ya1NldC5kZXNpZ24uZ2V0RWxlbWVudEZhY3RvcnkoKQorCQkvLyBzZXQgdGhlIGkxOG4gcHJvcGVydHkgcmVzb3VyY2VzCisJCXdvcmtTZXQuZGVzaWduLnNldEluY2x1ZGVSZXNvdXJjZSgiaTE4bi9JMThOIikKKwkJLy8gc2V0IHRoZSByZXF1ZXN0ZWQgbWVkaWEgZm9yIHRoaXMgcmVwb3J0CisJCXdvcmtTZXQucmVxdWVzdGVkTWVkaWEgPSByZXBvcnQubWVkaWEKKworCQkvLyAtLS0gZ2VuZXJhdGUgYSBtYXN0ZXIgcGFnZSAtLS0KKwkJZ2VuZXJhdGVNYXN0ZXJQYWdlKHJlcG9ydC5kYXRhbWFydFJlZiwgd29ya1NldCwgcmVwb3J0LnBhZ2VUZW1wbGF0ZSwgdGVtcGxhdGUuaGVhZGVyLCB0ZW1wbGF0ZS5mb290ZXIpCisJCS8vIC0tLSBhZGQgdGhlIG1hc3RlciBkYXRhbWFydCAtLS0KKy8vCQlpZgkocmVwb3J0LmRhdGFtYXJ0UmVmICE9IG51bGwpIHsKKwkJYWRkRGF0YW1hcnRTb3VyY2VBbmRTZXQocmVwb3J0LmRhdGFtYXJ0UmVmLCB3b3JrU2V0LCBudWxsLCBudWxsKQorLy8JCX0KKwkJCisJCXZhciBib2R5ID0gbmV3IEJvZHlJdGVtKHdvcmtTZXQpCisJCWdlbmVyYXRlSXRlbXMocmVwb3J0LmRhdGFtYXJ0UmVmLCB3b3JrU2V0LCBib2R5LCB0ZW1wbGF0ZS5kZXRhaWwuZWxlbWVudHMpCisJCQorCQkvLyAtLS0gZ2VuZXJhdGUgYW4gb3V0cHV0IHN0cmVhbSB0byByZWNlaXZlIHRoZSBCSVJUIGdlbmVyYXRlZCByZXBvcnQgZGVzaWduIC0tLQkJCQorCQl2YXIgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCQl0cnkgeworCQkJd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCkucHJlcGFyZVRvU2F2ZSgpOworCQkJd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCkuZ2V0V3JpdGVyKCkud3JpdGUoYmFvcyk7CisJCQl3b3JrU2V0LmRlc2lnbi5nZXRNb2R1bGUoKS5vblNhdmUoKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKwkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFN0cmVhbShiYW9zKSkKKwkJfQorCQkKKwkJLy8gLS0tIGdlbmVyYXRlZCBvdXRwdXQgc3RyZWFtIHRvIHRoZSBmaWxlIC0tLSAKKwkJZnNhLmdlbmVyYXRlRmlsZShmdWxscGF0aCwgRFNMT3V0cHV0Q29uZmlndXJhdGlvblByb3ZpZGVyLkRFRkFVTFRfUkVQT1JUX09VVFBVVCwgYmFvcy50b1N0cmluZygpKQorICAgCX0KKwkKKy8vCWRlZiBTZXNzaW9uSGFuZGxlIG5ld1Nlc3Npb25IYW5kbGUoSURlc2lnbkVuZ2luZSBlbmdpbmUsIFVMb2NhbGUgbG9jYWxlKSB7CisvLwkJcmV0dXJuIGVuZ2luZS5uZXdTZXNzaW9uSGFuZGxlKGxvY2FsZSkKKy8vCX0KKwkKKwlwcml2YXRlIGRlZiBnZW5lcmF0ZU1hc3RlclBhZ2UoRGF0YW1hcnREZWZpbml0aW9uIGRhdGFtYXJ0LCBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtTZXQsIFBhZ2VUZW1wbGF0ZSBwYWdlVGVtcGxhdGUsIFBhZ2VIZWFkZXIgcGFnZUhlYWRlciwgUGFnZUZvb3RlciBwYWdlRm9vdGVyKSB7CisJCS8vIE5vdGU6IFRoZSByZXBvcnQgd2lsbCBmYWlsIHRvIGxvYWQgaW4gdGhlIEJJUlQgZGVzaWduZXIgdW5sZXNzIHlvdSBjcmVhdGUgYSBtYXN0ZXIgcGFnZS4KKwkJdmFyIGhlYWRlciA9IHBhZ2VIZWFkZXIKKwkJdmFyIGZvb3RlciA9IHBhZ2VGb290ZXIKKwkJaWYJKGhlYWRlciA9PSBudWxsKSB7CisJCQloZWFkZXIgPSBwYWdlVGVtcGxhdGUuaGVhZGVyCisJCX0KKwkJaWYJKGZvb3RlciA9PSBudWxsKSB7CisJCQlmb290ZXIgPSBwYWdlVGVtcGxhdGUuZm9vdGVyCisJCX0KKwkJdmFyIG1hc3RlclBhZ2UgPSB3b3JrU2V0LmZhY3RvcnkubmV3U2ltcGxlTWFzdGVyUGFnZShwYWdlVGVtcGxhdGUubmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJbWFzdGVyUGFnZS5zZXRQYWdlVHlwZShwYWdlVGVtcGxhdGUuc2l6ZS5uYW1lKCkudG9Mb3dlckNhc2UpOworCQltYXN0ZXJQYWdlLnNldE9yaWVudGF0aW9uKHBhZ2VUZW1wbGF0ZS5vcmllbnRhdGlvbi5uYW1lKCkudG9Mb3dlckNhc2UpCisJCW1hc3RlclBhZ2UudG9wTWFyZ2luLnNldFZhbHVlKG5ldyBEaW1lbnNpb25WYWx1ZShwYWdlVGVtcGxhdGUudG9wTWFyZ2luVmFsdWUsIHBhZ2VUZW1wbGF0ZS50b3BNYXJnaW5Vbml0Lm5hbWUoKS50b0xvd2VyQ2FzZSkpCisJCW1hc3RlclBhZ2UubGVmdE1hcmdpbi5zZXRWYWx1ZShuZXcgRGltZW5zaW9uVmFsdWUocGFnZVRlbXBsYXRlLmxlZnRNYXJnaW5WYWx1ZSwgcGFnZVRlbXBsYXRlLmxlZnRNYXJnaW5Vbml0Lm5hbWUoKS50b0xvd2VyQ2FzZSkpCisJCW1hc3RlclBhZ2UuYm90dG9tTWFyZ2luLnNldFZhbHVlKG5ldyBEaW1lbnNpb25WYWx1ZShwYWdlVGVtcGxhdGUuYm90dG9tTWFyZ2luVmFsdWUsIHBhZ2VUZW1wbGF0ZS5ib3R0b21NYXJnaW5Vbml0Lm5hbWUoKS50b0xvd2VyQ2FzZSkpCisJCW1hc3RlclBhZ2UucmlnaHRNYXJnaW4uc2V0VmFsdWUobmV3IERpbWVuc2lvblZhbHVlKHBhZ2VUZW1wbGF0ZS5yaWdodE1hcmdpblZhbHVlLCBwYWdlVGVtcGxhdGUucmlnaHRNYXJnaW5Vbml0Lm5hbWUoKS50b0xvd2VyQ2FzZSkpCisJCWlmCShoZWFkZXIgIT0gbnVsbCkgeworCQkJbWFzdGVyUGFnZS5zZXRTaG93SGVhZGVyT25GaXJzdChoZWFkZXIuc2hvd09uRmlyc3QpCisJCQltYXN0ZXJQYWdlLmhlYWRlckhlaWdodC5zZXRWYWx1ZShuZXcgRGltZW5zaW9uVmFsdWUoaGVhZGVyLmhlaWdodFZhbHVlLCBoZWFkZXIuaGVpZ2h0VW5pdC5uYW1lKCkudG9Mb3dlckNhc2UpKQorCQkJZ2VuZXJhdGVJdGVtcyhkYXRhbWFydCwgd29ya1NldCwgbmV3IFBhZ2VIZWFkZXJJdGVtKHdvcmtTZXQsIG1hc3RlclBhZ2UpLCBoZWFkZXIuZWxlbWVudHMpCisJCX0KKwkJaWYJKGZvb3RlciAhPSBudWxsKSB7CisJCQltYXN0ZXJQYWdlLnNldFNob3dGb290ZXJPbkxhc3QoZm9vdGVyLnNob3dPbkxhc3QpCisJCQltYXN0ZXJQYWdlLmZvb3RlckhlaWdodC5zZXRWYWx1ZShuZXcgRGltZW5zaW9uVmFsdWUoZm9vdGVyLmhlaWdodFZhbHVlLCBmb290ZXIuaGVpZ2h0VW5pdC5uYW1lKCkudG9Mb3dlckNhc2UpKQorCQkJZ2VuZXJhdGVJdGVtcyhkYXRhbWFydCwgd29ya1NldCwgbmV3IFBhZ2VGb290ZXJJdGVtKHdvcmtTZXQsIG1hc3RlclBhZ2UpLCBmb290ZXIuZWxlbWVudHMpCisJCX0KKwkJd29ya1NldC5kZXNpZ24uZ2V0TWFzdGVyUGFnZXMoKS5hZGQobWFzdGVyUGFnZSk7CisJfQorCQorCXByaXZhdGUgZGVmIGFkZERhdGFtYXJ0U291cmNlQW5kU2V0KERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBTdHJpbmcgYWxpYXMsIERhdGFtYXJ0UHJvcGVydHlbXSBoaWRkZW5zKSB7CisJCS8vIC0tLSBnZW5lcmF0ZSB0aGUgRGF0YSBTb3VyY2UgLS0tCisJCXZhciBkYXRhU291cmNlTmFtZSA9IFV0aWxpdGllcy5nZXREYXRhU291cmNlTmFtZShhbGlhcywgZGF0YW1hcnQpLnRvU3RyaW5nCisJCXZhciBvZHNvdXJjZWggPSB3b3JrU2V0LmZhY3RvcnkubmV3T2RhRGF0YVNvdXJjZShkYXRhU291cmNlTmFtZSwgQmFzZVJlcG9ydC5EQVRBU09VUkNFX0VYVEVOU0lPTl9JRCk7CisJCW9kc291cmNlaC5nZXRFbGVtZW50KCkuc2V0SUQod29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCkuZ2V0TmV4dElEKCkpOworCQl3b3JrU2V0LmRlc2lnbi5nZXRNb2R1bGUoKS5hZGRFbGVtZW50SUQob2Rzb3VyY2VoLmdldEVsZW1lbnQoKSk7CisJCXdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpLmFkZChvZHNvdXJjZWguZ2V0RWxlbWVudCgpLCBJTW9kdWxlTW9kZWwuREFUQV9TT1VSQ0VfU0xPVCk7CisJCQorCQkvLyAtLS0gZ2VuZXJhdGUgdGhlIERhdGEgU2V0IGNvbm5lY3RlZCB0byB0aGUgRGF0YSBTb3VyY2UgLS0tCisJCXZhciBkYXRhU2V0TmFtZSA9IFV0aWxpdGllcy5nZXREYXRhU2V0TmFtZShhbGlhcywgZGF0YW1hcnQpLnRvU3RyaW5nCisJCXZhciBvZHNldGggPSB3b3JrU2V0LmZhY3RvcnkubmV3T2RhRGF0YVNldChkYXRhU2V0TmFtZSwgQmFzZVJlcG9ydC5EQVRBU09VUkNFX0VYVEVOU0lPTl9JRC5jb25jYXQoIi5kYXRhU2V0IikpOworCQl3b3JrU2V0LmRhdGFTZXRzLnB1dChkYXRhU2V0TmFtZSwgb2RzZXRoKQorCQlvZHNldGguZ2V0RWxlbWVudCgpLnNldElEKHdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpLmdldE5leHRJRCgpKTsKKwkJb2RzZXRoLnNldFByb3BlcnR5KE9kYUNvbm5Qcm9wZXJ0aWVzLkRBVEFNQVJUX0JVTkRMRU5BTUUsIFV0aWxpdGllcy5nZXRCdW5kbGVOYW1lKGRhdGFtYXJ0KSk7CisJCW9kc2V0aC5zZXRQcm9wZXJ0eShPZGFDb25uUHJvcGVydGllcy5EQVRBTUFSVF9DTEFTU05BTUUsIGdldERhdGFtYXJ0Q2xhc3NOYW1lKGFsaWFzLCBkYXRhbWFydCkpOworCQlvZHNldGguc2V0UHJvcGVydHkoT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfREFUQVNPVVJDRSwgb2Rzb3VyY2VoLmdldEVsZW1lbnQoKS5nZXROYW1lKCkpOworCQlvZHNldGguc2V0UHJvcGVydHkoT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfREFUQVNPVVJDRU5BTUUsIGRhdGFTb3VyY2VOYW1lKTsKKwkJb2RzZXRoLnNldFByb3BlcnR5KE9kYUNvbm5Qcm9wZXJ0aWVzLkRBVEFNQVJUX0RBVEFTRVROQU1FLCBkYXRhU2V0TmFtZSk7CisJCS8vIC0tLSBhZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbnMgdG8gdGhlIERhdGEgU2V0IC0tLQorCQlzd2l0Y2ggKGRhdGFtYXJ0LnNvdXJjZSkgeworCQkJRGF0YW1hcnRDdWJlOgorCQkJCWFkZERhdGFtYXJ0Q3ViZVJlc3VsdFNldCh3b3JrU2V0LCBvZHNldGgsIGRhdGFTZXROYW1lLCBkYXRhbWFydCkKKwkJCURhdGFtYXJ0RW50aXR5OgorCQkJCWFkZERhdGFtYXJ0RW50aXR5UmVzdWx0U2V0KHdvcmtTZXQsIG9kc2V0aCwgZGF0YVNldE5hbWUsIGRhdGFtYXJ0KQorCQkJRGF0YW1hcnRUYXNrOgorCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRGF0YW1hcnRUYXNrIC4uLiB0b2RvIikKKwkJfQorCQl3b3JrU2V0LmRlc2lnbi5nZXRNb2R1bGUoKS5hZGRFbGVtZW50SUQob2RzZXRoLmdldEVsZW1lbnQoKSk7CisJCXdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpLmFkZChvZHNldGguZ2V0RWxlbWVudCgpLCBJTW9kdWxlTW9kZWwuREFUQV9TRVRfU0xPVCk7CisJfQorCQorCXByaXZhdGUgZGVmIGFkZERhdGFtYXJ0Q3ViZVJlc3VsdFNldChSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtTZXQsIE9kYURhdGFTZXRIYW5kbGUgb2RzZXRoLCBTdHJpbmcgZGF0YVNldE5hbWUsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCkgeworCQlTeXN0ZW0uZXJyLnByaW50bG4oIkRhdGFtYXJ0Q3ViZSAuLi4gdG9kbyIpCisJCQorCQl2YXIgY3ViZSA9IGRhdGFtYXJ0LnNvdXJjZSBhcyBEYXRhbWFydEN1YmU7CisJCXZhciBzZWxlY3RDb2x1bW5zID0gIiIKKwkJdmFyIGNtZCA9IG5ldyBDYWNoZWRNZXRhRGF0YSgpCisJCXZhciBzZCA9IG5ldyBBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPigpCisJCXZhciBjYyA9IG5ldyBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+KCkKKworLy8JCXZhciBwb3NpdGlvbiA9IDAKKy8vCQkvLyAtLS0gYXQgZmlyc3QgYWxsIG5hdmlnYXRpb25zIC0tLQorLy8JCWZvciAobmF2aWdhdGlvbiA6IGVudGl0eS5uYXZpZ2F0aW9ucykgeworLy8JCQlmb3IJKHByb3BlcnR5IDogbmF2aWdhdGlvbi5kYXRhbWFydEVudGl0eS5wcm9wZXJ0aWVzKSB7CisvLwkJCQlpZgkoKGhpZGRlbnMgPT0gbnVsbCkgfHwgIWhpZGRlbnMuY29udGFpbnMocHJvcGVydHkpKSB7CisvLwkJCQkJcG9zaXRpb24gPSBwb3NpdGlvbisxCisvLwkJCQkJYWRkRGF0YW1hcnRQcm9wZXJ0eShzZCwgY2MsIHByb3BlcnR5LCBwb3NpdGlvbikKKy8vCQkJCX0JCQkJCisvLwkJCX0KKy8vCQl9CisvLwkJLy8gLS0tIGF0IGxhc3QgdGhlICJwdXJlIiBkYXRhIHByb3BlcnRpZXMgLS0tCisvLwkJZm9yCShwcm9wZXJ0eSA6IGVudGl0eS5wcm9wZXJ0aWVzKSB7CisvLwkJCWlmCSgoaGlkZGVucyA9PSBudWxsKSB8fCAhaGlkZGVucy5jb250YWlucyhwcm9wZXJ0eSkpIHsKKy8vCQkJCXBvc2l0aW9uID0gcG9zaXRpb24rMQorLy8JCQkJYWRkRGF0YW1hcnRQcm9wZXJ0eShzZCwgY2MsIHByb3BlcnR5LCBwb3NpdGlvbikKKy8vCQkJfQkJCQkKKy8vCQl9CisvLwkJd29ya1NldC5wdXRSZXN1bHRTZXRDb2x1bW5zKGRhdGFTZXROYW1lLCBzZCkKKy8vCQl3b3JrU2V0LnB1dENvbXB1dGVkQ29sdW1ucyhkYXRhU2V0TmFtZSwgY2MpCisvLwkJZm9yCShjYzEgOiBjYykgeworLy8JCQlpZgkoc2VsZWN0Q29sdW1ucy5lbXB0eSkgeworLy8JCQkJc2VsZWN0Q29sdW1ucyA9IGNjMS5nZXROYW1lKCk7CisvLwkJCX0KKy8vCQkJZWxzZSB7CisvLwkJCQlzZWxlY3RDb2x1bW5zID0gc2VsZWN0Q29sdW1ucysiLCIrY2MxLmdldE5hbWUoKTsKKy8vCQkJfQorLy8JCX0KKworCQlvZHNldGguc2V0UHJvcGVydHkoInF1ZXJ5VGV4dCIsICgnJydzZWxlY3QgwqtzZWxlY3RDb2x1bW5zwrsgZnJvbSDCq2RhdGFtYXJ0Lm5hbWXCuycnJykudG9TdHJpbmcoKSkKKwkJY21kLnNldFByb3BlcnR5KElEYXRhU2V0TW9kZWwuUkVTVUxUX1NFVF9QUk9QLCBzZCkKKwkJb2RzZXRoLnNldFByb3BlcnR5KElEYXRhU2V0TW9kZWwuQ0FDSEVEX01FVEFEQVRBX1BST1AsIGNtZCkKKwkJb2RzZXRoLmdldEVsZW1lbnQoKS5zZXRQcm9wZXJ0eShJRGF0YVNldE1vZGVsLlJFU1VMVF9TRVRfUFJPUCwgc2QpCisJfQkKKwkKKwlwcml2YXRlIGRlZiBhZGRBbGxEYXRhbWFydFByb3BlcnRpZXMoUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPiBzZCwgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBjYywgRU9iamVjdCBjb250YWluZXIpIHsKKwkJc3dpdGNoIGNvbnRhaW5lciB7CisJCQlEYXRhbWFydEVudGl0eTogeworCQkJCS8vIC0tLSBhdCBmaXJzdCBhbGwgbmF2aWdhdGlvbnMgLS0tCisJCQkJZm9yIChuYXZpZ2F0aW9uIDogY29udGFpbmVyLm5hdmlnYXRpb25zKSB7CisJCQkJCW5hdmlnYXRpb24uZUFsbENvbnRlbnRzLmZvckVhY2hbZWxlbWVudCB8CisJCQkJCQlhZGRBbGxEYXRhbWFydFByb3BlcnRpZXMod29ya1NldCwgc2QsIGNjLCBlbGVtZW50KQorCQkJCQldCisJCQkJfQorCQkJCS8vIC0tLSBpZiBubyBleHBsaWNpdCBwcm9wZXJ0aWVzIGFyZSBzZXQgLS0tCisJCQkJaWYJKGNvbnRhaW5lci5wcm9wZXJ0aWVzLmlzRW1wdHkpIHsKKwkJCQkJZm9yCShhdHRyaWJ1dGUgOiBjb250YWluZXIuZW50aXR5UmVmLmFsbEF0dHJpYnV0ZXMpIHsKKwkJCQkJCWlmCSghYXR0cmlidXRlLmlzSWQgJiYgIWF0dHJpYnV0ZS5pc1V1aWQpIHsKKwkJCQkJCQlpZiAoZGF0YW1hcnRJbmZlcnJlci5pc0F1dGhvcml6ZWQod29ya1NldC5yb2xlLCBjb250YWluZXIuZW50aXR5UmVmLCBhdHRyaWJ1dGUubmFtZSkpIHsKKwkJCQkJCQkJYWRkRGF0YW1hcnRQcm9wZXJ0eSh3b3JrU2V0LCBzZCwgY2MsIGF0dHJpYnV0ZSkKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gLS0tIGF0IGxhc3QgdGhlICJwdXJlIiBkYXRhIHByb3BlcnRpZXMgLS0tCisJCQkJZWxzZSB7CisJCQkJCWZvcgkocHJvcGVydHkgOiBjb250YWluZXIucHJvcGVydGllcykgeworCQkJCQkJaWYgKGRhdGFtYXJ0SW5mZXJyZXIuaXNBdXRob3JpemVkKHdvcmtTZXQucm9sZSwgY29udGFpbmVyLmVudGl0eVJlZiwgcHJvcGVydHkucHJvcGVydHlSZWYubmFtZSkpIHsKKwkJCQkJCQlhZGREYXRhbWFydFByb3BlcnR5KHdvcmtTZXQsIHNkLCBjYywgcHJvcGVydHkpCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBkZWYgYWRkRGF0YW1hcnRFbnRpdHlSZXN1bHRTZXQoUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBPZGFEYXRhU2V0SGFuZGxlIG9kc2V0aCwgU3RyaW5nIGRhdGFTZXROYW1lLCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQpIHsKKwkJdmFyIHNlbGVjdENvbHVtbnMgPSAiIgorCQl2YXIgY21kID0gbmV3IENhY2hlZE1ldGFEYXRhKCkKKwkJdmFyIHNkID0gbmV3IEFycmF5TGlzdDxPZGFSZXN1bHRTZXRDb2x1bW4+KCkKKwkJdmFyIGNjID0gbmV3IEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4oKQorCisJCXdvcmtTZXQuZlBvc2l0aW9uID0gMAorCQlhZGRBbGxEYXRhbWFydFByb3BlcnRpZXMod29ya1NldCwgc2QsIGNjLCBkYXRhbWFydC5zb3VyY2UpCisJCXdvcmtTZXQucHV0UmVzdWx0U2V0Q29sdW1ucyhkYXRhU2V0TmFtZSwgc2QpCisJCXdvcmtTZXQucHV0Q29tcHV0ZWRDb2x1bW5zKGRhdGFTZXROYW1lLCBjYykKKwkJZm9yCShjYzEgOiBjYykgeworCQkJaWYJKHNlbGVjdENvbHVtbnMuZW1wdHkpIHsKKwkJCQlzZWxlY3RDb2x1bW5zID0gY2MxLmdldE5hbWUoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNlbGVjdENvbHVtbnMgPSBzZWxlY3RDb2x1bW5zLmNvbmNhdCgiLCIpLmNvbmNhdChjYzEuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJfQorCQlvZHNldGguc2V0UHJvcGVydHkoInF1ZXJ5VGV4dCIsICgnJydzZWxlY3QgwqtzZWxlY3RDb2x1bW5zwrsgZnJvbSDCq2RhdGFtYXJ0Lm5hbWXCuycnJykudG9TdHJpbmcoKSkKKwkJY21kLnNldFByb3BlcnR5KElEYXRhU2V0TW9kZWwuUkVTVUxUX1NFVF9QUk9QLCBzZCkKKwkJb2RzZXRoLnNldFByb3BlcnR5KElEYXRhU2V0TW9kZWwuQ0FDSEVEX01FVEFEQVRBX1BST1AsIGNtZCkKKwkJb2RzZXRoLmdldEVsZW1lbnQoKS5zZXRQcm9wZXJ0eShJRGF0YVNldE1vZGVsLlJFU1VMVF9TRVRfUFJPUCwgc2QpCisJfQkKKworCXByaXZhdGUgZGVmIGFkZERhdGFtYXJ0UHJvcGVydHkoUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPiBzZCwgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBjYywgRGF0YW1hcnRQcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQlhZGREYXRhbWFydFByb3BlcnR5KHdvcmtTZXQsIHNkLCBjYywgcHJvcGVydHkucHJvcGVydHlSZWYpCisJfQorCQkKKwlwcml2YXRlIGRlZiBhZGREYXRhbWFydFByb3BlcnR5KFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4gc2QsIEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4gY2MsIExFbnRpdHlBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCS8vIC0tLSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2x1bW4gLS0tCisJCXZhciBldHlwZSA9IGR0VHlwZS5nZXRCYXNpY1R5cGUoYXR0cmlidXRlKQorCQl2YXIgZGF0YVR5cGUgPSBEYXRhVHlwZXMudHlwZUZvcihldHlwZSkKKwkJaWYJKGRhdGFUeXBlID09IERhdGFUeXBlcy5BTlkpIHsKKwkJCWRhdGFUeXBlID0gRGF0YVR5cGVzLnR5cGVGb3IoYXR0cmlidXRlLnR5cGUpIC8vID8/PyB3YXJ1bSBBTlkgPz8/CisJCX0KKwkJLy8gc2VlIGFsc28gRGF0YW1hcnREU0xKdm1JbmZlcnJlcgorCQl2YXIgbmFtZSA9IGF0dHJpYnV0ZS50b0NvbHVtbk5hbWUudG9Mb3dlckNhc2UKKwkJLy8gLS0tIGNoZWNrIGZvciBhbHJlYWR5IGZvdW5kIGNvbHVtbiAtLS0KKwkJZm9yCShjb2x1bW4gOiBzZCkgeworCQkJaWYJKGNvbHVtbi5jb2x1bW5OYW1lLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfQorCQkvLyAtLS0gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFjY2VzcyB2aWEgb2RhIC0tLQorCQl2YXIgc3QgPSBuZXcgT2RhUmVzdWx0U2V0Q29sdW1uKCkKKwkJc3Quc2V0Q29sdW1uTmFtZShuYW1lKQorCQlzdC5zZXRQcm9wZXJ0eSgibmFtZSIsIG5hbWUpCisJCXN0LnNldE5hdGl2ZURhdGFUeXBlKGRhdGFUeXBlLmdldE5hdGl2ZU9kYURhdGFUeXBlSWQoKSkKKwkJc3Quc2V0TmF0aXZlTmFtZShuYW1lKQorCQl3b3JrU2V0LmZQb3NpdGlvbiA9IHdvcmtTZXQuZlBvc2l0aW9uKzEKKwkJc3Quc2V0UG9zaXRpb24od29ya1NldC5mUG9zaXRpb24pCisJCXN0LnNldERhdGFUeXBlKGRhdGFUeXBlLmdldE5hdGl2ZU9kYURhdGFUeXBlTmFtZSgpKQorCQlzZC5hZGQoc3QpCisJCS8vIC0tLSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYWNjZXNzIHZpYSB0YWJsZSAtLS0KKwkJdmFyIGNzMSA9IFN0cnVjdHVyZUZhY3RvcnkuY3JlYXRlQ29tcHV0ZWRDb2x1bW4oKQorCQljczEuc2V0TmFtZShuYW1lKQorCQljczEuc2V0RGlzcGxheU5hbWUobmFtZSk7CisJCWNzMS5zZXRFeHByZXNzaW9uKCJkYXRhU2V0Um93W1wiIi5jb25jYXQobmFtZSkuY29uY2F0KCJcIl0iKSkKKwkJY3MxLnNldERhdGFUeXBlKGRhdGFUeXBlLmdldE5hdGl2ZU9kYURhdGFUeXBlTmFtZSgpKQorCQljYy5hZGQoY3MxKQorCX0KKwkKKwlwcml2YXRlIGRlZiBnZXREYXRhbWFydENsYXNzTmFtZShTdHJpbmcgYWxpYXMsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCkgeworCQknJyfCqyhkYXRhbWFydC5lQ29udGFpbmVyIGFzIExQYWNrYWdlKS5mdWxseVF1YWxpZmllZE5hbWXCuy7Cq2RhdGFtYXJ0Lm5hbWXCu0NsYXNzJycnCisJfQorCQorCXB1YmxpYyBkZWYgZ2VuZXJhdGVJdGVtcyhEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgQ29udGFpbmVySXRlbSBjb250YWluZXIsIEVsZW1lbnRbXSBlbGVtZW50cykgeworCQlpZgkoZWxlbWVudHMgIT0gbnVsbCkgeworCQkJZm9yCShlbGVtZW50IDogZWxlbWVudHMpIHsKKwkJCQl0cnkgeworCQkJCQlzd2l0Y2ggKGVsZW1lbnQpIHsKKwkJCQkJCVRpdGxlOgorCQkJCQkJCWNvbnRhaW5lci5hZGRIZWFkZXIoMSwgSTE4TktleUdlbmVyYXRvci5rZXkoZWxlbWVudC50ZXh0KSwgZWxlbWVudC50ZXh0LnJlcGxhY2UoIlwiIiwiIiksIGVsZW1lbnQuc3R5bGUpCisJCQkJCQlTdWJUaXRsZToKKwkJCQkJCQljb250YWluZXIuYWRkSGVhZGVyKDIsIEkxOE5LZXlHZW5lcmF0b3Iua2V5KGVsZW1lbnQudGV4dCksIGVsZW1lbnQudGV4dC5yZXBsYWNlKCJcIiIsIiIpLCBlbGVtZW50LnN0eWxlKQorCQkJCQkJU3ViU3ViVGl0bGU6CisJCQkJCQkJY29udGFpbmVyLmFkZEhlYWRlcigzLCBJMThOS2V5R2VuZXJhdG9yLmtleShlbGVtZW50LnRleHQpLCBlbGVtZW50LnRleHQucmVwbGFjZSgiXCIiLCIiKSwgZWxlbWVudC5zdHlsZSkgCisJCQkJCQlMYWJlbDoKKwkJCQkJCQljb250YWluZXIuYWRkTGFiZWwoSTE4TktleUdlbmVyYXRvci5rZXkoZWxlbWVudC50ZXh0KSwgZWxlbWVudC50ZXh0LnJlcGxhY2UoIlwiIiwiIiksIGVsZW1lbnQuc3R5bGUpCisJCQkJCQlUZXh0OgorCQkJCQkJCWNvbnRhaW5lci5hZGRUZXh0IChJMThOS2V5R2VuZXJhdG9yLmtleShlbGVtZW50LnRleHQpLCBlbGVtZW50LnRleHQucmVwbGFjZSgiXCIiLCIiKSwgZWxlbWVudC5zdHlsZSkKKwkJCQkJCUF1dG9UZXh0OgorCQkJCQkJCWNvbnRhaW5lci5hZGRBdXRvVGV4dCAoZWxlbWVudC50eXBlLnRvU3RyaW5nLCBlbGVtZW50LnN0eWxlKQorCQkJCQkJRGF0YW1hcnRUYWJsZVByb3BlcnR5OgorCQkJCQkJCWNvbnRhaW5lci5hZGREYXRhIChlbGVtZW50LCBlbGVtZW50LnN0eWxlKQorCQkJCQkJSW1hZ2U6CisJCQkJCQkJYWRkSW1hZ2UoCisJCQkJCQkJCXdvcmtTZXQsIGNvbnRhaW5lciwgZWxlbWVudCwgbnVsbAorCQkJCQkJCSkKKwkJCQkJCURhdGFtYXJ0VGFibGU6CisJCQkJCQkJYWRkRGF0YW1hcnRUYWJsZShkYXRhbWFydCwgCisJCQkJCQkJCXdvcmtTZXQsIGNvbnRhaW5lciwgZWxlbWVudCwKKwkJCQkJCQkJbmV3IFdpZHRoKCIxMDAlIikKKwkJCQkJCQkpCisJCQkJCQlHcmlkOgorCQkJCQkJCWFkZEdyaWQoZGF0YW1hcnQsIAorCQkJCQkJCQl3b3JrU2V0LCBjb250YWluZXIsIGVsZW1lbnQsIG51bGwsCisJCQkJCQkJCW5ldyBXaWR0aCgiMTAwJSIpCisJCQkJCQkJKQorLy8JCQkJCQlUYWJsZURzbDoKKy8vCQkJCQkJCWFkZFRhYmxlKAorLy8JCQkJCQkJCXdvcmtTZXQsIGNvbnRhaW5lciwgZWxlbWVudCwKKy8vCQkJCQkJCQluZXcgV2lkdGgoIjEwMCUiKQorLy8JCQkJCQkJKQorLy8JCQkJCQlDaGFydERzbDoKKy8vCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2hhcnREc2wgLi4uIHRvZG8iKQorCQkJCQl9CisJCQkJfQorCQkJCWNhdGNoIChDb250ZW50RXhjZXB0aW9uIGNlKSB7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbignJyfCq2NlLmNsYXNzLnNpbXBsZU5hbWXCuzogwqtjZS5sb2NhbGl6ZWRNZXNzYWdlwrsnJycpCisJCQkJfQorCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQllLnByaW50U3RhY2tUcmFjZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIGRlZiBhZGREYXRhbWFydFRhYmxlKERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBDb250YWluZXJJdGVtIGNvbnRhaW5lciwgRGF0YW1hcnRUYWJsZSBkYXRhbWFydFRhYmxlLCBBdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgeworLy8JCXZhciBkYXRhbWFydCA9IGRhdGFtYXJ0VGFibGUuZGF0YW1hcnRSZWYKKwkJdmFyIGhpZGRlbnMgPSBuZXcgQXJyYXlMaXN0PERhdGFtYXJ0UHJvcGVydHk+CisJCWZvcgkoY29sdW1uRm9ybWF0dGVyIDogZGF0YW1hcnRUYWJsZS5kZXRhaWwuY29sdW1uRm9ybWF0dGVycykgeworLy8JCQlpZgkoY29sdW1uRm9ybWF0dGVyLmhpZGRlbnMpIHsKKy8vCQkJCXZhciBjb2x1bW4gPSBjb2x1bW5Gb3JtYXR0ZXIuY29sdW1uIAorLy8JCQkJc3dpdGNoCShjb2x1bW4pIHsKKy8vCQkJCQlUYWJsZVByb3BlcnR5OiBoaWRkZW5zLmFkZChjb2x1bW4udmFsdWVSZWYpCisvLwkJCQl9CisvLwkJCX0KKwkJfQorCQl2YXIgYWxpYXMgPSBkYXRhbWFydFRhYmxlLm5hbWUKKwkJdmFyIGRhdGFTZXROYW1lID0gVXRpbGl0aWVzLmdldERhdGFTZXROYW1lKGFsaWFzLCBkYXRhbWFydCkudG9TdHJpbmcKKwkJdmFyIGRhdGFTZXQgPSB3b3JrU2V0LmRhdGFTZXRzLmdldChkYXRhU2V0TmFtZSkKKwkJaWYJKGRhdGFTZXQgPT0gbnVsbCkgeworCQkJYWRkRGF0YW1hcnRTb3VyY2VBbmRTZXQoZGF0YW1hcnQsIHdvcmtTZXQsIGFsaWFzLCBoaWRkZW5zKQorCQkJZGF0YVNldCA9IHdvcmtTZXQuZGF0YVNldHMuZ2V0KGRhdGFTZXROYW1lKQorCQl9CisJCWNvbnRhaW5lci5hZGRUYWJsZShkYXRhU2V0LCBkYXRhbWFydFRhYmxlLCB3b3JrU2V0LmdldENvbXB1dGVkQ29sdW1ucyhkYXRhU2V0TmFtZSksIGRhdGFtYXJ0VGFibGUuZ3JvdXBzLCBkYXRhbWFydFRhYmxlLmRldGFpbC5zdHlsZSwgZGF0YW1hcnRUYWJsZS5kZXRhaWwuY29sdW1uRm9ybWF0dGVycywgZGF0YW1hcnRUYWJsZS5zdHlsZSwgYXR0cmlidXRlcykKKwl9CisJCisvLwlkZWYgYWRkVGFibGUoUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBDb250YWluZXIgY29udGFpbmVyLCBUYWJsZURzbCB0YWJsZURzbCwgQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKy8vCQl2YXIgZGF0YW1hcnQgPSB0YWJsZURzbC50YWJsZVJlZi5zb3VyY2UuZGF0YW1hcnRSZWYKKy8vCQl2YXIgaGlkZGVucyA9IG51bGwgYXMgRGF0YW1hcnRQcm9wZXJ0eVtdLy90YWJsZUl0ZW0uaGlkZGVucworLy8JCXZhciBhbGlhcyA9IHRhYmxlRHNsLm5hbWUKKy8vCQl2YXIgZGF0YVNldE5hbWUgPSBVdGlsaXRpZXMuZ2V0RGF0YVNldE5hbWUoYWxpYXMsIGRhdGFtYXJ0KS50b1N0cmluZworLy8JCXZhciBkYXRhU2V0ID0gd29ya1NldC5kYXRhU2V0cy5nZXQoZGF0YVNldE5hbWUpCisvLwkJaWYJKGRhdGFTZXQgPT0gbnVsbCkgeworLy8JCQlhZGREYXRhbWFydCh3b3JrU2V0LCBhbGlhcywgZGF0YW1hcnQsIGhpZGRlbnMpCisvLwkJCWRhdGFTZXQgPSB3b3JrU2V0LmRhdGFTZXRzLmdldChkYXRhU2V0TmFtZSkKKy8vCQl9CisvLwkJdmFyIHByb3BlcnR5TG9va3VwcyA9IG5ldyBQcm9wZXJ0eUxvb2t1cHMKKy8vCQl2YXIgdGFibGVJbmZlcnJlciA9IG5ldyBUYWJsZURTTEp2bU1vZGVsSW5mZXJyZXIKKy8vCQl0YWJsZUluZmVycmVyLmV4dHJhY3RQcm9wZXJ0eUxvb2t1cHModGFibGVEc2wudGFibGVSZWYsIHByb3BlcnR5TG9va3VwcykKKy8vCQljb250YWluZXIuYWRkVGFibGUoZGF0YVNldCwgd29ya1NldC5nZXRDb21wdXRlZENvbHVtbnMoZGF0YVNldE5hbWUpLCBwcm9wZXJ0eUxvb2t1cHMsIGF0dHJpYnV0ZXMpCisvLwl9CisJCisJcHJpdmF0ZSBkZWYgYWRkSW1hZ2UoUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBDb250YWluZXJJdGVtIGNvbnRhaW5lciwgSW1hZ2UgaW1hZ2VEYXRhLCBTdHlsZSBzdHlsZSwgQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKwkJdmFyIGltYWdlID0gbmV3IEltYWdlSXRlbSgKKwkJCXdvcmtTZXQsCisJCQludWxsLAorCQkJaW1hZ2VEYXRhLnNpemUubGl0ZXJhbCwgCisJCQlpbWFnZURhdGEuc2NhbGUsIAorCQkJaW1hZ2VEYXRhLnNvdXJjZVR5cGUubGl0ZXJhbCwgCisJCQlpbWFnZURhdGEuZmlsZW5hbWUKKwkJKQorCQljb250YWluZXIuYWRkKGltYWdlLCBzdHlsZSwgYXR0cmlidXRlcykKKwl9CisJCisJcHJpdmF0ZSBkZWYgYWRkR3JpZChEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgQ29udGFpbmVySXRlbSBjb250YWluZXIsIEdyaWQgZ3JpZCwgU3R5bGUgc3R5bGUsIEF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisJCXZhciByb3dDb3VudCA9IGdyaWQucm93cy5sZW5ndGgKKwkJdmFyIGNvbHVtbkNvdW50ID0gMAorCQlmb3IJKHJvdyA6IGdyaWQucm93cykgeworCQkJY29sdW1uQ291bnQgPSBNYXRoLm1heChjb2x1bW5Db3VudCwgcm93LmNlbGxzLmxlbmd0aCkKKwkJfQorCQl2YXIgZ3JpZEl0ZW0gPSBuZXcgR3JpZEl0ZW0oCisJCQl3b3JrU2V0LCAKKwkJCWNvbHVtbkNvdW50LAorCQkJcm93Q291bnQKKwkJKTsKKwkJdmFyIHJvd05vID0gMAorCQlmb3IJKHJvdyA6IGdyaWQucm93cykgeworCQkJdmFyIGNvbHVtbk5vID0gMAorCQkJZm9yCShjZWxsIDogcm93LmNlbGxzKSB7CisJCQkJZ2VuZXJhdGVJdGVtcyhkYXRhbWFydCwgd29ya1NldCwgZ3JpZEl0ZW0uZ2V0Q2VsbChjb2x1bW5Obywgcm93Tm8pLnNldENvbHVtblNwYW4oY2VsbC5jb2x1bW5zcGFuKSwgY2VsbC5lbGVtZW50cykKKwkJCQljb2x1bW5ObyA9IGNvbHVtbk5vKzEKKwkJCX0KKwkJCWlmCShyb3cuc3R5bGUgIT0gbnVsbCkgeworCQkJCWdyaWRJdGVtLmFwcGx5U3R5bGUocm93Tm8sIHJvdy5zdHlsZSkKKwkJCX0KKwkJCXJvd05vID0gcm93Tm8rMQorCQl9CisJCWNvbnRhaW5lci5hZGQoZ3JpZEl0ZW0sIHN0eWxlLCBhdHRyaWJ1dGVzKQorCX0KKworCW92ZXJyaWRlIGNyZWF0ZUFwcGVuZGFibGUoRU9iamVjdCBjb250ZXh0LCBJbXBvcnRNYW5hZ2VyIGltcG9ydE1hbmFnZXIsIEdlbmVyYXRvckNvbmZpZyBjb25maWcpIHsKKyAgCQkvLyByZXF1aXJlZCB0byBpbml0aWFsaXplIHRoZSBuZWVkZWQgYnVpbGRlciB0byBhdm9pZCBkZXByZWNhdGVkIG1ldGhvZHMKKwkJYnVpbGRlciA9IGNvbnRleHQuZVJlc291cmNlCisJCS8vIC0tLS0tLS0tLQorICAgICAgIGFkZEltcG9ydEZvcihpbXBvcnRNYW5hZ2VyLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIKKwkgICAgICAgICwgUmVwb3J0R2VuZXJhdG9yV29ya1NldAorCQkJLCBIb3Jpem9udGFsTGF5b3V0CisJCQksIFZpZXdMYXlvdXRNYW5hZ2VyCisJCQksIEJyb3dzZXJGcmFtZQorCQkJLCBTdHJlYW1SZXNvdXJjZQorCQkJLCBVbml0CisJCQksIEJ1dHRvbgorCQkJLCBjb20udmFhZGluLnVpLkxhYmVsCisJCQksIElFdmVudEJyb2tlcgorCQkJLCBFdmVudEhhbmRsZXIKKwkJCSwgRXZlbnQKKwkJCSwgRXZlbnRVdGlscworCQkJLCBFdmVudEJyb2tlck1zZworCQkJLCBDdXN0b21Nc2dFeGNlcHRpb24KKwkJCSwgSVJlcG9ydFByb3ZpZGVyLlJlbmRlcmluZworCQkJLCBBYnN0cmFjdENvbXBvbmVudAorCQkJLCBVVUlECisJCQksIEZpbHRlcgorCQkJLCBJVG9vbGJhckFjdGlvbikKKyAgICAJc3VwZXIuY3JlYXRlQXBwZW5kYWJsZShjb250ZXh0LCBpbXBvcnRNYW5hZ2VyLCBjb25maWcpCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1V0aWxpdGllcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1V0aWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTlkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LmNvcmUuZGF0YS5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNhc2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb21tb24uQnVuZGxlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5CYXNlUmVwb3J0OworCitwdWJsaWMgY2xhc3MgVXRpbGl0aWVzIHsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPZGFQcm9wQ29uZmlndXJhdGlvbklkKFN0cmluZyBhbGlhcywgRGF0YW1hcnREZWZpbml0aW9uIGRhdGFtYXJ0KSB7CisJCXJldHVybgorCQkJIEJhc2VSZXBvcnQuREFUQVNPVVJDRV9FWFRFTlNJT05fSUQKKwkJCStDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IKKwkJCStnZXREYXRhU291cmNlTmFtZShhbGlhcywgZGF0YW1hcnQpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRhU291cmNlTmFtZUZyb21PZGFQcm9wQ29uZmlndXJhdGlvbklkKFN0cmluZyBpZCkgeworCQlTdHJpbmdbXSB0b2tlbnMgPSBpZC5zcGxpdChDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IsIDIpOworCQlyZXR1cm4gdG9rZW5zWzFdOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVTeW1ib2xpY05hbWVGcm9tT2RhUHJvcENvbmZpZ3VyYXRpb25JZChTdHJpbmcgaWQpIHsKKwkJU3RyaW5nW10gdG9rZW5zID0gaWQuc3BsaXQoQ29uc3RhbnRzLk9EQV9QUk9QX0NPTkZJR19LRVlfU0VQQVJBVE9SLCA0KTsKKwkJcmV0dXJuIHRva2Vuc1szXTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YW1hcnRDbGFzc05hbWVGcm9tT2RhUHJvcENvbmZpZ3VyYXRpb25JZChTdHJpbmcgaWQpIHsKKwkJU3RyaW5nW10gdG9rZW5zID0gaWQuc3BsaXQoQ29uc3RhbnRzLk9EQV9QUk9QX0NPTkZJR19LRVlfU0VQQVJBVE9SLCA1KTsKKwkJcmV0dXJuIHRva2Vuc1s0XS5yZXBsYWNlQWxsKCJfIiwgIi4iKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZShEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQpIHsKKwkJTFBhY2thZ2UgcGNrZyA9IChMUGFja2FnZSkgZGF0YW1hcnQuZUNvbnRhaW5lcigpOworCQlTdHJpbmcgYnVuZGxlTmFtZSA9ICJAIjsKKwkJdHJ5IHsKKwkJCUVPYmplY3QgdG9wID0gcGNrZzsKKwkJCXdoaWxlICh0b3AuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKKwkJCQl0b3AgPSB0b3AuZUNvbnRhaW5lcigpOworCQkJfQorCQkJVVJJIHVyaSA9IHRvcC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKKwkJCWlmCSh1cmkuaXNQbGF0Zm9ybSgpKSB7CisJCQkJYnVuZGxlTmFtZSA9IHVyaS5zZWdtZW50KDEpOworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkge30gLy8gTk9QCisJCXJldHVybiBCdW5kbGVVdGlsaXRpZXMuZ2VuZXJhdGVTeW1ib2xpY05hbWVGb3JQYWNrYWdlKGJ1bmRsZU5hbWUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRhU291cmNlTmFtZShTdHJpbmcgYWxpYXMsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCkgeworCQlMUGFja2FnZSBwY2tnID0gKExQYWNrYWdlKSBkYXRhbWFydC5lQ29udGFpbmVyKCk7CisJCVN0cmluZyBidW5kbGVOYW1lID0gZ2V0QnVuZGxlTmFtZShkYXRhbWFydCk7CisJCWlmCShhbGlhcyA9PSBudWxsKSB7CisJCQlhbGlhcyA9ICJERUZBVUxUIjsKKwkJfQorCQlpZiAJKGFsaWFzLmNvbnRhaW5zKENvbnN0YW50cy5PREFfUFJPUF9DT05GSUdfS0VZX1NFUEFSQVRPUikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGFTb3VyY2UgQWxpYXMgJyIrYWxpYXMrIicgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiB1bmRlcnNjb3JlICciK0NvbnN0YW50cy5PREFfUFJPUF9DT05GSUdfS0VZX1NFUEFSQVRPUisiJyIpOworCQl9CisJCWlmIAkoYWxpYXMuY29udGFpbnMoIi4iKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YVNvdXJjZSBBbGlhcyAnIithbGlhcysiJyBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGRvdHMgJy4nIik7CisJCX0KKwkJaWYgCShidW5kbGVOYW1lLmNvbnRhaW5zKENvbnN0YW50cy5PREFfUFJPUF9DT05GSUdfS0VZX1NFUEFSQVRPUikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGFTb3VyY2UgQnVuZGxlTmFtZSAnIitidW5kbGVOYW1lKyInIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gdW5kZXJzY29yZSAnIitDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IrIiciKTsKKwkJfQorCQlpZiAJKGJ1bmRsZU5hbWUuY29udGFpbnMoIi4iKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YVNvdXJjZSBCdW5kbGVOYW1lICciK2J1bmRsZU5hbWUrIicgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBkb3RzICcuJyIpOworCQl9CisJCXJldHVybiAKKwkJCQkgIkRhdGFTb3VyY2UiK0NvbnN0YW50cy5PREFfUFJPUF9DT05GSUdfS0VZX1NFUEFSQVRPUgorCQkJCSthbGlhcytDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IKKwkJCQkrYnVuZGxlTmFtZStDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IKKwkJCQkrcGNrZy5nZXROYW1lKCkucmVwbGFjZUFsbCgiXFwuIiwgQ29uc3RhbnRzLk9EQV9QUk9QX0NPTkZJR19LRVlfU0VQQVJBVE9SKStDb25zdGFudHMuT0RBX1BST1BfQ09ORklHX0tFWV9TRVBBUkFUT1IKKwkJCQkrZGF0YW1hcnQuZ2V0TmFtZSgpK0lEYXRhTWFydC5EQVRBTUFSVF9DTEFTU19QT1NURklYOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRhU2V0TmFtZShTdHJpbmcgYWxpYXMsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCkgeworCQlpZgkoYWxpYXMgPT0gbnVsbCkKKwkJCXJldHVybiAiRGF0YVNldF8iK2RhdGFtYXJ0LmdldE5hbWUoKTsKKwkJZWxzZQorCQkJcmV0dXJuICJEYXRhU2V0XyIrYWxpYXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvc2NvcGluZy9SZXBvcnREU0xTY29wZVByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3Njb3BpbmcvUmVwb3J0RFNMU2NvcGVQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZlYmMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3Njb3BpbmcvUmVwb3J0RFNMU2NvcGVQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDU3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNjb3BpbmcKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERTTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyCisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjdXN0b20gc2NvcGluZyBkZXNjcmlwdGlvbi4KKyAqIAorICogc2VlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjc2NvcGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdCAKKyAqCisgKi8KK2NsYXNzIFJlcG9ydERTTFNjb3BlUHJvdmlkZXIgZXh0ZW5kcyBYYmFzZVdpdGhBbm5vdGF0aW9uc0JhdGNoU2NvcGVQcm92aWRlciB7CisJb3ZlcnJpZGUgSVNjb3BlIGdldFNjb3BlKEVPYmplY3QgY29udGV4dCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKy8vCQlpZiAocmVmZXJlbmNlID09IFJlcG9ydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0NfREFUQU1BUlRfVEFCTEVfX0RBVEFNQVJUX1JFRikgeworLy8JCQlyZXR1cm4gZ2V0U2NvcGVfRGF0YW1hcnRfRGF0YW1hcnRSZWYoc3VwZXIuZ2V0U2NvcGUoY29udGV4dCwgcmVmZXJlbmNlKSkJCQkKKy8vCQl9CisJCXN1cGVyLmdldFNjb3BlKGNvbnRleHQsIHJlZmVyZW5jZSkKKwl9CisJCisJZGVmIElTY29wZSBnZXRTY29wZV9EYXRhbWFydF9EYXRhbWFydFJlZihJU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHNjb3BlCisvLwkJdmFyIHJlc3VsdCA9IDxFT2JqZWN0Pm5ld0FycmF5TGlzdAorLy8JCWZvcgkoZWxlbWVudCA6IHNjb3BlLmFsbEVsZW1lbnRzKSB7CisvLwkJCWlmCShlbGVtZW50LkVPYmplY3RPclByb3h5IGluc3RhbmNlb2YgQ0NEYXRhbWFydERlZmluaXRpb24pIHsKKy8vCQkJCXZhciBkZWZpbml0aW9uID0gZWxlbWVudC5FT2JqZWN0T3JQcm94eSBhcyBDQ0RhdGFtYXJ0RGVmaW5pdGlvbgorLy8JCQkJaWYJKGRlZmluaXRpb24uZUlzUHJveHkpIHsKKy8vCQkJCQlkZWZpbml0aW9uID0gRWNvcmVVdGlsLnJlc29sdmUoZGVmaW5pdGlvbiwgZGVmaW5pdGlvbi5lUmVzb3VyY2UpIGFzIENDRGF0YW1hcnREZWZpbml0aW9uCisvLwl9CisvLwkJCQlpZgkoQ0NEYXRhbWFydERlZmluaXRpb25VdGlsLmdldE51bUF4ZXMoZGVmaW5pdGlvbikgPj0gMikgeworLy8JCQkJCXJlc3VsdC5hZGQoZWxlbWVudC5FT2JqZWN0T3JQcm94eSkKKy8vCQkJCX0KKy8vCQkJfQorLy8JCX0KKy8vCQlyZXR1cm4gU2NvcGVzLnNjb3BlRm9yKHJlc3VsdCkKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9OYW1lc0FyZVVuaXF1ZVZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbGlkYXRpb24vTmFtZXNBcmVVbmlxdWVWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQwM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbGlkYXRpb24vTmFtZXNBcmVVbmlxdWVWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydExhenlSZXNvbHZlcjsKKworcHVibGljIGNsYXNzIE5hbWVzQXJlVW5pcXVlVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy52YWxpZGF0aW9uLk5hbWVzQXJlVW5pcXVlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIExpc3Q8Q2xhc3M8Pz4+IGluZ29yZUNsYXNzZXMgPSBBcnJheXMuYXNMaXN0KAorCQlSZXBvcnRCYXNlLmNsYXNzLAorCQlSZXBvcnRMYXp5UmVzb2x2ZXIuY2xhc3MKKwkpOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZUNsYXNzKEVDbGFzcyBlY2xhc3MpIHsKKwkJQ2xhc3M8Pz4gdENsYXNzID0gZWNsYXNzLmdldEluc3RhbmNlQ2xhc3MoKTsKKwkJaWYJKGluZ29yZUNsYXNzZXMuY29udGFpbnModENsYXNzKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmlnbm9yZUNsYXNzKGVjbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbGlkYXRpb24vUmVwb3J0RFNMVmFsaWRhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbGlkYXRpb24vUmVwb3J0RFNMVmFsaWRhdG9yLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9SZXBvcnREU0xWYWxpZGF0b3IueHRlbmQKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWxpZGF0aW9uCisvL2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkNoZWNrCisKKy8qKgorICogQ3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuIAorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCN2YWxpZGF0aW9uCisgKi8KK2NsYXNzIFJlcG9ydERTTFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UmVwb3J0RFNMVmFsaWRhdG9yIHsKKworLy8gIHB1YmxpYyBzdGF0aWMgdmFsIElOVkFMSURfTkFNRSA9ICdpbnZhbGlkTmFtZScKKy8vCisvLwlAQ2hlY2sKKy8vCWRlZiBjaGVja0dyZWV0aW5nU3RhcnRzV2l0aENhcGl0YWwoR3JlZXRpbmcgZ3JlZXRpbmcpIHsKKy8vCQlpZiAoIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZShncmVldGluZy5uYW1lLmNoYXJBdCgwKSkpIHsKKy8vCQkJd2FybmluZygnTmFtZSBzaG91bGQgc3RhcnQgd2l0aCBhIGNhcGl0YWwnLCAKKy8vCQkJCQlNeURzbFBhY2thZ2UuTGl0ZXJhbHMuR1JFRVRJTkdfX05BTUUsCisvLwkJCQkJSU5WQUxJRF9OQU1FKQorLy8JCX0KKy8vCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC92YWx1ZWNvbnZlcnRlci9SZXBvcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC92YWx1ZWNvbnZlcnRlci9SZXBvcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjk5NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbHVlY29udmVydGVyL1JlcG9ydFF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudmFsdWVjb252ZXJ0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5vZGVtb2RlbC5JTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5ub2RlbW9kZWwudXRpbC5Ob2RlTW9kZWxVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlUXVhbGlmaWVkTmFtZVByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgUmVwb3J0UXVhbGlmaWVkTmFtZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VRdWFsaWZpZWROYW1lUHJvdmlkZXIgeworCisJQEluamVjdAorCXByaXZhdGUgSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXIgcXVhbGlmaWVkTmFtZUNvbnZlcnRlcjsKKworCUBPdmVycmlkZQorCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShFT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBRdWFsaWZpZWROYW1lLmNyZWF0ZSgiIik7CisJCX0KKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkgeworCQkJUmVwb3J0IHJlcG9ydCA9IChSZXBvcnQpIG9iajsKKyAgICAgICAgICAgIGlmIChyZXBvcnQuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZWROYW1lQ29udmVydGVyLnRvUXVhbGlmaWVkTmFtZShyZXBvcnQuZ2V0TmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKG9iaik7CisJfQorCisJLy8gdGhpcyBtZXRob2QgZXZhbHVhdGVzIHRoZSBjcm9zcyByZWZlcmVuY2VkIG5hbWUgb2YgYW4gb2JqZWN0IHdpdGhvdXQgY2F1c2luZyBjeWNsaWMgbGF6eSBsaW5raW5nIGVycm9ycworCXByaXZhdGUgU3RyaW5nIGdldENyb3NzUmVmZXJlbmNlTmFtZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJTGlzdDxJTm9kZT4gbm9kZXMgPSBOb2RlTW9kZWxVdGlscy5maW5kTm9kZXNGb3JGZWF0dXJlKG9iaiwgZmVhdHVyZSk7CisJCWlmIChub2Rlcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIE5vZGVNb2RlbFV0aWxzLmdldFRva2VuVGV4dChub2Rlcy5nZXQoMCkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKEVPYmplY3Qgb2JqKSB7CisJCUVPYmplY3QgbyA9IG9iai5lQ29udGFpbmVyKCk7CisJCXdoaWxlKCEobyBpbnN0YW5jZW9mIFJlcG9ydFBhY2thZ2UpKSB7CisJCQlvID0gby5lQ29udGFpbmVyKCk7CisJCX0KKwkJcmV0dXJuICgoUmVwb3J0UGFja2FnZSlvKS5nZXROYW1lKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbHVlY29udmVydGVyL1JlcG9ydFZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3ZhbHVlY29udmVydGVyL1JlcG9ydFZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsdWVjb252ZXJ0ZXIvUmVwb3J0VmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWx1ZWNvbnZlcnRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudmFsdWVjb252ZXJ0ZXIuVFJBTlNMQVRBQkxFU1RSSU5HVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5WYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb252ZXJzaW9uLlhiYXNlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBBZGRzIGEgdmFsdWUgY29udmVyc2lvbiBmb3IgdGhlIFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcnVsZS4KKyAqIAorICogQGF1dGhvciBKb3NlIERvbWluZ3VlegorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFJlcG9ydFZhbHVlQ29udmVydGVyU2VydmljZSBleHRlbmRzIFhiYXNlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlIHsKKworCUBJbmplY3QKKwlwcml2YXRlIFRSQU5TTEFUQUJMRVNUUklOR1ZhbHVlQ29udmVydGVyIGNvbnZlcnRlcjsKKworCUBWYWx1ZUNvbnZlcnRlcihydWxlID0gIlF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKQorCXB1YmxpYyBJVmFsdWVDb252ZXJ0ZXI8U3RyaW5nPiBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVZhbHVlQ29udmVydGVyKCk7CisJfQorCisJQFZhbHVlQ29udmVydGVyKHJ1bGUgPSAiVFJBTlNMQVRBQkxFU1RSSU5HIikKKwlwdWJsaWMgSVZhbHVlQ29udmVydGVyPFN0cmluZz4gZ2V0VHJhbnNsYXRhYmxlU3RyaW5nVmFsdWVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC90ZXN0L2RlL2NvbXBleC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0JpcnREZW1vLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC90ZXN0L2RlL2NvbXBleC94dGV4dC9yZXBvcnRkc2wvY29tbW9uL0JpcnREZW1vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3ZmUyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3Rlc3QvZGUvY29tcGV4L3h0ZXh0L3JlcG9ydGRzbC9jb21tb24vQmlydERlbW8uamF2YQpAQCAtMCwwICsxLDQzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWN0dWF0ZSBDb3Jwb3JhdGlvbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFjdHVhdGUgQ29ycG9yYXRpb24gIC0gY3JlYXRlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5jb3JlLmZyYW1ld29yay5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLkVuZ2luZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5lbmdpbmUuYXBpLkhUTUxSZW5kZXJPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQuZW5naW5lLmFwaS5JUmVwb3J0RW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGkuSVJlcG9ydFJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmVuZ2luZS5hcGkuSVJ1bkFuZFJlbmRlclRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQuZW5naW5lLmFwaS5QREZSZW5kZXJPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkNlbGxIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkRhdGFJdGVtSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5EZXNpZ25Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkRlc2lnbkVsZW1lbnRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5HcmlkSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5JRGVzaWduRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5JRGVzaWduRW5naW5lRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuSW1hZ2VIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkxhYmVsSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5Qcm9wZXJ0eUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuUmVwb3J0RGVzaWduSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5Sb3dIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJvd09wZXJhdGlvblBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNlc3Npb25IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlNoYXJlZFN0eWxlSGFuZGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5TdHJ1Y3R1cmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5UYWJsZUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuVGV4dEl0ZW1IYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmFjdGl2aXR5LlNlbWFudGljRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5lbGVtZW50cy5EZXNpZ25DaG9pY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuQ29tcHV0ZWRDb2x1bW47CitpbXBvcnQgb3JnLm9sYXA0ai5DZWxsOworaW1wb3J0IG9yZy5vbGFwNGoubWV0YWRhdGEuTWVtYmVyOworCitpbXBvcnQgY29tLmlibS5pY3UudXRpbC5VTG9jYWxlOworCisvKioKKyAqIFNpbXBsZSBCSVJUIERlc2lnbiBFbmdpbmUgQVBJIChERUFQSSkgZGVtby4KKyAqLworCitwdWJsaWMgY2xhc3MgQmlydERlbW8geworCQorCXB1YmxpYyBjbGFzcyBNeUNlbGwgeworCQlNZW1iZXIgbWVtYmVyOworCQlDZWxsIGNlbGw7CisKKwkJcHVibGljIE15Q2VsbCgpIHsKKwkJfQorCisJCXB1YmxpYyBNeUNlbGwoTWVtYmVyIG0pIHsKKwkJCXRoaXMubWVtYmVyID0gbTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVtYmVyOiAiICsgbS5nZXRDYXB0aW9uKCkpOworCQl9CisKKwkJcHVibGljIE15Q2VsbChDZWxsIGMpIHsKKwkJCXRoaXMuY2VsbCA9IGM7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNlbGw6ICIgKyBjLmdldEZvcm1hdHRlZFZhbHVlKCkpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCWlmIChtZW1iZXIgIT0gbnVsbCkgeworCQkJCXJldHVybiBtZW1iZXIuZ2V0Q2FwdGlvbigpOworCQkJfQorCQkJaWYgKGNlbGwgIT0gbnVsbCkgeworCQkJCXJldHVybiBjZWxsLmdldEZvcm1hdHRlZFZhbHVlKCk7CisJCQl9CisJCQlyZXR1cm4gIiI7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIElSZXBvcnRFbmdpbmUgYmlydFJlcG9ydEVuZ2luZSA9IG51bGw7CisKKwlwcml2YXRlIHN0YXRpYyBSZXBvcnREZXNpZ25IYW5kbGUgZGVzaWduOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURFUl9ST1cgPSAwOworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQl0cnkgeworCQkJYnVpbGRSZXBvcnQoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSBjYXRjaCAoU2VtYW50aWNFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRSZXBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlbWFudGljRXhjZXB0aW9uIHsKKwkJTGlzdDxMaXN0PE15Q2VsbD4+IHJlc3VsdCA9IG51bGw7CisJCWJ1aWxkUmVwb3J0KCJIZWxsbywgd29ybGQhIiwgcmVzdWx0KTsKKwl9CisKKwkvLyBUaGlzIGZ1bmN0aW9uIHNob3dzIGhvdyB0byBidWlsZCBhIHZlcnkgc2ltcGxlIEJJUlQgcmVwb3J0IHdpdGggYQorCS8vIG1pbmltYWwgc2V0IG9mIGNvbnRlbnQ6IGEgc2ltcGxlIGdyaWQgd2l0aCBhbiBpbWFnZSBhbmQgYSBsYWJlbC4KKwlzdGF0aWMgdm9pZCBidWlsZFJlcG9ydChTdHJpbmcgaGVhZGVyLCBMaXN0PExpc3Q8TXlDZWxsPj4gcmVzdWx0KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZW1hbnRpY0V4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBhIHNlc3Npb24gaGFuZGxlLiBUaGlzIGlzIHVzZWQgdG8gbWFuYWdlIGFsbCBvcGVuIGRlc2lnbnMuCisJCS8vIFlvdXIgYXBwIG5lZWQgY3JlYXRlIHRoZSBzZXNzaW9uIG9ubHkgb25jZS4KKworCQkvLyBDb25maWd1cmUgdGhlIEVuZ2luZSBhbmQgc3RhcnQgdGhlIFBsYXRmb3JtCisJCURlc2lnbkNvbmZpZyBjb25maWcgPSBuZXcgRGVzaWduQ29uZmlnKCk7CisKKwkJY29uZmlnLnNldFByb3BlcnR5KCJCSVJUX0hPTUUiLAorCQkJCSJDOi9iaXJ0LXJ1bnRpbWUtMl8xXzEvYmlydC1ydW50aW1lLTJfMV8xL1JlcG9ydEVuZ2luZSIpOworCQlJRGVzaWduRW5naW5lIGVuZ2luZSA9IG51bGw7CisJCXRyeSB7CisKKwkJCVBsYXRmb3JtLnN0YXJ0dXAoY29uZmlnKTsKKwkJCUlEZXNpZ25FbmdpbmVGYWN0b3J5IGZhY3RvcnkgPSAoSURlc2lnbkVuZ2luZUZhY3RvcnkpIFBsYXRmb3JtCisJCQkJCS5jcmVhdGVGYWN0b3J5T2JqZWN0KElEZXNpZ25FbmdpbmVGYWN0b3J5LkVYVEVOU0lPTl9ERVNJR05fRU5HSU5FX0ZBQ1RPUlkpOworCQkJZW5naW5lID0gZmFjdG9yeS5jcmVhdGVEZXNpZ25FbmdpbmUoY29uZmlnKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJU2Vzc2lvbkhhbmRsZSBzZXNzaW9uID0gZW5naW5lLm5ld1Nlc3Npb25IYW5kbGUoVUxvY2FsZS5FTkdMSVNIKTsKKworCQkvLyBDcmVhdGUgYSBuZXcgcmVwb3J0IGRlc2lnbi4KKworCQlkZXNpZ24gPSBzZXNzaW9uLmNyZWF0ZURlc2lnbigpOworCisJCS8vIFRoZSBlbGVtZW50IGZhY3RvcnkgY3JlYXRlcyBpbnN0YW5jZXMgb2YgdGhlIHZhcmlvdXMgQklSVCBlbGVtZW50cy4KKworCQlFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gZGVzaWduLmdldEVsZW1lbnRGYWN0b3J5KCk7CisKKwkJLy8gQ3JlYXRlIGEgc2ltcGxlIG1hc3RlciBwYWdlIHRoYXQgZGVzY3JpYmVzIGhvdyB0aGUgcmVwb3J0IHdpbGwKKwkJLy8gYXBwZWFyIHdoZW4gcHJpbnRlZC4KKwkJLy8KKwkJLy8gTm90ZTogVGhlIHJlcG9ydCB3aWxsIGZhaWwgdG8gbG9hZCBpbiB0aGUgQklSVCBkZXNpZ25lcgorCQkvLyB1bmxlc3MgeW91IGNyZWF0ZSBhIG1hc3RlciBwYWdlLgorCisJCURlc2lnbkVsZW1lbnRIYW5kbGUgZWxlbWVudCA9IGZhY3RvcnkKKwkJCQkubmV3U2ltcGxlTWFzdGVyUGFnZSgiUGFnZSBNYXN0ZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlkZXNpZ24uZ2V0TWFzdGVyUGFnZXMoKS5hZGQoZWxlbWVudCk7CisKKwkJLy8gQ3JlYXRlIGEgZ3JpZCBhbmQgYWRkIGl0IHRvIHRoZSAiYm9keSIgc2xvdCBvZiB0aGUgcmVwb3J0CisJCS8vIGRlc2lnbi4KKworCQlHcmlkSGFuZGxlIGdyaWQgPSBmYWN0b3J5Lm5ld0dyaWRJdGVtKG51bGwsIDMgLyogY29scyAqLywgMiAvKiByb3cgKi8pOworCQlkZXNpZ24uZ2V0Qm9keSgpLmFkZChncmlkKTsKKworCQkvLyBOb3RlOiBTZXQgdGhlIHRhYmxlIHdpZHRoIHRvIDEwMCUgdG8gcHJldmVudCB0aGUgbGFiZWwKKwkJLy8gZnJvbSBhcHBlYXJpbmcgdG9vIG5hcnJvdyBpbiB0aGUgbGF5b3V0IHZpZXcuCisKKwkJZ3JpZC5zZXRXaWR0aCgiMTAwJSIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gR2V0IHRoZSBmaXJzdCByb3cuCisJCVJvd0hhbmRsZSByb3cgPSAoUm93SGFuZGxlKSBncmlkLmdldFJvd3MoKS5nZXQoMCk7CisKKwkJLy8gQ3JlYXRlIGFuIGltYWdlIGFuZCBhZGQgaXQgdG8gdGhlIGZpcnN0IGNlbGwuCisKKwkJSW1hZ2VIYW5kbGUgaW1hZ2UgPSBmYWN0b3J5Lm5ld0ltYWdlKG51bGwpOworCQlDZWxsSGFuZGxlIGNlbGwgPSAoQ2VsbEhhbmRsZSkgcm93LmdldENlbGxzKCkuZ2V0KDApOworCQljZWxsLmdldENvbnRlbnQoKS5hZGQoaW1hZ2UpOworCQkvLyBpbWFnZS5zZXRVUkwoIlwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9iaXJ0L3Bob2VuaXgvdHV0b3JpYWwvYmFzaWMvbXVsdGljaGlwLTQuanBnXCIiKTsKKwkJaW1hZ2Uuc2V0U291cmNlKERlc2lnbkNob2ljZUNvbnN0YW50cy5JTUFHRV9SRUZfVFlQRV9GSUxFKTsKKwkJaW1hZ2Uuc2V0U2l6ZShEZXNpZ25DaG9pY2VDb25zdGFudHMuSU1BR0VfU0laRV9TQ0FMRV9UT19JVEVNKTsKKwkJaW1hZ2Uuc2V0U2NhbGUoMC41KTsKKwkJaW1hZ2Uuc2V0RmlsZSgiXCJvc2JwL2N4LmpwZ1wiIik7CisKKwkJLy8gQ3JlYXRlIGEgbGFiZWwgYW5kIGFkZCBpdCB0byB0aGUgc2Vjb25kIGNlbGwuCisJCWNlbGwgPSAoQ2VsbEhhbmRsZSkgcm93LmdldENlbGxzKCkuZ2V0KDEpOworCQlUZXh0SXRlbUhhbmRsZSB0ZXh0ID0gZmFjdG9yeS5uZXdUZXh0SXRlbSgidGV4dCIpOworCQl0ZXh0LnNldENvbnRlbnRUeXBlKERlc2lnbkNob2ljZUNvbnN0YW50cy5URVhUX0RBVEFfQ09OVEVOVF9UWVBFX0hUTUwpOworCQl0ZXh0LnNldENvbnRlbnQoIjxjZW50ZXIgc3R5bGU9J2ZvbnQtc2l6ZToyMHB4OyBmb250LXdlaWdodDpib2xkOyc+IgorCQkJCSsgaGVhZGVyICsgIjwvY2VudGVyPjxicj4iKTsKKwkJY2VsbC5nZXRDb250ZW50KCkuYWRkKHRleHQpOworCisJCS8vIC8vIEdldCB0aGUgc2Vjb25kIHJvdy4KKwkJLy8gUm93SGFuZGxlIHJvdzIgPSAoUm93SGFuZGxlKSBncmlkLmdldFJvd3MoKS5nZXQoMSk7CisJCS8vIGNlbGwgPSAoQ2VsbEhhbmRsZSkgcm93Mi5nZXRDZWxscygpLmdldCgyKTsKKworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCWJ1aWxkVGFibGVSZXBvcnQocmVzdWx0LCBkZXNpZ24pOworCQl9CisKKwkJLy8gSFRNTCBvdXRwdXQKKwkJZ2V0SFRNTChkZXNpZ24pOworCisJCS8vIEhUTUwgcGRmCisJCWdldFBERihkZXNpZ24pOworCisJCS8vIFNhdmUgdGhlIGRlc2lnbiBhbmQgY2xvc2UgaXQuCisJCWRlc2lnbi5zYXZlQXMoImY6L0JpcnQvc2FtcGxlLnJwdGRlc2lnbiIpOyAvLyROT04tTkxTLTEkCisJCWRlc2lnbi5jbG9zZSgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaGVkIik7CisKKwkJLy8gV2UncmUgZG9uZSEKKwl9CisKKwlzdGF0aWMgdm9pZCBnZXRIVE1MKFJlcG9ydERlc2lnbkhhbmRsZSBkZXNpZ25IYW5kbGUpIHsKKwkJYmlydFJlcG9ydEVuZ2luZSA9IENDQmlydEVuZ2luZS5nZXRSZXBvcnRFbmdpbmUoKTsKKwkJSVJlcG9ydFJ1bm5hYmxlIGRlc2lnbjsKKwkJLy8gYnVpbGRSZXBvcnQoIGNvbHMsIGRlc2lnbkhhbmRsZSApOworCisJCXRyeSB7CisJCQkvLyBPcGVuIHJlcG9ydCBkZXNpZ24KKwkJCWRlc2lnbiA9IGJpcnRSZXBvcnRFbmdpbmUub3BlblJlcG9ydERlc2lnbihkZXNpZ25IYW5kbGUpOworCQkJLy8gY3JlYXRlIHRhc2sgdG8gcnVuIGFuZCByZW5kZXIgcmVwb3J0CisJCQlJUnVuQW5kUmVuZGVyVGFzayB0YXNrID0gYmlydFJlcG9ydEVuZ2luZQorCQkJCQkuY3JlYXRlUnVuQW5kUmVuZGVyVGFzayhkZXNpZ24pOworCisJCQkvLyBzZXQgb3V0cHV0IG9wdGlvbnMKKwkJCUhUTUxSZW5kZXJPcHRpb24gb3B0aW9ucyA9IG5ldyBIVE1MUmVuZGVyT3B0aW9uKCk7CisJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJYm9zLnRvU3RyaW5nKCJJU08tODg1OS0xIik7CisJCQlvcHRpb25zLnNldE91dHB1dFN0cmVhbShib3MpOworCQkJb3B0aW9ucy5zZXRPdXRwdXRGb3JtYXQoSFRNTFJlbmRlck9wdGlvbi5PVVRQVVRfRk9STUFUX0hUTUwpOworCQkJb3B0aW9ucy5zZXRFbWJlZGRhYmxlKHRydWUpOworCQkJb3B0aW9ucy5zZXRPdXRwdXRGaWxlTmFtZSgiZjovQmlydC9zYW1wbGUuaHRtbCIpOworCQkJdGFzay5zZXRSZW5kZXJPcHRpb24ob3B0aW9ucyk7CisKKwkJCS8vIHJ1biByZXBvcnQKKwkJCXRhc2sucnVuKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oYm9zKTsKKwkJCXRhc2suY2xvc2UoKTsKKwkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGNhdGNoIChFbmdpbmVFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXN0YXRpYyB2b2lkIGdldFBERihSZXBvcnREZXNpZ25IYW5kbGUgZGVzaWduSGFuZGxlKSB7CisJCWJpcnRSZXBvcnRFbmdpbmUgPSBDQ0JpcnRFbmdpbmUuZ2V0UmVwb3J0RW5naW5lKCk7CisJCUlSZXBvcnRSdW5uYWJsZSBkZXNpZ247CisJCS8vIGJ1aWxkUmVwb3J0KCBjb2xzLCBkZXNpZ25IYW5kbGUgKTsKKworCQl0cnkgeworCQkJLy8gT3BlbiByZXBvcnQgZGVzaWduCisJCQlkZXNpZ24gPSBiaXJ0UmVwb3J0RW5naW5lLm9wZW5SZXBvcnREZXNpZ24oZGVzaWduSGFuZGxlKTsKKwkJCS8vIGNyZWF0ZSB0YXNrIHRvIHJ1biBhbmQgcmVuZGVyIHJlcG9ydAorCQkJSVJ1bkFuZFJlbmRlclRhc2sgdGFzayA9IGJpcnRSZXBvcnRFbmdpbmUKKwkJCQkJLmNyZWF0ZVJ1bkFuZFJlbmRlclRhc2soZGVzaWduKTsKKworCQkJLy8gc2V0IG91dHB1dCBvcHRpb25zCisJCQlQREZSZW5kZXJPcHRpb24gb3B0aW9ucyA9IG5ldyBQREZSZW5kZXJPcHRpb24oKTsKKwkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQlib3MudG9TdHJpbmcoIklTTy04ODU5LTEiKTsKKwkJCW9wdGlvbnMuc2V0T3V0cHV0U3RyZWFtKGJvcyk7CisJCQlvcHRpb25zLnNldE91dHB1dEZvcm1hdChQREZSZW5kZXJPcHRpb24uT1VUUFVUX0ZPUk1BVF9QREYpOworCQkJb3B0aW9ucy5zZXRPdXRwdXRGaWxlTmFtZSgiZjovQmlydC9zYW1wbGUucGRmIik7CisJCQlvcHRpb25zLnNldE91dHB1dFN0cmVhbShib3MpOworCQkJdGFzay5zZXRSZW5kZXJPcHRpb24ob3B0aW9ucyk7CisJCQkvLyB0YXNrLnNldExvY2FsZShuZXcgTG9jYWxlKCJlbiIsICJVUyIpKTsKKworCQkJLy8gcnVuIHJlcG9ydAorCQkJdGFzay5ydW4oKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihib3MpOworCQkJdGFzay5jbG9zZSgpOworCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKEVuZ2luZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJLy8gfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBidWlsZFJlcG9ydChTdHJpbmdbXSBjb2xzLCBSZXBvcnREZXNpZ25IYW5kbGUgZGVzaWduSGFuZGxlKSB7CisKKwkJdHJ5IHsKKwkJCUVsZW1lbnRGYWN0b3J5IGRlc2lnbkZhY3RvcnkgPSBkZXNpZ25IYW5kbGUuZ2V0RWxlbWVudEZhY3RvcnkoKTsKKworCQkJVGFibGVIYW5kbGUgdGFibGUgPSBkZXNpZ25GYWN0b3J5CisJCQkJCS5uZXdUYWJsZUl0ZW0oInRhYmxlIiwgY29scy5sZW5ndGgpOworCQkJdGFibGUuc2V0V2lkdGgoIjEwMCUiKTsKKwkJCXRhYmxlLnNldERhdGFTZXQoZGVzaWduSGFuZGxlLmZpbmREYXRhU2V0KCJkcyIpKTsKKworCQkJUHJvcGVydHlIYW5kbGUgY29tcHV0ZWRTZXQgPSB0YWJsZS5nZXRDb2x1bW5CaW5kaW5ncygpOworCQkJQ29tcHV0ZWRDb2x1bW4gY3MxID0gbnVsbDsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisJCQkJY3MxID0gU3RydWN0dXJlRmFjdG9yeS5jcmVhdGVDb21wdXRlZENvbHVtbigpOworCQkJCWNzMS5zZXROYW1lKChTdHJpbmcpIGNvbHNbaV0pOworCQkJCWNzMS5zZXRFeHByZXNzaW9uKCJkYXRhU2V0Um93W1wiIiArIChTdHJpbmcpIGNvbHNbaV0gKyAiXCJdIik7CisJCQkJY29tcHV0ZWRTZXQuYWRkSXRlbShjczEpOworCQkJfQorCisJCQkvLyB0YWJsZSBoZWFkZXIKKwkJCVJvd0hhbmRsZSB0YWJsZWhlYWRlciA9IChSb3dIYW5kbGUpIHRhYmxlLmdldEhlYWRlcigpLmdldCgwKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisJCQkJTGFiZWxIYW5kbGUgbGFiZWwxID0gZGVzaWduRmFjdG9yeS5uZXdMYWJlbCgoU3RyaW5nKSBjb2xzW2ldKTsKKwkJCQlsYWJlbDEuc2V0VGV4dCgoU3RyaW5nKSBjb2xzW2ldKTsKKwkJCQlDZWxsSGFuZGxlIGNlbGwgPSAoQ2VsbEhhbmRsZSkgdGFibGVoZWFkZXIuZ2V0Q2VsbHMoKS5nZXQoaSk7CisJCQkJY2VsbC5nZXRDb250ZW50KCkuYWRkKGxhYmVsMSk7CisJCQl9CisKKwkJCS8vIHRhYmxlIGRldGFpbAorCQkJUm93SGFuZGxlIHRhYmxlZGV0YWlsID0gKFJvd0hhbmRsZSkgdGFibGUuZ2V0RGV0YWlsKCkuZ2V0KDApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisJCQkJQ2VsbEhhbmRsZSBjZWxsID0gKENlbGxIYW5kbGUpIHRhYmxlZGV0YWlsLmdldENlbGxzKCkuZ2V0KGkpOworCQkJCURhdGFJdGVtSGFuZGxlIGRhdGEgPSBkZXNpZ25GYWN0b3J5Lm5ld0RhdGFJdGVtKCJkYXRhXyIKKwkJCQkJCSsgKFN0cmluZykgY29sc1tpXSk7CisJCQkJZGF0YS5zZXRSZXN1bHRTZXRDb2x1bW4oKFN0cmluZykgY29sc1tpXSk7CisJCQkJY2VsbC5nZXRDb250ZW50KCkuYWRkKGRhdGEpOworCQkJfQorCisJCQlkZXNpZ25IYW5kbGUuZ2V0Qm9keSgpLmFkZCh0YWJsZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IGdldENvbFNpemUoTGlzdDxMaXN0PE15Q2VsbD4+IG15Q2VsbExpc3QpIHsKKwkJaWYgKG15Q2VsbExpc3Quc2l6ZSgpID4gMCkgeworCQkJcmV0dXJuIG15Q2VsbExpc3QuZ2V0KDApLnNpemUoKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRDb2xzKExpc3Q8TGlzdDxNeUNlbGw+PiBteUNlbGxMaXN0KSB7CisJCWlmIChteUNlbGxMaXN0LnNpemUoKSA+IDApIHsKKwkJCUxpc3Q8U3RyaW5nPiBjb2xzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGdldENvbFNpemUobXlDZWxsTGlzdCkpOworCQkJZm9yIChNeUNlbGwgbXlDZWxsIDogbXlDZWxsTGlzdC5nZXQoMCkpIHsKKwkJCQljb2xzLmFkZChteUNlbGwuZ2V0VmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gY29scy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworCQl9CisJCXJldHVybiBuZXcgU3RyaW5nWzBdOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRUYWJsZVJlcG9ydChMaXN0PExpc3Q8TXlDZWxsPj4gcmVzdWx0LAorCQkJUmVwb3J0RGVzaWduSGFuZGxlIGRlc2lnbkhhbmRsZSkgeworCisJCXRyeSB7CisJCQlFbGVtZW50RmFjdG9yeSBkZXNpZ25GYWN0b3J5ID0gZGVzaWduSGFuZGxlLmdldEVsZW1lbnRGYWN0b3J5KCk7CisKKwkJCWludCBjb2xzTGVuZ3RoID0gZ2V0Q29sU2l6ZShyZXN1bHQpOworCQkJU3RyaW5nW10gY29scyA9IGdldENvbHMocmVzdWx0KTsKKworCQkJVGFibGVIYW5kbGUgdGFibGUgPSBkZXNpZ25GYWN0b3J5Lm5ld1RhYmxlSXRlbSgidGFibGUiLCBjb2xzTGVuZ3RoKTsKKwkJCS8vIFRhYmxlIHN0eWxpbmcKKwkJCXRhYmxlLnNldFdpZHRoKCIxMDAlIik7CisJCQkvLyBTaGFyZWRTdHlsZUhhbmRsZSB0YWJsZVN0eWxlID0KKwkJCS8vIGRlc2lnbkZhY3RvcnkubmV3U3R5bGUoInRhYmxlU3R5bGUiKTsKKwkJCS8vIGRlc2lnbkhhbmRsZS5nZXRTdHlsZXMoKS5hZGQodGFibGVTdHlsZSk7CisJCQkvLyB0YWJsZVN0eWxlLnNldEJvcmRlclRvcFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX1NPTElEKTsKKwkJCS8vIHRhYmxlU3R5bGUuc2V0Qm9yZGVyTGVmdFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX1NPTElEKTsKKwkJCS8vIHRhYmxlU3R5bGUuc2V0Qm9yZGVyUmlnaHRTdHlsZShEZXNpZ25DaG9pY2VDb25zdGFudHMuTElORV9TVFlMRV9TT0xJRCk7CisJCQkvLyB0YWJsZVN0eWxlLnNldEJvcmRlckJvdHRvbVN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX1NPTElEKTsKKwkJCS8vIHRhYmxlLnNldFN0eWxlKHRhYmxlU3R5bGUpOworCQkJLy8gLS0tLS0KKworCQkJLy8gdGFibGUgaGVhZGVyCisJCQlSb3dIYW5kbGUgdGFibGVoZWFkZXIgPSAoUm93SGFuZGxlKSB0YWJsZS5nZXRIZWFkZXIoKS5nZXQoMCk7CisJCQkvLyB0YWJsZSBkZXRhaWwKKwkJCVJvd0hhbmRsZSB0YWJsZWRldGFpbCA9IChSb3dIYW5kbGUpIHRhYmxlLmdldERldGFpbCgpLmdldCgwKTsKKwkJCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGNvbHMubGVuZ3RoOyBjb2wrKykgeworCQkJCS8vIGNlbGxzdHlsaW5nIGhlYWRlcgorCQkJCVNoYXJlZFN0eWxlSGFuZGxlIGNlbGxIZWFkZXJTdHlsZSA9IGRlc2lnbkZhY3RvcnkKKwkJCQkJCS5uZXdTdHlsZSgiY2VsbEhlYWRlclN0eWxlIik7CisJCQkJZGVzaWduSGFuZGxlLmdldFN0eWxlcygpLmFkZChjZWxsSGVhZGVyU3R5bGUpOworCQkJCWNlbGxIZWFkZXJTdHlsZQorCQkJCQkJLnNldEJvcmRlclRvcFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJY2VsbEhlYWRlclN0eWxlCisJCQkJCQkuc2V0Qm9yZGVyTGVmdFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJY2VsbEhlYWRlclN0eWxlCisJCQkJCQkuc2V0Qm9yZGVyUmlnaHRTdHlsZShEZXNpZ25DaG9pY2VDb25zdGFudHMuTElORV9TVFlMRV9HUk9PVkUpOworCQkJCWNlbGxIZWFkZXJTdHlsZQorCQkJCQkJLnNldEJvcmRlckJvdHRvbVN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJCisJCQkJLy8gY2VsbHN0eWxpbmcgZGV0YWlsCisJCQkJU2hhcmVkU3R5bGVIYW5kbGUgY2VsbERldGFpbFN0eWxlID0gZGVzaWduRmFjdG9yeQorCQkJCQkJLm5ld1N0eWxlKCJjZWxsRGV0YWlsU3R5bGUiKTsKKwkJCQlkZXNpZ25IYW5kbGUuZ2V0U3R5bGVzKCkuYWRkKGNlbGxEZXRhaWxTdHlsZSk7CisJCQkJY2VsbERldGFpbFN0eWxlCisJCQkJLnNldEJvcmRlclRvcFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJY2VsbERldGFpbFN0eWxlCisJCQkJLnNldEJvcmRlckxlZnRTdHlsZShEZXNpZ25DaG9pY2VDb25zdGFudHMuTElORV9TVFlMRV9HUk9PVkUpOworCQkJCWNlbGxEZXRhaWxTdHlsZQorCQkJCS5zZXRCb3JkZXJSaWdodFN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJY2VsbERldGFpbFN0eWxlCisJCQkJLnNldEJvcmRlckJvdHRvbVN0eWxlKERlc2lnbkNob2ljZUNvbnN0YW50cy5MSU5FX1NUWUxFX0dST09WRSk7CisJCQkJY2VsbERldGFpbFN0eWxlLnNldEZvbnRXZWlnaHQoRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkZPTlRfV0VJR0hUX0JPTEQpOworCQkJCWNlbGxEZXRhaWxTdHlsZS5zZXRGb250U3R5bGUoRGVzaWduQ2hvaWNlQ29uc3RhbnRzLkZPTlRfU1RZTEVfSVRBTElDKTsKKwkJCQkvLyAtLS0tCisKKwkJCQlMYWJlbEhhbmRsZSBsYWJlbDsKKwkJCQlDZWxsSGFuZGxlIGNlbGw7CisJCQkJZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcmVzdWx0LnNpemUoKTsgcm93KyspIHsKKwkJCQkJLy8gdGFibGVIZWFkZXIgY29udGVudAorCQkJCQlpZiAocm93ID09IEhFQURFUl9ST1cpIHsKKwkJCQkJCWxhYmVsID0gZGVzaWduRmFjdG9yeS5uZXdMYWJlbCgidGJsSGVhZGVyXyIgKyBjb2wpOworCQkJCQkJY2VsbCA9IChDZWxsSGFuZGxlKSB0YWJsZWhlYWRlci5nZXRDZWxscygpLmdldChjb2wpOworCQkJCQkJY2VsbC5zZXRTdHlsZShjZWxsSGVhZGVyU3R5bGUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gdGFibGVEZXRhaWwgY29udGVudAorCQkJCQkJY2VsbCA9IChDZWxsSGFuZGxlKSB0YWJsZWRldGFpbC5nZXRDZWxscygpLmdldChjb2wpOworCQkJCQkJUm93T3BlcmF0aW9uUGFyYW1ldGVycyByb3dQYXJtID0gbmV3IFJvd09wZXJhdGlvblBhcmFtZXRlcnMoCisJCQkJCQkJCTIsIC0xLCByb3cpOworCQkJCQkJdGFibGUuaW5zZXJ0Um93KHJvd1Bhcm0pOworCQkJCQkJbGFiZWwgPSBkZXNpZ25GYWN0b3J5Lm5ld0xhYmVsKCJ0YmxDZWxsXyIgKyBjb2wgKyAiXyIKKwkJCQkJCQkJKyByb3cpOworCQkJCQkJY2VsbC5zZXRTdHlsZShjZWxsRGV0YWlsU3R5bGUpOworLy8JCQkJCQlkZXNpZ25GYWN0b3J5Lm5ldworCQkJCQl9CisJCQkJCU15Q2VsbCByZXN1bHRDZWxsID0gcmVzdWx0LmdldChyb3cpLmdldChjb2wpOworCQkJCQlsYWJlbC5zZXRUZXh0KHJlc3VsdENlbGwuZ2V0VmFsdWUoKSk7CisJCQkJCWNlbGwuZ2V0Q29udGVudCgpLmFkZChsYWJlbCk7CisJCQkJfQorCQkJfQorCQkJZGVzaWduSGFuZGxlLmdldEJvZHkoKS5hZGQodGFibGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9mb3JtYXR0aW5nL1JlcG9ydERTTEZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2Zvcm1hdHRpbmcvUmVwb3J0RFNMRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YWVmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9mb3JtYXR0aW5nL1JlcG9ydERTTEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmZvcm1hdHRpbmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy54dGV4dC5HZW5lcmljRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFic3RyYWN0UnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5HcmFtbWFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkdyYW1tYXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LlBhcnNlclJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkZvcm1hdHRpbmdDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VydmljZXMuWHR5cGVHcmFtbWFyQWNjZXNzOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgY3VzdG9tIGZvcm1hdHRpbmcgZGVzY3JpcHRpb24uCisgKiAKKyAqIHNlZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2Zvcm1hdHRpbmcKKyAqIG9uIGhvdyBhbmQgd2hlbiB0byB1c2UgaXQKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyIHsKKyAgQEluamVjdAorICBwcml2YXRlIFh0eXBlR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworICAKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRm9ybWF0dGluZyhmaW5hbCBGb3JtYXR0aW5nQ29uZmlnIGMpIHsKKyAgICBmaW5hbCBHZW5lcmljRm9ybWF0dGVyIGdlbmVyaWNGb3JtYXR0ZXIgPSBuZXcgR2VuZXJpY0Zvcm1hdHRlcigpOworICAgIEdyYW1tYXIgX2dyYW1tYXIgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIEFic3RyYWN0UnVsZSBfZmluZFJ1bGVGb3JOYW1lID0gR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKF9ncmFtbWFyLCAiUmVwb3J0SW1wb3J0Iik7CisgICAgUGFyc2VyUnVsZSBpbXBvcnREZWYgPSAoKFBhcnNlclJ1bGUpIF9maW5kUnVsZUZvck5hbWUpOworICAgIEdyYW1tYXIgX2dyYW1tYXJfMSA9IHRoaXMuZ3JhbW1hci5nZXRHcmFtbWFyKCk7CisgICAgQWJzdHJhY3RSdWxlIF9maW5kUnVsZUZvck5hbWVfMSA9IEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShfZ3JhbW1hcl8xLCAiRm9udEZhbWlseSIpOworICAgIFBhcnNlclJ1bGUgZm9udERlZiA9ICgoUGFyc2VyUnVsZSkgX2ZpbmRSdWxlRm9yTmFtZV8xKTsKKyAgICBHcmFtbWFyIF9ncmFtbWFyXzIgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIEFic3RyYWN0UnVsZSBfZmluZFJ1bGVGb3JOYW1lXzIgPSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoX2dyYW1tYXJfMiwgIlRhYmxlQmFzZUFnZ3JlZ2F0aW9uIik7CisgICAgUGFyc2VyUnVsZSBhZ2dEZWYgPSAoKFBhcnNlclJ1bGUpIF9maW5kUnVsZUZvck5hbWVfMik7CisgICAgRm9ybWF0dGluZ0NvbmZpZyBfY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTsKKyAgICBGb3JtYXR0aW5nQ29uZmlnLkxpbmV3cmFwTG9jYXRvciBfc2V0TGluZXdyYXAgPSBfY29uZmlnLnNldExpbmV3cmFwKDEsIDEsIDIpOworICAgIF9zZXRMaW5ld3JhcC5hZnRlcihpbXBvcnREZWYpOworICAgIEdyYW1tYXIgX2dyYW1tYXJfMyA9IHRoaXMuZ3JhbW1hci5nZXRHcmFtbWFyKCk7CisgICAgZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKGMsIF9ncmFtbWFyXzMsICJQYWdlVGVtcGxhdGUiKTsKKyAgICBHcmFtbWFyIF9ncmFtbWFyXzQgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyhjLCBfZ3JhbW1hcl80LCAiU29tZUZvcm1hdHMiKTsKKyAgICBHcmFtbWFyIF9ncmFtbWFyXzUgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyhjLCBfZ3JhbW1hcl81LCAiQ29sb3JzIik7CisgICAgR3JhbW1hciBfZ3JhbW1hcl82ID0gdGhpcy5ncmFtbWFyLmdldEdyYW1tYXIoKTsKKyAgICBnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoYywgX2dyYW1tYXJfNiwgIkZvbnRzIik7CisgICAgR3JhbW1hciBfZ3JhbW1hcl83ID0gdGhpcy5ncmFtbWFyLmdldEdyYW1tYXIoKTsKKyAgICBnZW5lcmljRm9ybWF0dGVyLmZvcm1hdEZpcnN0TGV2ZWxCbG9ja3MoYywgX2dyYW1tYXJfNywgIk1lZGlhcyIpOworICAgIEdyYW1tYXIgX2dyYW1tYXJfOCA9IHRoaXMuZ3JhbW1hci5nZXRHcmFtbWFyKCk7CisgICAgZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKGMsIF9ncmFtbWFyXzgsICJTdHlsZXMiKTsKKyAgICBHcmFtbWFyIF9ncmFtbWFyXzkgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyhjLCBfZ3JhbW1hcl85LCAiUmVwb3J0Iik7CisgICAgRm9ybWF0dGluZ0NvbmZpZyBfY29uZmlnXzEgPSB0aGlzLmdldENvbmZpZygpOworICAgIEZvcm1hdHRpbmdDb25maWcuTm9MaW5ld3JhcExvY2F0b3IgX3NldE5vTGluZXdyYXAgPSBfY29uZmlnXzEuc2V0Tm9MaW5ld3JhcCgpOworICAgIF9zZXROb0xpbmV3cmFwLmJlZm9yZShmb250RGVmKTsKKyAgICBGb3JtYXR0aW5nQ29uZmlnIF9jb25maWdfMiA9IHRoaXMuZ2V0Q29uZmlnKCk7CisgICAgRm9ybWF0dGluZ0NvbmZpZy5Ob0xpbmV3cmFwTG9jYXRvciBfc2V0Tm9MaW5ld3JhcF8xID0gX2NvbmZpZ18yLnNldE5vTGluZXdyYXAoKTsKKyAgICBfc2V0Tm9MaW5ld3JhcF8xLmJlZm9yZShhZ2dEZWYpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZ2VuZXJpY0Zvcm1hdHRpbmcoYywgdGhpcy5ncmFtbWFyLCB0aGlzLmdyYW1tYXJBY2Nlc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1JlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2NjODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL2p2bW1vZGVsL1JlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIuamF2YQpAQCAtMCwwICsxLDY4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLkNvbnRhaW5lcjsKK2ltcG9ydCBjb20udmFhZGluLnVpLlZlcnRpY2FsTGF5b3V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuY29udGV4dHMuSUVjbGlwc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuc2VydmljZXMuZXZlbnRzLklFdmVudEJyb2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLklQcmVzZW50YXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MVHlwZWRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZXZlbnRicm9rZXIuRXZlbnRCcm9rZXJNc2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQuSURhdGFNYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnJlcG9ydC5JUmVwb3J0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkudGhlbWVzLklUaGVtZVJlc291cmNlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmNvbnN0YW50cy5HZW5lcmF0b3JDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hY3Rpb24uQWN0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5BY3Rpb25Ub29sYmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuanZtbW9kZWwuRGF0YW1hcnREU0xKdm1Nb2RlbEluZmVycmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlbmRlcmluZ0VudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25GaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnblRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkFic3RyYWN0UmVwb3J0QmVhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uQmFzZVJlcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUFubm90YXRpb25SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUNvbnN0cnVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1EZWNsYXJlZFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1Gb3JtYWxQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUdlbmVyaWNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVmlzaWJpbGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuUXVhbGlmaWVkTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb21waWxlci5vdXRwdXQuSVRyZWVBcHBlbmRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkFic3RyYWN0TW9kZWxJbmZlcnJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5JSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtVHlwZXNCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuU3RyaW5nRXh0ZW5zaW9uczsKKworLyoqCisgKiA8cD5JbmZlcnMgYSBKVk0gbW9kZWwgZnJvbSB0aGUgc291cmNlIG1vZGVsLjwvcD4KKyAqIAorICogPHA+VGhlIEpWTSBtb2RlbCBzaG91bGQgY29udGFpbiBhbGwgZWxlbWVudHMgdGhhdCB3b3VsZCBhcHBlYXIgaW4gdGhlIEphdmEgY29kZQorICogd2hpY2ggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBtb2RlbC4gT3RoZXIgbW9kZWxzIGxpbmsgYWdhaW5zdCB0aGUgSlZNIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzb3VyY2UgbW9kZWwuPC9wPgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEluZmVycmVyIHsKKyAgLyoqCisgICAqIGNvbnZlbmllbmNlIEFQSSB0byBidWlsZCBhbmQgaW5pdGlhbGl6ZSBKVk0gdHlwZXMgYW5kIHRoZWlyIG1lbWJlcnMuCisgICAqLworICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBKdm1UeXBlc0J1aWxkZXIgX2p2bVR5cGVzQnVpbGRlcjsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIElRdWFsaWZpZWROYW1lUHJvdmlkZXIgX2lRdWFsaWZpZWROYW1lUHJvdmlkZXI7CisgIAorICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgX2RhdGFtYXJ0RFNMSnZtTW9kZWxJbmZlcnJlcjsKKyAgCisgIHByb3RlY3RlZCB2b2lkIF9pbmZlcihmaW5hbCBSZXBvcnRQYWNrYWdlIHBja2csIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgZmluYWwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKyAgICBFTGlzdDxSZXBvcnQ+IF9yZXBvcnRzID0gcGNrZy5nZXRSZXBvcnRzKCk7CisgICAgZmluYWwgQ29uc3VtZXI8UmVwb3J0PiBfZnVuY3Rpb24gPSBuZXcgQ29uc3VtZXI8UmVwb3J0PigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBSZXBvcnQgcmVwb3J0KSB7CisgICAgICAgIFF1YWxpZmllZE5hbWUgX2Z1bGx5UXVhbGlmaWVkTmFtZSA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5faVF1YWxpZmllZE5hbWVQcm92aWRlci5nZXRGdWxseVF1YWxpZmllZE5hbWUocmVwb3J0KTsKKyAgICAgICAgU3RyaW5nIF9wbHVzID0gKF9mdWxseVF1YWxpZmllZE5hbWUgKyAiUmVwb3J0Iik7CisgICAgICAgIEp2bUdlbmVyaWNUeXBlIGNscyA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvQ2xhc3MocmVwb3J0LCBfcGx1cyk7CisgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtR2VuZXJpY1R5cGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPEp2bUdlbmVyaWNUeXBlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1HZW5lcmljVHlwZSBpdCkgeworICAgICAgICAgICAgRUxpc3Q8SnZtVHlwZVJlZmVyZW5jZT4gX3N1cGVyVHlwZXMgPSBpdC5nZXRTdXBlclR5cGVzKCk7CisgICAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEJhc2VSZXBvcnQuY2xhc3MpOworICAgICAgICAgICAgX3N1cGVyVHlwZXMuYWRkKF90eXBlUmVmKTsKKyAgICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldERvY3VtZW50YXRpb24oaXQsIEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OKTsKKyAgICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy50b0NvbnN0cnVjdG9yKGl0LCByZXBvcnQpOworICAgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLnRvT3BlcmF0aW9ucyhpdCwgcGNrZywgcmVwb3J0KTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGFjY2VwdG9yLjxKdm1HZW5lcmljVHlwZT5hY2NlcHQoY2xzLCBfZnVuY3Rpb24pOworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuYWRkUmVwb3J0QmVhbihjbHMsIHBja2csIHJlcG9ydCwgYWNjZXB0b3IpOworICAgICAgfQorICAgIH07CisgICAgX3JlcG9ydHMuZm9yRWFjaChfZnVuY3Rpb24pOworICB9CisgIAorICBwdWJsaWMgdm9pZCBhZGRSZXBvcnRCZWFuKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBSZXBvcnRQYWNrYWdlIHBja2csIGZpbmFsIFJlcG9ydCByZXBvcnQsIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEp2bUdlbmVyaWNUeXBlIGJlYW5DbHMgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9DbGFzcyhyZXBvcnQsICJCZWFuIik7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtR2VuZXJpY1R5cGU+b3BlcmF0b3JfYWRkKF9tZW1iZXJzLCBiZWFuQ2xzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUdlbmVyaWNUeXBlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxKdm1HZW5lcmljVHlwZT4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1HZW5lcmljVHlwZSBpdCkgeworICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfc3VwZXJUeXBlcyA9IGl0LmdldFN1cGVyVHlwZXMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihBYnN0cmFjdFJlcG9ydEJlYW4uY2xhc3MpOworICAgICAgICBfc3VwZXJUeXBlcy5hZGQoX3R5cGVSZWYpOworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXREb2N1bWVudGF0aW9uKGl0LCBHZW5lcmF0b3JDb25zdGFudHMuR0VORVJBVEVEX0NMQVNTRVNfRE9DVU1FTlRBVElPTik7CisgICAgICAgIGl0LnNldFN0YXRpYyh0cnVlKTsKKyAgICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVycyA9IGl0LmdldE1lbWJlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEJhc2VSZXBvcnQuY2xhc3MpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUk9URUNURUQpOworICAgICAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZS5jbGFzcyk7CisgICAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gbmV3ICIpOworICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgX2Z1bGx5UXVhbGlmaWVkTmFtZSA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5faVF1YWxpZmllZE5hbWVQcm92aWRlci5nZXRGdWxseVF1YWxpZmllZE5hbWUocmVwb3J0KTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2Z1bGx5UXVhbGlmaWVkTmFtZSwgIiIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiUmVwb3J0KG51bGwsbnVsbCxudWxsKTsiKTsKKyAgICAgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiY3JlYXRlUmVwb3J0IiwgX3R5cGVSZWZfMSwgX2Z1bmN0aW9uKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIF9tZXRob2QpOworICAgICAgfQorICAgIH07CisgICAgYWNjZXB0b3IuPEp2bUdlbmVyaWNUeXBlPmFjY2VwdChiZWFuQ2xzLCBfZnVuY3Rpb24pOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0b0NvbnN0cnVjdG9yKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBSZXBvcnQgcmVwb3J0KSB7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtQ29uc3RydWN0b3I+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPEp2bUNvbnN0cnVjdG9yPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUNvbnN0cnVjdG9yIGl0KSB7CisgICAgICAgIFN0cmluZyBfZG9jdW1lbnRhdGlvbiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLmdldERvY3VtZW50YXRpb24ocmVwb3J0KTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0RG9jdW1lbnRhdGlvbihpdCwgX2RvY3VtZW50YXRpb24pOworICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoSW5qZWN0LmNsYXNzKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihyZXBvcnQsICJwYXJlbnQiLCBfdHlwZVJlZik7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVyc18xID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSUVjbGlwc2VDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXJfMSA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKHJlcG9ydCwgImNvbnRleHQiLCBfdHlwZVJlZl8xKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnNfMSwgX3BhcmFtZXRlcl8xKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVyc18yID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzIgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoTUFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXJfMiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKHJlcG9ydCwgImFwcCIsIF90eXBlUmVmXzIpOworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRm9ybWFsUGFyYW1ldGVyPm9wZXJhdG9yX2FkZChfcGFyYW1ldGVyc18yLCBfcGFyYW1ldGVyXzIpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJzdXBlcihwYXJlbnQsY29udGV4dCxhcHApOyIpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1Db25zdHJ1Y3RvciBfY29uc3RydWN0b3IgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9Db25zdHJ1Y3RvcihyZXBvcnQsIF9mdW5jdGlvbik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Db25zdHJ1Y3Rvcj5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIF9jb25zdHJ1Y3Rvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRvT3BlcmF0aW9ucyhmaW5hbCBKdm1EZWNsYXJlZFR5cGUgdHlwZSwgZmluYWwgUmVwb3J0UGFja2FnZSBwY2tnLCBmaW5hbCBSZXBvcnQgcmVwb3J0KSB7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElFdmVudEJyb2tlci5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1GaWVsZD4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdC5jbGFzcyk7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bUZpZWxkIF9maWVsZCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKHJlcG9ydCwgImV2ZW50QnJva2VyIiwgX3R5cGVSZWYsIF9mdW5jdGlvbik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIF9maWVsZCk7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJUHJlc2VudGF0aW9uRW5naW5lLmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUZpZWxkPiBfZnVuY3Rpb25fMSA9IG5ldyBQcm9jZWR1cmUxPEp2bUZpZWxkPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUZpZWxkIGl0KSB7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QuY2xhc3MpOworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMSA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKHJlcG9ydCwgInJlbmRlcmluZ0VuZ2luZSIsIF90eXBlUmVmXzEsIF9mdW5jdGlvbl8xKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xLCBfZmllbGRfMSk7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18yID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8yID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJVGhlbWVSZXNvdXJjZVNlcnZpY2UuY2xhc3MpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtRmllbGQ+IF9mdW5jdGlvbl8yID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdC5jbGFzcyk7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bUZpZWxkIF9maWVsZF8yID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQocmVwb3J0LCAidGhlbWVSZXNvdXJjZVNlcnZpY2UiLCBfdHlwZVJlZl8yLCBfZnVuY3Rpb25fMik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMiwgX2ZpZWxkXzIpOworICAgIEFjdGlvblRvb2xiYXIgX3Rvb2xiYXIgPSByZXBvcnQuZ2V0VG9vbGJhcigpOworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfdG9vbGJhciwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBBY3Rpb25Ub29sYmFyIF90b29sYmFyXzEgPSByZXBvcnQuZ2V0VG9vbGJhcigpOworICAgICAgRU9iamVjdCBfZUNvbnRhaW5lciA9IF90b29sYmFyXzEuZUNvbnRhaW5lcigpOworICAgICAgUXVhbGlmaWVkTmFtZSBfZnVsbHlRdWFsaWZpZWROYW1lID0gdGhpcy5faVF1YWxpZmllZE5hbWVQcm92aWRlci5nZXRGdWxseVF1YWxpZmllZE5hbWUoKChBY3Rpb25QYWNrYWdlKSBfZUNvbnRhaW5lcikpOworICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gX2Z1bGx5UXVhbGlmaWVkTmFtZS50b1N0cmluZygpOworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18zID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChwYWNrYWdlTmFtZSwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuIik7CisgICAgICBBY3Rpb25Ub29sYmFyIF90b29sYmFyXzIgPSByZXBvcnQuZ2V0VG9vbGJhcigpOworICAgICAgU3RyaW5nIF9uYW1lID0gX3Rvb2xiYXJfMi5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX3N0cmluZyA9IF9uYW1lLnRvU3RyaW5nKCk7CisgICAgICBTdHJpbmcgX2ZpcnN0VXBwZXIgPSBTdHJpbmdFeHRlbnNpb25zLnRvRmlyc3RVcHBlcihfc3RyaW5nKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfZmlyc3RVcHBlciwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJBY3Rpb24iKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoX2J1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICBKdm1GaWVsZCBfZmllbGRfMyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKHJlcG9ydCwgInRvb2xiYXJDbGFzcyIsIF90eXBlUmVmXzMpOworICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMywgX2ZpZWxkXzMpOworICAgIH0KKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzQgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzQgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQuVFlQRSk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8zID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihyZXBvcnQsICJwYXJlbnQiLCBfdHlwZVJlZik7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfY3JlYXRlVmlldyA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5jcmVhdGVWaWV3KHJlcG9ydCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2NyZWF0ZVZpZXcsICIiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2QgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiY3JlYXRlVmlldyIsIF90eXBlUmVmXzQsIF9mdW5jdGlvbl8zKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfNCwgX21ldGhvZCk7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc181ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl81ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkLlRZUEUpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fNCA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRCk7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihQb3N0Q29uc3RydWN0LmNsYXNzKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFNldDxMRW50aXR5PiBlbnRpdGVzID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLmZpbmRSZXF1ZXN0ZWRFbnRpdGllcyhyZXBvcnQpOworICAgICAgICAgICAgZm9yIChmaW5hbCBMRW50aXR5IGVudGl0eSA6IGVudGl0ZXMpIHsKKyAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZXZlbnRCcm9rZXIuc3Vic2NyaWJlKEV2ZW50QnJva2VyTXNnLlJFRlJFU0hfVklFVytcIiIpOworICAgICAgICAgICAgICBFT2JqZWN0IF9lQ29udGFpbmVyID0gZW50aXR5LmVDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9uYW1lID0gKChMVHlwZWRQYWNrYWdlKSBfZUNvbnRhaW5lcikuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWVfMSA9IGVudGl0eS5nZXROYW1lKCk7CisgICAgICAgICAgICAgIFN0cmluZyBfZW50aXR5SWRNb2RpZmllZENhdGVnb3J5ID0gRXZlbnRCcm9rZXJNc2cuZ2V0RW50aXR5SWRNb2RpZmllZENhdGVnb3J5KF9uYW1lLCBfbmFtZV8xKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9lbnRpdHlJZE1vZGlmaWVkQ2F0ZWdvcnksICIiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiwgZk1vZGlmaWVkRW50aXR5SWRzTGlzdGVuZXIpOyIpOworICAgICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAic3Vic2NyaWJlIiwgX3R5cGVSZWZfNSwgX2Z1bmN0aW9uXzQpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVyc181LCBfbWV0aG9kXzEpOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfNiA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoVm9pZC5UWVBFKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzUgPSBuZXcgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtT3BlcmF0aW9uIGl0KSB7CisgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUk9URUNURUQpOworICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoUHJlRGVzdHJveS5jbGFzcyk7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUoZk1vZGlmaWVkRW50aXR5SWRzTGlzdGVuZXIpOyIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8yID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKHJlcG9ydCwgInVuc3Vic2NyaWJlIiwgX3R5cGVSZWZfNiwgX2Z1bmN0aW9uXzUpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVyc182LCBfbWV0aG9kXzIpOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfNyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSVJlcG9ydFByb3ZpZGVyLlJlbmRlcmluZy5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl82ID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KEp2bVZpc2liaWxpdHkuUFJPVEVDVEVEKTsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKE92ZXJyaWRlLmNsYXNzKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFJlbmRlcmluZ0VudW0gX3JlbmRlcmluZyA9IHJlcG9ydC5nZXRSZW5kZXJpbmcoKTsKKyAgICAgICAgICAgIGlmIChfcmVuZGVyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgc3dpdGNoIChfcmVuZGVyaW5nKSB7CisgICAgICAgICAgICAgICAgY2FzZSBIVE1MOgorICAgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBSZW5kZXJpbmcuSFRNTF9TVFJFQU07Iik7CisgICAgICAgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQREY6CisgICAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoInJldHVybiBSZW5kZXJpbmcuUERGX1NUUkVBTTsiKTsKKyAgICAgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcl8xKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzMgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiZ2V0UmVuZGVyaW5nQXMiLCBfdHlwZVJlZl83LCBfZnVuY3Rpb25fNik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzcsIF9tZXRob2RfMyk7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc184ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl84ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcuY2xhc3MpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fNyA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRCk7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZS5jbGFzcyk7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIFwiIik7CisgICAgICAgICAgICBTdHJpbmcgX25hbWUgPSByZXBvcnQuZ2V0TmFtZSgpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiIik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiOyIpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF80ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKHJlcG9ydCwgImdldFJlcG9ydE5hbWUiLCBfdHlwZVJlZl84LCBfZnVuY3Rpb25fNyk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzgsIF9tZXRob2RfNCk7CisgICAgYm9vbGVhbiBfb3IgPSBmYWxzZTsKKyAgICBTdHJpbmcgX2V4dGVybmFsQ3NzVVJJQnVuZGxlID0gcGNrZy5nZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpOworICAgIGJvb2xlYW4gX25vdEVxdWFsc18xID0gKCFPYmplY3RzLmVxdWFsKF9leHRlcm5hbENzc1VSSUJ1bmRsZSwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzXzEpIHsKKyAgICAgIF9vciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMSA9IHJlcG9ydC5nZXRFeHRlcm5hbENzc1VSSUJ1bmRsZSgpOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzXzIgPSAoIU9iamVjdHMuZXF1YWwoX2V4dGVybmFsQ3NzVVJJQnVuZGxlXzEsIG51bGwpKTsKKyAgICAgIF9vciA9IF9ub3RFcXVhbHNfMjsKKyAgICB9CisgICAgaWYgKF9vcikgeworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc185ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzkgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZy5jbGFzcyk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzggPSBuZXcgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+KCkgeworICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KEp2bVZpc2liaWxpdHkuUFJPVEVDVEVEKTsKKyAgICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZS5jbGFzcyk7CisgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICAgIFN0cmluZyBfZXh0ZXJuYWxDc3NVUklCdW5kbGUgPSByZXBvcnQuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKTsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9leHRlcm5hbENzc1VSSUJ1bmRsZSwgbnVsbCkpOworICAgICAgICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIFwiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9leHRlcm5hbENzc1VSSUJ1bmRsZV8xID0gcmVwb3J0LmdldEV4dGVybmFsQ3NzVVJJQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9leHRlcm5hbENzc1VSSUJ1bmRsZV8xLCAiIik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIjsiKTsKKyAgICAgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoInJldHVybiBcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMiA9IHBja2cuZ2V0RXh0ZXJuYWxDc3NVUklCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZChfZXh0ZXJuYWxDc3NVUklCdW5kbGVfMiwgIiIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcIjsiKTsKKyAgICAgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXJfMSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBKdm1PcGVyYXRpb24gX21ldGhvZF81ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKHJlcG9ydCwgImdldEV4dGVybmFsQ3NzVVJJQnVuZGxlIiwgX3R5cGVSZWZfOSwgX2Z1bmN0aW9uXzgpOworICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzksIF9tZXRob2RfNSk7CisgICAgfQorICAgIGJvb2xlYW4gX29yXzEgPSBmYWxzZTsKKyAgICBTdHJpbmcgX2V4dGVybmFsQ3NzVVJJID0gcGNrZy5nZXRFeHRlcm5hbENzc1VSSSgpOworICAgIGJvb2xlYW4gX25vdEVxdWFsc18zID0gKCFPYmplY3RzLmVxdWFsKF9leHRlcm5hbENzc1VSSSwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzXzMpIHsKKyAgICAgIF9vcl8xID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIF9leHRlcm5hbENzc1VSSV8xID0gcmVwb3J0LmdldEV4dGVybmFsQ3NzVVJJKCk7CisgICAgICBib29sZWFuIF9ub3RFcXVhbHNfNCA9ICghT2JqZWN0cy5lcXVhbChfZXh0ZXJuYWxDc3NVUklfMSwgbnVsbCkpOworICAgICAgX29yXzEgPSBfbm90RXF1YWxzXzQ7CisgICAgfQorICAgIGlmIChfb3JfMSkgeworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xMCA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fOSA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUk9URUNURUQpOworICAgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKE92ZXJyaWRlLmNsYXNzKTsKKyAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgICAgU3RyaW5nIF9leHRlcm5hbENzc1VSSSA9IHJlcG9ydC5nZXRFeHRlcm5hbENzc1VSSSgpOworICAgICAgICAgICAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoX2V4dGVybmFsQ3NzVVJJLCBudWxsKSk7CisgICAgICAgICAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gXCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2V4dGVybmFsQ3NzVVJJXzEgPSByZXBvcnQuZ2V0RXh0ZXJuYWxDc3NVUkkoKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2V4dGVybmFsQ3NzVVJJXzEsICIiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiOyIpOworICAgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgicmV0dXJuIFwiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9leHRlcm5hbENzc1VSSV8yID0gcGNrZy5nZXRFeHRlcm5hbENzc1VSSSgpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9leHRlcm5hbENzc1VSSV8yLCAiIik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlwiOyIpOworICAgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcl8xKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzYgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiZ2V0RXh0ZXJuYWxDc3NVUkkiLCBfdHlwZVJlZl8xMCwgX2Z1bmN0aW9uXzkpOworICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzEwLCBfbWV0aG9kXzYpOworICAgIH0KKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzExID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMSA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSURhdGFNYXJ0LmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzEwID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gcmVwb3J0LmdldERhdGFtYXJ0UmVmKCk7CisgICAgICAgIFN0cmluZyBfZG9jdW1lbnRhdGlvbiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLmdldERvY3VtZW50YXRpb24oX2RhdGFtYXJ0UmVmKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0RG9jdW1lbnRhdGlvbihpdCwgX2RvY3VtZW50YXRpb24pOworICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KEp2bVZpc2liaWxpdHkuUFJPVEVDVEVEKTsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKE92ZXJyaWRlLmNsYXNzKTsKKyAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gbmV3ICIpOworICAgICAgICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZiA9IHJlcG9ydC5nZXREYXRhbWFydFJlZigpOworICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBfZnVsbHlRdWFsaWZpZWROYW1lID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9pUXVhbGlmaWVkTmFtZVByb3ZpZGVyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShfZGF0YW1hcnRSZWYpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9mdWxseVF1YWxpZmllZE5hbWUsICIiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiRGF0YW1hcnQoKTsiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2RfNyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChyZXBvcnQsICJnZXREYXRhbWFydEluc3RhbmNlIiwgX3R5cGVSZWZfMTEsIF9mdW5jdGlvbl8xMCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzExLCBfbWV0aG9kXzcpOworICAgIFJlcG9ydERlc2lnbiBfZGVzaWduID0gcmVwb3J0LmdldERlc2lnbigpOworICAgIGlmICgoX2Rlc2lnbiBpbnN0YW5jZW9mIFJlcG9ydERlc2lnbkZpbGUpKSB7CisgICAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzEyID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEyID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcuY2xhc3MpOworICAgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8xMSA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICAgIFJlcG9ydERlc2lnbiBfZGVzaWduID0gcmVwb3J0LmdldERlc2lnbigpOworICAgICAgICAgIFN0cmluZyBfZG9jdW1lbnRhdGlvbiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLmdldERvY3VtZW50YXRpb24oX2Rlc2lnbik7CisgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0RG9jdW1lbnRhdGlvbihpdCwgX2RvY3VtZW50YXRpb24pOworICAgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUk9URUNURUQpOworICAgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKE92ZXJyaWRlLmNsYXNzKTsKKyAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIFwiIik7CisgICAgICAgICAgICAgIFJlcG9ydERlc2lnbiBfZGVzaWduID0gcmVwb3J0LmdldERlc2lnbigpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFJlcG9ydERlc2lnbkZpbGUpIF9kZXNpZ24pLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiIik7CisgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXCI7Iik7CisgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgICB9CisgICAgICB9OworICAgICAgSnZtT3BlcmF0aW9uIF9tZXRob2RfOCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChyZXBvcnQsICJnZXRSZXBvcnREZXNpZ25GaWxlbmFtZSIsIF90eXBlUmVmXzEyLCBfZnVuY3Rpb25fMTEpOworICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzEyLCBfbWV0aG9kXzgpOworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xMyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYodm9pZC5jbGFzcyk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzEyID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtT3BlcmF0aW9uIGl0KSB7CisgICAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRCk7CisgICAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUuY2xhc3MpOworICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzkgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiYnVpbGRSZXBvcnQiLCBfdHlwZVJlZl8xMywgX2Z1bmN0aW9uXzEyKTsKKyAgICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xMywgX21ldGhvZF85KTsKKyAgICB9IGVsc2UgeworICAgICAgUmVwb3J0RGVzaWduIF9kZXNpZ25fMSA9IHJlcG9ydC5nZXREZXNpZ24oKTsKKyAgICAgIGlmICgoX2Rlc2lnbl8xIGluc3RhbmNlb2YgUmVwb3J0RGVzaWduVGVtcGxhdGUpKSB7CisgICAgICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTQgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xNCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8xMyA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtT3BlcmF0aW9uIGl0KSB7CisgICAgICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KEp2bVZpc2liaWxpdHkuUFJPVEVDVEVEKTsKKyAgICAgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUuY2xhc3MpOworICAgICAgICAgICAgUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIG51bGw7Iik7CisgICAgICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8xMCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChyZXBvcnQsICJnZXRSZXBvcnREZXNpZ25GaWxlbmFtZSIsIF90eXBlUmVmXzE0LCBfZnVuY3Rpb25fMTMpOworICAgICAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMTQsIF9tZXRob2RfMTApOworICAgICAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzE1ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTUgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKHZvaWQuY2xhc3MpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzE0ID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgICAgIFJlcG9ydERlc2lnbiBfZGVzaWduID0gcmVwb3J0LmdldERlc2lnbigpOworICAgICAgICAgICAgU3RyaW5nIF9kb2N1bWVudGF0aW9uID0gUmVwb3J0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuZ2V0RG9jdW1lbnRhdGlvbihfZGVzaWduKTsKKyAgICAgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldERvY3VtZW50YXRpb24oaXQsIF9kb2N1bWVudGF0aW9uKTsKKyAgICAgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUk9URUNURUQpOworICAgICAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZS5jbGFzcyk7CisgICAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgSnZtT3BlcmF0aW9uIF9tZXRob2RfMTEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QocmVwb3J0LCAiYnVpbGRSZXBvcnQiLCBfdHlwZVJlZl8xNSwgX2Z1bmN0aW9uXzE0KTsKKyAgICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzE1LCBfbWV0aG9kXzExKTsKKyAgICAgIH0KKyAgICB9CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xNiA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQuVFlQRSk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8xNSA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVycyA9IGl0LmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihDb250YWluZXIuRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihyZXBvcnQsICJmaWx0ZXIiLCBfdHlwZVJlZik7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gISEhIG5vIGRhdGFtYXJ0LCBlbnRpdHkgYW5kIERUTyBmb3VuZCBmb3IgdGhlIHJlcG9ydCAtLT4gbm90aGluZyBjYW4gYmUgZG9uZSBpbiBoZXJlICEhISIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8xMiA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChyZXBvcnQsICJhcHBseUJlYW5GaWx0ZXIiLCBfdHlwZVJlZl8xNiwgX2Z1bmN0aW9uXzE1KTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMTYsIF9tZXRob2RfMTIpOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTcgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzE3ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkLlRZUEUpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fMTYgPSBuZXcgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtT3BlcmF0aW9uIGl0KSB7CisgICAgICAgIEVMaXN0PEp2bUZvcm1hbFBhcmFtZXRlcj4gX3BhcmFtZXRlcnMgPSBpdC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBSZXBvcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihyZXBvcnQsICJkdG8iLCBfdHlwZVJlZik7CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gISEhIG5vIGRhdGFtYXJ0LCBlbnRpdHkgYW5kIERUTyBmb3VuZCBmb3IgdGhlIHJlcG9ydCAtLT4gbm90aGluZyBjYW4gYmUgZG9uZSBpbiBoZXJlICEhISIpOworICAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFJlcG9ydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8xMyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChyZXBvcnQsICJhcHBseUJlYW5EdG8iLCBfdHlwZVJlZl8xNywgX2Z1bmN0aW9uXzE2KTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMTcsIF9tZXRob2RfMTMpOworICB9CisgIAorICAvKioKKyAgICogZ2V0IGEgc2V0IG9mIGFsbCBlbnRpdGllcyB1c2VkIGluIHRoZSBnaXZlbiByZXBvcnQKKyAgICovCisgIHB1YmxpYyBTZXQ8TEVudGl0eT4gZmluZFJlcXVlc3RlZEVudGl0aWVzKGZpbmFsIFJlcG9ydCByZXBvcnQpIHsKKyAgICBIYXNoU2V0PExFbnRpdHk+IGVudGl0aWVzID0gbmV3IEhhc2hTZXQ8TEVudGl0eT4oKTsKKyAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gcmVwb3J0LmdldERhdGFtYXJ0UmVmKCk7CisgICAgU2V0PExFbnRpdHk+IF9maW5kQWxsRW50aXRpZXMgPSB0aGlzLl9kYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIuZmluZEFsbEVudGl0aWVzKF9kYXRhbWFydFJlZik7CisgICAgZW50aXRpZXMuYWRkQWxsKF9maW5kQWxsRW50aXRpZXMpOworICAgIHJldHVybiBlbnRpdGllczsKKyAgfQorICAKKyAgcHVibGljIENoYXJTZXF1ZW5jZSBjcmVhdGVWaWV3KGZpbmFsIFJlcG9ydCByZXBvcnQpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImZXb3Jrc2V0XHQ9IG5ldyBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0KCk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIHsKKyAgICAgIEFjdGlvblRvb2xiYXIgX3Rvb2xiYXIgPSByZXBvcnQuZ2V0VG9vbGJhcigpOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF90b29sYmFyLCBudWxsKSk7CisgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICBfYnVpbGRlci5hcHBlbmQoInRvb2xiYXJDbGFzcyA9IG5ldyAiKTsKKyAgICAgICAgQWN0aW9uVG9vbGJhciBfdG9vbGJhcl8xID0gcmVwb3J0LmdldFRvb2xiYXIoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gX3Rvb2xiYXJfMS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfc3RyaW5nID0gX25hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIF9maXJzdFVwcGVyID0gU3RyaW5nRXh0ZW5zaW9ucy50b0ZpcnN0VXBwZXIoX3N0cmluZyk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChfZmlyc3RVcHBlciwgIiIpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIkFjdGlvbihVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsiKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ0b29sYmFyQ2xhc3MuY3JlYXRlVG9vbGJhcihnZXRDb250ZXh0KCksIHJlbmRlcmluZ0VuZ2luZSwgdGhlbWVSZXNvdXJjZVNlcnZpY2UpOyIpOworICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiYWRkUERGRG93bmxvYWQodG9vbGJhckNsYXNzKTsiKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgfQorICAgIH0KKyAgICBfYnVpbGRlci5hcHBlbmQoImNyZWF0ZUZpbHRlcigpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICByZXR1cm4gX2J1aWxkZXI7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGluZmVyKGZpbmFsIEVPYmplY3QgcGNrZywgZmluYWwgSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yIGFjY2VwdG9yLCBmaW5hbCBib29sZWFuIGlzUHJlSW5kZXhpbmdQaGFzZSkgeworICAgIGlmIChwY2tnIGluc3RhbmNlb2YgUmVwb3J0UGFja2FnZSkgeworICAgICAgX2luZmVyKChSZXBvcnRQYWNrYWdlKXBja2csIGFjY2VwdG9yLCBpc1ByZUluZGV4aW5nUGhhc2UpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocGNrZyAhPSBudWxsKSB7CisgICAgICBfaW5mZXIocGNrZywgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICBBcnJheXMuPE9iamVjdD5hc0xpc3QocGNrZywgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0TW9kZWxHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9qdm1tb2RlbC9SZXBvcnRNb2RlbEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmZjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvanZtbW9kZWwvUmVwb3J0TW9kZWxHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDg1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuanZtbW9kZWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuVUxvY2FsZTsKK2ltcG9ydCBjb20udmFhZGluLmRhdGEuQ29udGFpbmVyOworaW1wb3J0IGNvbS52YWFkaW4uc2VydmVyLlNpemVhYmxlOworaW1wb3J0IGNvbS52YWFkaW4uc2VydmVyLlN0cmVhbVJlc291cmNlOworaW1wb3J0IGNvbS52YWFkaW4udWkuQWJzdHJhY3RDb21wb25lbnQ7CitpbXBvcnQgY29tLnZhYWRpbi51aS5Ccm93c2VyRnJhbWU7CitpbXBvcnQgY29tLnZhYWRpbi51aS5CdXR0b247CitpbXBvcnQgY29tLnZhYWRpbi51aS5Ib3Jpem9udGFsTGF5b3V0OworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLkRpbWVuc2lvbkhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLklEZXNpZ25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLk9kYURhdGFTZXRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLk9kYURhdGFTb3VyY2VIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLlJlcG9ydERlc2lnbkhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2Vzc2lvbkhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2ltcGxlTWFzdGVyUGFnZUhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU2xvdEhhbmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuU3RydWN0dXJlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29tbWFuZC5Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5jb21tYW5kLkN1c3RvbU1zZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5hcGkuY29yZS5JTW9kdWxlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuQ2FjaGVkTWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuQ29tcHV0ZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuYXBpLmVsZW1lbnRzLnN0cnVjdHVyZXMuT2RhUmVzdWx0U2V0Q29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLmFwaS5tZXRhZGF0YS5EaW1lbnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC5tb2RlbC5jb3JlLkRlc2lnbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuY29yZS5Nb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmlydC5yZXBvcnQubW9kZWwuZWxlbWVudHMuaW50ZXJmYWNlcy5JRGF0YVNldE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmJpcnQucmVwb3J0Lm1vZGVsLndyaXRlci5Nb2R1bGVXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5lbnRpdHkueHRleHQuZXh0ZW5zaW9ucy5OYW1pbmdFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlci5FdmVudEJyb2tlck1zZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5kYXRhbWFydC5JRGF0YU1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkucmVwb3J0LklSZXBvcnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmVudGl0eWhlbHBlci5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5WaWV3TGF5b3V0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFjdGlvbi5jb21tb24uSVRvb2xiYXJBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy5nZW5lcmF0b3IuQmFzaWNEc2xHZW5lcmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0Q3ViZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnROYXZpZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0Um9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuanZtbW9kZWwuRGF0YW1hcnREU0xKdm1Nb2RlbEluZmVycmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bi5EU0xPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkkxOE5LZXlHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkkxOE5Nb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5BdXRvVGV4dEVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRGF0YW1hcnRUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlRGV0YWlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkRhdGFtYXJ0VGFibGVHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5EYXRhbWFydFRhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5HcmlkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRDZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLkdyaWRSb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuSW1hZ2VTaXplRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5JbWFnZVNvdXJjZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuTWVkaWE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuT3JpZW50YXRpb25FbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VEZXRhaWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUGFnZUZvb3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlSGVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlBhZ2VTaXplRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5QYWdlVGVtcGxhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuUmVwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlJlcG9ydERlc2lnbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnREZXNpZ25UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5SZXBvcnRQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN0eWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlN1YlRpdGxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVGl0bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuVW5pdEVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkJhc2VSZXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkJpcnRFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLkRhdGFUeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uT2RhQ29ublByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZS5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuY29tbW9uLmF0dHJpYnV0ZS5XaWR0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5Cb2R5SXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5DZWxsSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5Db250YWluZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLkdyaWRJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmNvbW1vbi5pdGVtLkltYWdlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5QYWdlRm9vdGVySXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5jb21tb24uaXRlbS5QYWdlSGVhZGVySXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5qdm1tb2RlbC5SZXBvcnRHZW5lcmF0b3JXb3JrU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLmp2bW1vZGVsLlV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bURlY2xhcmVkVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuSUZpbGVTeXN0ZW1BY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLlF1YWxpZmllZE5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIuR2VuZXJhdG9yQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIub3V0cHV0LlRyZWVBcHBlbmRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db252ZXJzaW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5JdGVyYXRvckV4dGVuc2lvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLlByb2NlZHVyZXMuUHJvY2VkdXJlMTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBSZXBvcnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEkxOE5Nb2RlbEdlbmVyYXRvciB7CisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIElRdWFsaWZpZWROYW1lUHJvdmlkZXIgX2lRdWFsaWZpZWROYW1lUHJvdmlkZXI7CisgIAorICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgZGF0YW1hcnRJbmZlcnJlcjsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIE5hbWluZ0V4dGVuc2lvbnMgX25hbWluZ0V4dGVuc2lvbnM7CisgIAorICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBCYXNpY0RzbEdlbmVyYXRvclV0aWxzIF9iYXNpY0RzbEdlbmVyYXRvclV0aWxzOworICAKKyAgQEluamVjdAorICBARXh0ZW5zaW9uCisgIHByaXZhdGUgRGF0YVR5cGUgZHRUeXBlOworICAKKyAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGRlc2lnbkVuZ2luZSA9IG51bGw7CisgIAorICBwdWJsaWMgdm9pZCBkb0dlbmVyYXRlKGZpbmFsIFJlc291cmNlIGlucHV0LCBmaW5hbCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoQmFzZVJlcG9ydC5DQVBUSU9OX0kxOE5LRVlfU0FWRV9QREYsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoQmFzZVJlcG9ydC5DQVBUSU9OX0kxOE5LRVlfUFJJTlRfUERGLCAiIik7CisgICAgdGhpcy5hZGRUcmFuc2xhdGFibGVzKF9idWlsZGVyLnRvU3RyaW5nKCkpOworICAgIHN1cGVyLmRvR2VuZXJhdGUoaW5wdXQsIGZzYSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIF9pbnRlcm5hbERvR2VuZXJhdGUoZmluYWwgUmVwb3J0TW9kZWwgb3JnTW9kZWwsIGZpbmFsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeworICAgIElEZXNpZ25FbmdpbmUgX2NyZWF0ZURlc2lnbkVuZ2luZSA9IEJpcnRFbmdpbmUuY3JlYXRlRGVzaWduRW5naW5lKCk7CisgICAgUmVwb3J0TW9kZWxHZW5lcmF0b3IuZGVzaWduRW5naW5lID0gX2NyZWF0ZURlc2lnbkVuZ2luZTsKKyAgICBFTGlzdDxSZXBvcnRQYWNrYWdlPiBfcGNrZyA9IG9yZ01vZGVsLmdldFBja2coKTsKKyAgICBmb3IgKGZpbmFsIFJlcG9ydFBhY2thZ2UgcGtnIDogX3Bja2cpIHsKKyAgICAgIEVMaXN0PFJlcG9ydD4gX3JlcG9ydHMgPSBwa2cuZ2V0UmVwb3J0cygpOworICAgICAgZm9yIChmaW5hbCBSZXBvcnQgcmVwb3J0IDogX3JlcG9ydHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVwb3J0RmlsZShwa2csIHJlcG9ydCwgZnNhKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICAgICAgaWYgKF90IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pX3Q7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLnNuZWFreVRocm93KF90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVJlcG9ydEZpbGUoZmluYWwgUmVwb3J0UGFja2FnZSBwY2tnLCBmaW5hbCBSZXBvcnQgcmVwb3J0LCBmaW5hbCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgICBSZXBvcnREZXNpZ24gX2Rlc2lnbiA9IHJlcG9ydC5nZXREZXNpZ24oKTsKKyAgICBpZiAoKF9kZXNpZ24gaW5zdGFuY2VvZiBSZXBvcnREZXNpZ25UZW1wbGF0ZSkpIHsKKyAgICAgIHRoaXMuZ2VuZXJhdGVSZXBvcnRSb2xlRmlsZShwY2tnLCByZXBvcnQsIG51bGwsIGZzYSk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gcmVwb3J0LmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBFTGlzdDxEYXRhbWFydFJvbGU+IF9yb2xlcyA9IF9kYXRhbWFydFJlZi5nZXRSb2xlcygpOworICAgICAgZm9yIChmaW5hbCBEYXRhbWFydFJvbGUgcm9sZSA6IF9yb2xlcykgeworICAgICAgICB0aGlzLmdlbmVyYXRlUmVwb3J0Um9sZUZpbGUocGNrZywgcmVwb3J0LCByb2xlLCBmc2EpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUmVwb3J0Um9sZUZpbGUoZmluYWwgUmVwb3J0UGFja2FnZSBwY2tnLCBmaW5hbCBSZXBvcnQgcmVwb3J0LCBmaW5hbCBEYXRhbWFydFJvbGUgcm9sZSwgZmluYWwgSUZpbGVTeXN0ZW1BY2Nlc3MgZnNhKSB7CisgICAgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0ID0gbmV3IFJlcG9ydEdlbmVyYXRvcldvcmtTZXQoKTsKKyAgICB3b3JrU2V0LmdlbmVyYXRvciA9IHRoaXM7CisgICAgd29ya1NldC5yZXBvcnQgPSByZXBvcnQ7CisgICAgd29ya1NldC5yb2xlID0gcm9sZTsKKyAgICBSZXBvcnREZXNpZ24gX2Rlc2lnbiA9IHJlcG9ydC5nZXREZXNpZ24oKTsKKyAgICBSZXBvcnREZXNpZ25UZW1wbGF0ZSB0ZW1wbGF0ZSA9ICgoUmVwb3J0RGVzaWduVGVtcGxhdGUpIF9kZXNpZ24pOworICAgIFF1YWxpZmllZE5hbWUgX2Z1bGx5UXVhbGlmaWVkTmFtZSA9IHRoaXMuX2lRdWFsaWZpZWROYW1lUHJvdmlkZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKHBja2cpOworICAgIFN0cmluZyBwY2tnTmFtZSA9IF9mdWxseVF1YWxpZmllZE5hbWUudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgcGNrZ05hbWVQYXRoID0gcGNrZ05hbWUucmVwbGFjZUFsbCgiXFwuIiwgIi8iKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBTdHJpbmcgX25hbWUgPSByZXBvcnQuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgIHsKKyAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChyb2xlLCBudWxsKSk7CisgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICBSb2xlIF9hc3NpZ25lZFJvbGUgPSByb2xlLmdldEFzc2lnbmVkUm9sZSgpOworICAgICAgICBTdHJpbmcgX25hbWVfMSA9IF9hc3NpZ25lZFJvbGUuZ2V0TmFtZSgpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSwgIiIpOworICAgICAgfQorICAgIH0KKyAgICBfYnVpbGRlci5hcHBlbmQoIi5ycHRkZXNpZ24iKTsKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBfYnVpbGRlci50b1N0cmluZygpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMS5hcHBlbmQocGNrZ05hbWVQYXRoLCAiIik7CisgICAgX2J1aWxkZXJfMS5hcHBlbmQoIi8iKTsKKyAgICBfYnVpbGRlcl8xLmFwcGVuZChmaWxlbmFtZSwgIiIpOworICAgIFN0cmluZyBmdWxscGF0aCA9IF9idWlsZGVyXzEudG9TdHJpbmcoKTsKKyAgICBMb2NhbGUgX2RlZmF1bHQgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOworICAgIFVMb2NhbGUgX2ZvckxvY2FsZSA9IFVMb2NhbGUuZm9yTG9jYWxlKF9kZWZhdWx0KTsKKyAgICBTZXNzaW9uSGFuZGxlIHNlc3Npb24gPSAoKElEZXNpZ25FbmdpbmUpIFJlcG9ydE1vZGVsR2VuZXJhdG9yLmRlc2lnbkVuZ2luZSkubmV3U2Vzc2lvbkhhbmRsZShfZm9yTG9jYWxlKTsKKyAgICBSZXBvcnREZXNpZ25IYW5kbGUgX2NyZWF0ZURlc2lnbiA9IHNlc3Npb24uY3JlYXRlRGVzaWduKCk7CisgICAgd29ya1NldC5kZXNpZ24gPSBfY3JlYXRlRGVzaWduOworICAgIEVsZW1lbnRGYWN0b3J5IF9lbGVtZW50RmFjdG9yeSA9IHdvcmtTZXQuZGVzaWduLmdldEVsZW1lbnRGYWN0b3J5KCk7CisgICAgd29ya1NldC5mYWN0b3J5ID0gX2VsZW1lbnRGYWN0b3J5OworICAgIHdvcmtTZXQuZGVzaWduLnNldEluY2x1ZGVSZXNvdXJjZSgiaTE4bi9JMThOIik7CisgICAgTWVkaWEgX21lZGlhID0gcmVwb3J0LmdldE1lZGlhKCk7CisgICAgd29ya1NldC5zZXRSZXF1ZXN0ZWRNZWRpYShfbWVkaWEpOworICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWYgPSByZXBvcnQuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICBQYWdlVGVtcGxhdGUgX3BhZ2VUZW1wbGF0ZSA9IHJlcG9ydC5nZXRQYWdlVGVtcGxhdGUoKTsKKyAgICBQYWdlSGVhZGVyIF9oZWFkZXIgPSB0ZW1wbGF0ZS5nZXRIZWFkZXIoKTsKKyAgICBQYWdlRm9vdGVyIF9mb290ZXIgPSB0ZW1wbGF0ZS5nZXRGb290ZXIoKTsKKyAgICB0aGlzLmdlbmVyYXRlTWFzdGVyUGFnZShfZGF0YW1hcnRSZWYsIHdvcmtTZXQsIF9wYWdlVGVtcGxhdGUsIF9oZWFkZXIsIF9mb290ZXIpOworICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWZfMSA9IHJlcG9ydC5nZXREYXRhbWFydFJlZigpOworICAgIHRoaXMuYWRkRGF0YW1hcnRTb3VyY2VBbmRTZXQoX2RhdGFtYXJ0UmVmXzEsIHdvcmtTZXQsIG51bGwsIG51bGwpOworICAgIEJvZHlJdGVtIGJvZHkgPSBuZXcgQm9keUl0ZW0od29ya1NldCk7CisgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8yID0gcmVwb3J0LmdldERhdGFtYXJ0UmVmKCk7CisgICAgUGFnZURldGFpbCBfZGV0YWlsID0gdGVtcGxhdGUuZ2V0RGV0YWlsKCk7CisgICAgRUxpc3Q8RWxlbWVudD4gX2VsZW1lbnRzID0gX2RldGFpbC5nZXRFbGVtZW50cygpOworICAgIHRoaXMuZ2VuZXJhdGVJdGVtcyhfZGF0YW1hcnRSZWZfMiwgd29ya1NldCwgYm9keSwgKChFbGVtZW50W10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoX2VsZW1lbnRzLCBFbGVtZW50LmNsYXNzKSkpOworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIHRyeSB7CisgICAgICBNb2R1bGUgX21vZHVsZSA9IHdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpOworICAgICAgX21vZHVsZS5wcmVwYXJlVG9TYXZlKCk7CisgICAgICBNb2R1bGUgX21vZHVsZV8xID0gd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCk7CisgICAgICBNb2R1bGVXcml0ZXIgX3dyaXRlciA9IF9tb2R1bGVfMS5nZXRXcml0ZXIoKTsKKyAgICAgIF93cml0ZXIud3JpdGUoYmFvcyk7CisgICAgICBNb2R1bGUgX21vZHVsZV8yID0gd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCk7CisgICAgICBfbW9kdWxlXzIub25TYXZlKCk7CisgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICBpZiAoX3QgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKV90OworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gX2J5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYmFvcyA9IF9ieXRlQXJyYXlPdXRwdXRTdHJlYW07CisgICAgICAgIFByaW50U3RyZWFtIF9wcmludFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShiYW9zKTsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoX3ByaW50U3RyZWFtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuc25lYWt5VGhyb3coX3QpOworICAgICAgfQorICAgIH0KKyAgICBTdHJpbmcgX3N0cmluZyA9IGJhb3MudG9TdHJpbmcoKTsKKyAgICBmc2EuZ2VuZXJhdGVGaWxlKGZ1bGxwYXRoLCBEU0xPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXIuREVGQVVMVF9SRVBPUlRfT1VUUFVULCBfc3RyaW5nKTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWFzdGVyUGFnZShmaW5hbCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIGZpbmFsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgZmluYWwgUGFnZVRlbXBsYXRlIHBhZ2VUZW1wbGF0ZSwgZmluYWwgUGFnZUhlYWRlciBwYWdlSGVhZGVyLCBmaW5hbCBQYWdlRm9vdGVyIHBhZ2VGb290ZXIpIHsKKyAgICB0cnkgeworICAgICAgUGFnZUhlYWRlciBoZWFkZXIgPSBwYWdlSGVhZGVyOworICAgICAgUGFnZUZvb3RlciBmb290ZXIgPSBwYWdlRm9vdGVyOworICAgICAgYm9vbGVhbiBfZXF1YWxzID0gT2JqZWN0cy5lcXVhbChoZWFkZXIsIG51bGwpOworICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgUGFnZUhlYWRlciBfaGVhZGVyID0gcGFnZVRlbXBsYXRlLmdldEhlYWRlcigpOworICAgICAgICBoZWFkZXIgPSBfaGVhZGVyOworICAgICAgfQorICAgICAgYm9vbGVhbiBfZXF1YWxzXzEgPSBPYmplY3RzLmVxdWFsKGZvb3RlciwgbnVsbCk7CisgICAgICBpZiAoX2VxdWFsc18xKSB7CisgICAgICAgIFBhZ2VGb290ZXIgX2Zvb3RlciA9IHBhZ2VUZW1wbGF0ZS5nZXRGb290ZXIoKTsKKyAgICAgICAgZm9vdGVyID0gX2Zvb3RlcjsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBfbmFtZSA9IHBhZ2VUZW1wbGF0ZS5nZXROYW1lKCk7CisgICAgICBTaW1wbGVNYXN0ZXJQYWdlSGFuZGxlIG1hc3RlclBhZ2UgPSB3b3JrU2V0LmZhY3RvcnkubmV3U2ltcGxlTWFzdGVyUGFnZShfbmFtZSk7CisgICAgICBQYWdlU2l6ZUVudW0gX3NpemUgPSBwYWdlVGVtcGxhdGUuZ2V0U2l6ZSgpOworICAgICAgU3RyaW5nIF9uYW1lXzEgPSBfc2l6ZS5uYW1lKCk7CisgICAgICBTdHJpbmcgX2xvd2VyQ2FzZSA9IF9uYW1lXzEudG9Mb3dlckNhc2UoKTsKKyAgICAgIG1hc3RlclBhZ2Uuc2V0UGFnZVR5cGUoX2xvd2VyQ2FzZSk7CisgICAgICBPcmllbnRhdGlvbkVudW0gX29yaWVudGF0aW9uID0gcGFnZVRlbXBsYXRlLmdldE9yaWVudGF0aW9uKCk7CisgICAgICBTdHJpbmcgX25hbWVfMiA9IF9vcmllbnRhdGlvbi5uYW1lKCk7CisgICAgICBTdHJpbmcgX2xvd2VyQ2FzZV8xID0gX25hbWVfMi50b0xvd2VyQ2FzZSgpOworICAgICAgbWFzdGVyUGFnZS5zZXRPcmllbnRhdGlvbihfbG93ZXJDYXNlXzEpOworICAgICAgRGltZW5zaW9uSGFuZGxlIF90b3BNYXJnaW4gPSBtYXN0ZXJQYWdlLmdldFRvcE1hcmdpbigpOworICAgICAgZG91YmxlIF90b3BNYXJnaW5WYWx1ZSA9IHBhZ2VUZW1wbGF0ZS5nZXRUb3BNYXJnaW5WYWx1ZSgpOworICAgICAgVW5pdEVudW0gX3RvcE1hcmdpblVuaXQgPSBwYWdlVGVtcGxhdGUuZ2V0VG9wTWFyZ2luVW5pdCgpOworICAgICAgU3RyaW5nIF9uYW1lXzMgPSBfdG9wTWFyZ2luVW5pdC5uYW1lKCk7CisgICAgICBTdHJpbmcgX2xvd2VyQ2FzZV8yID0gX25hbWVfMy50b0xvd2VyQ2FzZSgpOworICAgICAgRGltZW5zaW9uVmFsdWUgX2RpbWVuc2lvblZhbHVlID0gbmV3IERpbWVuc2lvblZhbHVlKF90b3BNYXJnaW5WYWx1ZSwgX2xvd2VyQ2FzZV8yKTsKKyAgICAgIF90b3BNYXJnaW4uc2V0VmFsdWUoX2RpbWVuc2lvblZhbHVlKTsKKyAgICAgIERpbWVuc2lvbkhhbmRsZSBfbGVmdE1hcmdpbiA9IG1hc3RlclBhZ2UuZ2V0TGVmdE1hcmdpbigpOworICAgICAgZG91YmxlIF9sZWZ0TWFyZ2luVmFsdWUgPSBwYWdlVGVtcGxhdGUuZ2V0TGVmdE1hcmdpblZhbHVlKCk7CisgICAgICBVbml0RW51bSBfbGVmdE1hcmdpblVuaXQgPSBwYWdlVGVtcGxhdGUuZ2V0TGVmdE1hcmdpblVuaXQoKTsKKyAgICAgIFN0cmluZyBfbmFtZV80ID0gX2xlZnRNYXJnaW5Vbml0Lm5hbWUoKTsKKyAgICAgIFN0cmluZyBfbG93ZXJDYXNlXzMgPSBfbmFtZV80LnRvTG93ZXJDYXNlKCk7CisgICAgICBEaW1lbnNpb25WYWx1ZSBfZGltZW5zaW9uVmFsdWVfMSA9IG5ldyBEaW1lbnNpb25WYWx1ZShfbGVmdE1hcmdpblZhbHVlLCBfbG93ZXJDYXNlXzMpOworICAgICAgX2xlZnRNYXJnaW4uc2V0VmFsdWUoX2RpbWVuc2lvblZhbHVlXzEpOworICAgICAgRGltZW5zaW9uSGFuZGxlIF9ib3R0b21NYXJnaW4gPSBtYXN0ZXJQYWdlLmdldEJvdHRvbU1hcmdpbigpOworICAgICAgZG91YmxlIF9ib3R0b21NYXJnaW5WYWx1ZSA9IHBhZ2VUZW1wbGF0ZS5nZXRCb3R0b21NYXJnaW5WYWx1ZSgpOworICAgICAgVW5pdEVudW0gX2JvdHRvbU1hcmdpblVuaXQgPSBwYWdlVGVtcGxhdGUuZ2V0Qm90dG9tTWFyZ2luVW5pdCgpOworICAgICAgU3RyaW5nIF9uYW1lXzUgPSBfYm90dG9tTWFyZ2luVW5pdC5uYW1lKCk7CisgICAgICBTdHJpbmcgX2xvd2VyQ2FzZV80ID0gX25hbWVfNS50b0xvd2VyQ2FzZSgpOworICAgICAgRGltZW5zaW9uVmFsdWUgX2RpbWVuc2lvblZhbHVlXzIgPSBuZXcgRGltZW5zaW9uVmFsdWUoX2JvdHRvbU1hcmdpblZhbHVlLCBfbG93ZXJDYXNlXzQpOworICAgICAgX2JvdHRvbU1hcmdpbi5zZXRWYWx1ZShfZGltZW5zaW9uVmFsdWVfMik7CisgICAgICBEaW1lbnNpb25IYW5kbGUgX3JpZ2h0TWFyZ2luID0gbWFzdGVyUGFnZS5nZXRSaWdodE1hcmdpbigpOworICAgICAgZG91YmxlIF9yaWdodE1hcmdpblZhbHVlID0gcGFnZVRlbXBsYXRlLmdldFJpZ2h0TWFyZ2luVmFsdWUoKTsKKyAgICAgIFVuaXRFbnVtIF9yaWdodE1hcmdpblVuaXQgPSBwYWdlVGVtcGxhdGUuZ2V0UmlnaHRNYXJnaW5Vbml0KCk7CisgICAgICBTdHJpbmcgX25hbWVfNiA9IF9yaWdodE1hcmdpblVuaXQubmFtZSgpOworICAgICAgU3RyaW5nIF9sb3dlckNhc2VfNSA9IF9uYW1lXzYudG9Mb3dlckNhc2UoKTsKKyAgICAgIERpbWVuc2lvblZhbHVlIF9kaW1lbnNpb25WYWx1ZV8zID0gbmV3IERpbWVuc2lvblZhbHVlKF9yaWdodE1hcmdpblZhbHVlLCBfbG93ZXJDYXNlXzUpOworICAgICAgX3JpZ2h0TWFyZ2luLnNldFZhbHVlKF9kaW1lbnNpb25WYWx1ZV8zKTsKKyAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChoZWFkZXIsIG51bGwpKTsKKyAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgIGJvb2xlYW4gX2lzU2hvd09uRmlyc3QgPSBoZWFkZXIuaXNTaG93T25GaXJzdCgpOworICAgICAgICBtYXN0ZXJQYWdlLnNldFNob3dIZWFkZXJPbkZpcnN0KF9pc1Nob3dPbkZpcnN0KTsKKyAgICAgICAgRGltZW5zaW9uSGFuZGxlIF9oZWFkZXJIZWlnaHQgPSBtYXN0ZXJQYWdlLmdldEhlYWRlckhlaWdodCgpOworICAgICAgICBkb3VibGUgX2hlaWdodFZhbHVlID0gaGVhZGVyLmdldEhlaWdodFZhbHVlKCk7CisgICAgICAgIFVuaXRFbnVtIF9oZWlnaHRVbml0ID0gaGVhZGVyLmdldEhlaWdodFVuaXQoKTsKKyAgICAgICAgU3RyaW5nIF9uYW1lXzcgPSBfaGVpZ2h0VW5pdC5uYW1lKCk7CisgICAgICAgIFN0cmluZyBfbG93ZXJDYXNlXzYgPSBfbmFtZV83LnRvTG93ZXJDYXNlKCk7CisgICAgICAgIERpbWVuc2lvblZhbHVlIF9kaW1lbnNpb25WYWx1ZV80ID0gbmV3IERpbWVuc2lvblZhbHVlKF9oZWlnaHRWYWx1ZSwgX2xvd2VyQ2FzZV82KTsKKyAgICAgICAgX2hlYWRlckhlaWdodC5zZXRWYWx1ZShfZGltZW5zaW9uVmFsdWVfNCk7CisgICAgICAgIFBhZ2VIZWFkZXJJdGVtIF9wYWdlSGVhZGVySXRlbSA9IG5ldyBQYWdlSGVhZGVySXRlbSh3b3JrU2V0LCBtYXN0ZXJQYWdlKTsKKyAgICAgICAgRUxpc3Q8RWxlbWVudD4gX2VsZW1lbnRzID0gaGVhZGVyLmdldEVsZW1lbnRzKCk7CisgICAgICAgIHRoaXMuZ2VuZXJhdGVJdGVtcyhkYXRhbWFydCwgd29ya1NldCwgX3BhZ2VIZWFkZXJJdGVtLCAoKEVsZW1lbnRbXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShfZWxlbWVudHMsIEVsZW1lbnQuY2xhc3MpKSk7CisgICAgICB9CisgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMSA9ICghT2JqZWN0cy5lcXVhbChmb290ZXIsIG51bGwpKTsKKyAgICAgIGlmIChfbm90RXF1YWxzXzEpIHsKKyAgICAgICAgYm9vbGVhbiBfaXNTaG93T25MYXN0ID0gZm9vdGVyLmlzU2hvd09uTGFzdCgpOworICAgICAgICBtYXN0ZXJQYWdlLnNldFNob3dGb290ZXJPbkxhc3QoX2lzU2hvd09uTGFzdCk7CisgICAgICAgIERpbWVuc2lvbkhhbmRsZSBfZm9vdGVySGVpZ2h0ID0gbWFzdGVyUGFnZS5nZXRGb290ZXJIZWlnaHQoKTsKKyAgICAgICAgZG91YmxlIF9oZWlnaHRWYWx1ZV8xID0gZm9vdGVyLmdldEhlaWdodFZhbHVlKCk7CisgICAgICAgIFVuaXRFbnVtIF9oZWlnaHRVbml0XzEgPSBmb290ZXIuZ2V0SGVpZ2h0VW5pdCgpOworICAgICAgICBTdHJpbmcgX25hbWVfOCA9IF9oZWlnaHRVbml0XzEubmFtZSgpOworICAgICAgICBTdHJpbmcgX2xvd2VyQ2FzZV83ID0gX25hbWVfOC50b0xvd2VyQ2FzZSgpOworICAgICAgICBEaW1lbnNpb25WYWx1ZSBfZGltZW5zaW9uVmFsdWVfNSA9IG5ldyBEaW1lbnNpb25WYWx1ZShfaGVpZ2h0VmFsdWVfMSwgX2xvd2VyQ2FzZV83KTsKKyAgICAgICAgX2Zvb3RlckhlaWdodC5zZXRWYWx1ZShfZGltZW5zaW9uVmFsdWVfNSk7CisgICAgICAgIFBhZ2VGb290ZXJJdGVtIF9wYWdlRm9vdGVySXRlbSA9IG5ldyBQYWdlRm9vdGVySXRlbSh3b3JrU2V0LCBtYXN0ZXJQYWdlKTsKKyAgICAgICAgRUxpc3Q8RWxlbWVudD4gX2VsZW1lbnRzXzEgPSBmb290ZXIuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgdGhpcy5nZW5lcmF0ZUl0ZW1zKGRhdGFtYXJ0LCB3b3JrU2V0LCBfcGFnZUZvb3Rlckl0ZW0sICgoRWxlbWVudFtdKUNvbnZlcnNpb25zLnVud3JhcEFycmF5KF9lbGVtZW50c18xLCBFbGVtZW50LmNsYXNzKSkpOworICAgICAgfQorICAgICAgU2xvdEhhbmRsZSBfbWFzdGVyUGFnZXMgPSB3b3JrU2V0LmRlc2lnbi5nZXRNYXN0ZXJQYWdlcygpOworICAgICAgX21hc3RlclBhZ2VzLmFkZChtYXN0ZXJQYWdlKTsKKyAgICB9IGNhdGNoIChUaHJvd2FibGUgX2UpIHsKKyAgICAgIHRocm93IEV4Y2VwdGlvbnMuc25lYWt5VGhyb3coX2UpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZERhdGFtYXJ0U291cmNlQW5kU2V0KGZpbmFsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCwgZmluYWwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBmaW5hbCBTdHJpbmcgYWxpYXMsIGZpbmFsIERhdGFtYXJ0UHJvcGVydHlbXSBoaWRkZW5zKSB7CisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBfZGF0YVNvdXJjZU5hbWUgPSBVdGlsaXRpZXMuZ2V0RGF0YVNvdXJjZU5hbWUoYWxpYXMsIGRhdGFtYXJ0KTsKKyAgICAgIFN0cmluZyBkYXRhU291cmNlTmFtZSA9IF9kYXRhU291cmNlTmFtZS50b1N0cmluZygpOworICAgICAgT2RhRGF0YVNvdXJjZUhhbmRsZSBvZHNvdXJjZWggPSB3b3JrU2V0LmZhY3RvcnkubmV3T2RhRGF0YVNvdXJjZShkYXRhU291cmNlTmFtZSwgQmFzZVJlcG9ydC5EQVRBU09VUkNFX0VYVEVOU0lPTl9JRCk7CisgICAgICBEZXNpZ25FbGVtZW50IF9lbGVtZW50ID0gb2Rzb3VyY2VoLmdldEVsZW1lbnQoKTsKKyAgICAgIE1vZHVsZSBfbW9kdWxlID0gd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCk7CisgICAgICBsb25nIF9uZXh0SUQgPSBfbW9kdWxlLmdldE5leHRJRCgpOworICAgICAgX2VsZW1lbnQuc2V0SUQoX25leHRJRCk7CisgICAgICBNb2R1bGUgX21vZHVsZV8xID0gd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCk7CisgICAgICBEZXNpZ25FbGVtZW50IF9lbGVtZW50XzEgPSBvZHNvdXJjZWguZ2V0RWxlbWVudCgpOworICAgICAgX21vZHVsZV8xLmFkZEVsZW1lbnRJRChfZWxlbWVudF8xKTsKKyAgICAgIE1vZHVsZSBfbW9kdWxlXzIgPSB3b3JrU2V0LmRlc2lnbi5nZXRNb2R1bGUoKTsKKyAgICAgIERlc2lnbkVsZW1lbnQgX2VsZW1lbnRfMiA9IG9kc291cmNlaC5nZXRFbGVtZW50KCk7CisgICAgICBfbW9kdWxlXzIuYWRkKF9lbGVtZW50XzIsIElNb2R1bGVNb2RlbC5EQVRBX1NPVVJDRV9TTE9UKTsKKyAgICAgIFN0cmluZyBfZGF0YVNldE5hbWUgPSBVdGlsaXRpZXMuZ2V0RGF0YVNldE5hbWUoYWxpYXMsIGRhdGFtYXJ0KTsKKyAgICAgIFN0cmluZyBkYXRhU2V0TmFtZSA9IF9kYXRhU2V0TmFtZS50b1N0cmluZygpOworICAgICAgU3RyaW5nIF9jb25jYXQgPSBCYXNlUmVwb3J0LkRBVEFTT1VSQ0VfRVhURU5TSU9OX0lELmNvbmNhdCgiLmRhdGFTZXQiKTsKKyAgICAgIE9kYURhdGFTZXRIYW5kbGUgb2RzZXRoID0gd29ya1NldC5mYWN0b3J5Lm5ld09kYURhdGFTZXQoZGF0YVNldE5hbWUsIF9jb25jYXQpOworICAgICAgd29ya1NldC5kYXRhU2V0cy5wdXQoZGF0YVNldE5hbWUsIG9kc2V0aCk7CisgICAgICBEZXNpZ25FbGVtZW50IF9lbGVtZW50XzMgPSBvZHNldGguZ2V0RWxlbWVudCgpOworICAgICAgTW9kdWxlIF9tb2R1bGVfMyA9IHdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpOworICAgICAgbG9uZyBfbmV4dElEXzEgPSBfbW9kdWxlXzMuZ2V0TmV4dElEKCk7CisgICAgICBfZWxlbWVudF8zLnNldElEKF9uZXh0SURfMSk7CisgICAgICBTdHJpbmcgX2J1bmRsZU5hbWUgPSBVdGlsaXRpZXMuZ2V0QnVuZGxlTmFtZShkYXRhbWFydCk7CisgICAgICBvZHNldGguc2V0UHJvcGVydHkoT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfQlVORExFTkFNRSwgX2J1bmRsZU5hbWUpOworICAgICAgQ2hhclNlcXVlbmNlIF9kYXRhbWFydENsYXNzTmFtZSA9IHRoaXMuZ2V0RGF0YW1hcnRDbGFzc05hbWUoYWxpYXMsIGRhdGFtYXJ0KTsKKyAgICAgIG9kc2V0aC5zZXRQcm9wZXJ0eShPZGFDb25uUHJvcGVydGllcy5EQVRBTUFSVF9DTEFTU05BTUUsIF9kYXRhbWFydENsYXNzTmFtZSk7CisgICAgICBEZXNpZ25FbGVtZW50IF9lbGVtZW50XzQgPSBvZHNvdXJjZWguZ2V0RWxlbWVudCgpOworICAgICAgU3RyaW5nIF9uYW1lID0gX2VsZW1lbnRfNC5nZXROYW1lKCk7CisgICAgICBvZHNldGguc2V0UHJvcGVydHkoT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfREFUQVNPVVJDRSwgX25hbWUpOworICAgICAgb2RzZXRoLnNldFByb3BlcnR5KE9kYUNvbm5Qcm9wZXJ0aWVzLkRBVEFNQVJUX0RBVEFTT1VSQ0VOQU1FLCBkYXRhU291cmNlTmFtZSk7CisgICAgICBvZHNldGguc2V0UHJvcGVydHkoT2RhQ29ublByb3BlcnRpZXMuREFUQU1BUlRfREFUQVNFVE5BTUUsIGRhdGFTZXROYW1lKTsKKyAgICAgIERhdGFtYXJ0U291cmNlIF9zb3VyY2UgPSBkYXRhbWFydC5nZXRTb3VyY2UoKTsKKyAgICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgaWYgKF9zb3VyY2UgaW5zdGFuY2VvZiBEYXRhbWFydEN1YmUpIHsKKyAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgIHRoaXMuYWRkRGF0YW1hcnRDdWJlUmVzdWx0U2V0KHdvcmtTZXQsIG9kc2V0aCwgZGF0YVNldE5hbWUsIGRhdGFtYXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBpZiAoX3NvdXJjZSBpbnN0YW5jZW9mIERhdGFtYXJ0RW50aXR5KSB7CisgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICB0aGlzLmFkZERhdGFtYXJ0RW50aXR5UmVzdWx0U2V0KHdvcmtTZXQsIG9kc2V0aCwgZGF0YVNldE5hbWUsIGRhdGFtYXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICBpZiAoX3NvdXJjZSBpbnN0YW5jZW9mIERhdGFtYXJ0VGFzaykgeworICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEYXRhbWFydFRhc2sgLi4uIHRvZG8iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgTW9kdWxlIF9tb2R1bGVfNCA9IHdvcmtTZXQuZGVzaWduLmdldE1vZHVsZSgpOworICAgICAgRGVzaWduRWxlbWVudCBfZWxlbWVudF81ID0gb2RzZXRoLmdldEVsZW1lbnQoKTsKKyAgICAgIF9tb2R1bGVfNC5hZGRFbGVtZW50SUQoX2VsZW1lbnRfNSk7CisgICAgICBNb2R1bGUgX21vZHVsZV81ID0gd29ya1NldC5kZXNpZ24uZ2V0TW9kdWxlKCk7CisgICAgICBEZXNpZ25FbGVtZW50IF9lbGVtZW50XzYgPSBvZHNldGguZ2V0RWxlbWVudCgpOworICAgICAgX21vZHVsZV81LmFkZChfZWxlbWVudF82LCBJTW9kdWxlTW9kZWwuREFUQV9TRVRfU0xPVCk7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIF9lKSB7CisgICAgICB0aHJvdyBFeGNlcHRpb25zLnNuZWFreVRocm93KF9lKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBhZGREYXRhbWFydEN1YmVSZXN1bHRTZXQoZmluYWwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBmaW5hbCBPZGFEYXRhU2V0SGFuZGxlIG9kc2V0aCwgZmluYWwgU3RyaW5nIGRhdGFTZXROYW1lLCBmaW5hbCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQpIHsKKyAgICB0cnkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEYXRhbWFydEN1YmUgLi4uIHRvZG8iKTsKKyAgICAgIERhdGFtYXJ0U291cmNlIF9zb3VyY2UgPSBkYXRhbWFydC5nZXRTb3VyY2UoKTsKKyAgICAgIERhdGFtYXJ0Q3ViZSBjdWJlID0gKChEYXRhbWFydEN1YmUpIF9zb3VyY2UpOworICAgICAgU3RyaW5nIHNlbGVjdENvbHVtbnMgPSAiIjsKKyAgICAgIENhY2hlZE1ldGFEYXRhIGNtZCA9IG5ldyBDYWNoZWRNZXRhRGF0YSgpOworICAgICAgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4gc2QgPSBuZXcgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4oKTsKKyAgICAgIEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4gY2MgPSBuZXcgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPigpOworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInNlbGVjdCAiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChzZWxlY3RDb2x1bW5zLCAiIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIiBmcm9tICIpOworICAgICAgU3RyaW5nIF9uYW1lID0gZGF0YW1hcnQuZ2V0TmFtZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiIik7CisgICAgICBTdHJpbmcgX3N0cmluZyA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICBvZHNldGguc2V0UHJvcGVydHkoInF1ZXJ5VGV4dCIsIF9zdHJpbmcpOworICAgICAgY21kLnNldFByb3BlcnR5KElEYXRhU2V0TW9kZWwuUkVTVUxUX1NFVF9QUk9QLCBzZCk7CisgICAgICBvZHNldGguc2V0UHJvcGVydHkoSURhdGFTZXRNb2RlbC5DQUNIRURfTUVUQURBVEFfUFJPUCwgY21kKTsKKyAgICAgIERlc2lnbkVsZW1lbnQgX2VsZW1lbnQgPSBvZHNldGguZ2V0RWxlbWVudCgpOworICAgICAgX2VsZW1lbnQuc2V0UHJvcGVydHkoSURhdGFTZXRNb2RlbC5SRVNVTFRfU0VUX1BST1AsIHNkKTsKKyAgICB9IGNhdGNoIChUaHJvd2FibGUgX2UpIHsKKyAgICAgIHRocm93IEV4Y2VwdGlvbnMuc25lYWt5VGhyb3coX2UpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZEFsbERhdGFtYXJ0UHJvcGVydGllcyhmaW5hbCBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtTZXQsIGZpbmFsIEFycmF5TGlzdDxPZGFSZXN1bHRTZXRDb2x1bW4+IHNkLCBmaW5hbCBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+IGNjLCBmaW5hbCBFT2JqZWN0IGNvbnRhaW5lcikgeworICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRGF0YW1hcnRFbnRpdHkpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgRUxpc3Q8RGF0YW1hcnROYXZpZ2F0aW9uPiBfbmF2aWdhdGlvbnMgPSAoKERhdGFtYXJ0RW50aXR5KWNvbnRhaW5lcikuZ2V0TmF2aWdhdGlvbnMoKTsKKyAgICAgICAgZm9yIChmaW5hbCBEYXRhbWFydE5hdmlnYXRpb24gbmF2aWdhdGlvbiA6IF9uYXZpZ2F0aW9ucykgeworICAgICAgICAgIFRyZWVJdGVyYXRvcjxFT2JqZWN0PiBfZUFsbENvbnRlbnRzID0gbmF2aWdhdGlvbi5lQWxsQ29udGVudHMoKTsKKyAgICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPEVPYmplY3Q+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPEVPYmplY3Q+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgRU9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICAgIFJlcG9ydE1vZGVsR2VuZXJhdG9yLnRoaXMuYWRkQWxsRGF0YW1hcnRQcm9wZXJ0aWVzKHdvcmtTZXQsIHNkLCBjYywgZWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBJdGVyYXRvckV4dGVuc2lvbnMuPEVPYmplY3Q+Zm9yRWFjaChfZUFsbENvbnRlbnRzLCBfZnVuY3Rpb24pOworICAgICAgICB9CisgICAgICAgIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IF9wcm9wZXJ0aWVzID0gKChEYXRhbWFydEVudGl0eSljb250YWluZXIpLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNFbXB0eSA9IF9wcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKyAgICAgICAgaWYgKF9pc0VtcHR5KSB7CisgICAgICAgICAgTEVudGl0eSBfZW50aXR5UmVmID0gKChEYXRhbWFydEVudGl0eSljb250YWluZXIpLmdldEVudGl0eVJlZigpOworICAgICAgICAgIExpc3Q8TEVudGl0eUF0dHJpYnV0ZT4gX2FsbEF0dHJpYnV0ZXMgPSBfZW50aXR5UmVmLmdldEFsbEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIExFbnRpdHlBdHRyaWJ1dGUgYXR0cmlidXRlIDogX2FsbEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBfaXNJZCA9IGF0dHJpYnV0ZS5pc0lkKCk7CisgICAgICAgICAgICBib29sZWFuIF9ub3QgPSAoIV9pc0lkKTsKKyAgICAgICAgICAgIGlmICghX25vdCkgeworICAgICAgICAgICAgICBfYW5kID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBib29sZWFuIF9pc1V1aWQgPSBhdHRyaWJ1dGUuaXNVdWlkKCk7CisgICAgICAgICAgICAgIGJvb2xlYW4gX25vdF8xID0gKCFfaXNVdWlkKTsKKyAgICAgICAgICAgICAgX2FuZCA9IF9ub3RfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfYW5kKSB7CisgICAgICAgICAgICAgIExFbnRpdHkgX2VudGl0eVJlZl8xID0gKChEYXRhbWFydEVudGl0eSljb250YWluZXIpLmdldEVudGl0eVJlZigpOworICAgICAgICAgICAgICBTdHJpbmcgX25hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBib29sZWFuIF9pc0F1dGhvcml6ZWQgPSB0aGlzLmRhdGFtYXJ0SW5mZXJyZXIuaXNBdXRob3JpemVkKHdvcmtTZXQucm9sZSwgX2VudGl0eVJlZl8xLCBfbmFtZSk7CisgICAgICAgICAgICAgIGlmIChfaXNBdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hZGREYXRhbWFydFByb3BlcnR5KHdvcmtTZXQsIHNkLCBjYywgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFTGlzdDxEYXRhbWFydFByb3BlcnR5PiBfcHJvcGVydGllc18xID0gKChEYXRhbWFydEVudGl0eSljb250YWluZXIpLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkgOiBfcHJvcGVydGllc18xKSB7CisgICAgICAgICAgICBMRW50aXR5IF9lbnRpdHlSZWZfMiA9ICgoRGF0YW1hcnRFbnRpdHkpY29udGFpbmVyKS5nZXRFbnRpdHlSZWYoKTsKKyAgICAgICAgICAgIExFbnRpdHlBdHRyaWJ1dGUgX3Byb3BlcnR5UmVmID0gcHJvcGVydHkuZ2V0UHJvcGVydHlSZWYoKTsKKyAgICAgICAgICAgIFN0cmluZyBfbmFtZV8xID0gX3Byb3BlcnR5UmVmLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2lzQXV0aG9yaXplZF8xID0gdGhpcy5kYXRhbWFydEluZmVycmVyLmlzQXV0aG9yaXplZCh3b3JrU2V0LnJvbGUsIF9lbnRpdHlSZWZfMiwgX25hbWVfMSk7CisgICAgICAgICAgICBpZiAoX2lzQXV0aG9yaXplZF8xKSB7CisgICAgICAgICAgICAgIHRoaXMuYWRkRGF0YW1hcnRQcm9wZXJ0eSh3b3JrU2V0LCBzZCwgY2MsIHByb3BlcnR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBhZGREYXRhbWFydEVudGl0eVJlc3VsdFNldChmaW5hbCBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtTZXQsIGZpbmFsIE9kYURhdGFTZXRIYW5kbGUgb2RzZXRoLCBmaW5hbCBTdHJpbmcgZGF0YVNldE5hbWUsIGZpbmFsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCkgeworICAgIHRyeSB7CisgICAgICBTdHJpbmcgc2VsZWN0Q29sdW1ucyA9ICIiOworICAgICAgQ2FjaGVkTWV0YURhdGEgY21kID0gbmV3IENhY2hlZE1ldGFEYXRhKCk7CisgICAgICBBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPiBzZCA9IG5ldyBBcnJheUxpc3Q8T2RhUmVzdWx0U2V0Q29sdW1uPigpOworICAgICAgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBjYyA9IG5ldyBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+KCk7CisgICAgICB3b3JrU2V0LmZQb3NpdGlvbiA9IDA7CisgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlID0gZGF0YW1hcnQuZ2V0U291cmNlKCk7CisgICAgICB0aGlzLmFkZEFsbERhdGFtYXJ0UHJvcGVydGllcyh3b3JrU2V0LCBzZCwgY2MsIF9zb3VyY2UpOworICAgICAgd29ya1NldC5wdXRSZXN1bHRTZXRDb2x1bW5zKGRhdGFTZXROYW1lLCBzZCk7CisgICAgICB3b3JrU2V0LnB1dENvbXB1dGVkQ29sdW1ucyhkYXRhU2V0TmFtZSwgY2MpOworICAgICAgZm9yIChmaW5hbCBDb21wdXRlZENvbHVtbiBjYzEgOiBjYykgeworICAgICAgICBib29sZWFuIF9pc0VtcHR5ID0gc2VsZWN0Q29sdW1ucy5pc0VtcHR5KCk7CisgICAgICAgIGlmIChfaXNFbXB0eSkgeworICAgICAgICAgIFN0cmluZyBfbmFtZSA9IGNjMS5nZXROYW1lKCk7CisgICAgICAgICAgc2VsZWN0Q29sdW1ucyA9IF9uYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN0cmluZyBfY29uY2F0ID0gc2VsZWN0Q29sdW1ucy5jb25jYXQoIiwiKTsKKyAgICAgICAgICBTdHJpbmcgX25hbWVfMSA9IGNjMS5nZXROYW1lKCk7CisgICAgICAgICAgU3RyaW5nIF9jb25jYXRfMSA9IF9jb25jYXQuY29uY2F0KF9uYW1lXzEpOworICAgICAgICAgIHNlbGVjdENvbHVtbnMgPSBfY29uY2F0XzE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJzZWxlY3QgIik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoc2VsZWN0Q29sdW1ucywgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIgZnJvbSAiKTsKKyAgICAgIFN0cmluZyBfbmFtZV8yID0gZGF0YW1hcnQuZ2V0TmFtZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIsICIiKTsKKyAgICAgIFN0cmluZyBfc3RyaW5nID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgIG9kc2V0aC5zZXRQcm9wZXJ0eSgicXVlcnlUZXh0IiwgX3N0cmluZyk7CisgICAgICBjbWQuc2V0UHJvcGVydHkoSURhdGFTZXRNb2RlbC5SRVNVTFRfU0VUX1BST1AsIHNkKTsKKyAgICAgIG9kc2V0aC5zZXRQcm9wZXJ0eShJRGF0YVNldE1vZGVsLkNBQ0hFRF9NRVRBREFUQV9QUk9QLCBjbWQpOworICAgICAgRGVzaWduRWxlbWVudCBfZWxlbWVudCA9IG9kc2V0aC5nZXRFbGVtZW50KCk7CisgICAgICBfZWxlbWVudC5zZXRQcm9wZXJ0eShJRGF0YVNldE1vZGVsLlJFU1VMVF9TRVRfUFJPUCwgc2QpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBfZSkgeworICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfZSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgYWRkRGF0YW1hcnRQcm9wZXJ0eShmaW5hbCBSZXBvcnRHZW5lcmF0b3JXb3JrU2V0IHdvcmtTZXQsIGZpbmFsIEFycmF5TGlzdDxPZGFSZXN1bHRTZXRDb2x1bW4+IHNkLCBmaW5hbCBBcnJheUxpc3Q8Q29tcHV0ZWRDb2x1bW4+IGNjLCBmaW5hbCBEYXRhbWFydFByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgTEVudGl0eUF0dHJpYnV0ZSBfcHJvcGVydHlSZWYgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVJlZigpOworICAgIHRoaXMuYWRkRGF0YW1hcnRQcm9wZXJ0eSh3b3JrU2V0LCBzZCwgY2MsIF9wcm9wZXJ0eVJlZik7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBhZGREYXRhbWFydFByb3BlcnR5KGZpbmFsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgZmluYWwgQXJyYXlMaXN0PE9kYVJlc3VsdFNldENvbHVtbj4gc2QsIGZpbmFsIEFycmF5TGlzdDxDb21wdXRlZENvbHVtbj4gY2MsIGZpbmFsIExFbnRpdHlBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisgICAgSURhdGFNYXJ0LkVUeXBlIGV0eXBlID0gdGhpcy5kdFR5cGUuZ2V0QmFzaWNUeXBlKGF0dHJpYnV0ZSk7CisgICAgRGF0YVR5cGVzIGRhdGFUeXBlID0gRGF0YVR5cGVzLnR5cGVGb3IoZXR5cGUpOworICAgIGJvb2xlYW4gX2VxdWFscyA9IE9iamVjdHMuZXF1YWwoZGF0YVR5cGUsIERhdGFUeXBlcy5BTlkpOworICAgIGlmIChfZXF1YWxzKSB7CisgICAgICBMU2NhbGFyVHlwZSBfdHlwZSA9IGF0dHJpYnV0ZS5nZXRUeXBlKCk7CisgICAgICBEYXRhVHlwZXMgX3R5cGVGb3IgPSBEYXRhVHlwZXMudHlwZUZvcihfdHlwZSk7CisgICAgICBkYXRhVHlwZSA9IF90eXBlRm9yOworICAgIH0KKyAgICBTdHJpbmcgX2NvbHVtbk5hbWUgPSB0aGlzLl9uYW1pbmdFeHRlbnNpb25zLnRvQ29sdW1uTmFtZShhdHRyaWJ1dGUpOworICAgIFN0cmluZyBuYW1lID0gX2NvbHVtbk5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICBmb3IgKGZpbmFsIE9kYVJlc3VsdFNldENvbHVtbiBjb2x1bW4gOiBzZCkgeworICAgICAgU3RyaW5nIF9jb2x1bW5OYW1lXzEgPSBjb2x1bW4uZ2V0Q29sdW1uTmFtZSgpOworICAgICAgYm9vbGVhbiBfZXF1YWxzSWdub3JlQ2FzZSA9IF9jb2x1bW5OYW1lXzEuZXF1YWxzSWdub3JlQ2FzZShuYW1lKTsKKyAgICAgIGlmIChfZXF1YWxzSWdub3JlQ2FzZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIE9kYVJlc3VsdFNldENvbHVtbiBzdCA9IG5ldyBPZGFSZXN1bHRTZXRDb2x1bW4oKTsKKyAgICBzdC5zZXRDb2x1bW5OYW1lKG5hbWUpOworICAgIHN0LnNldFByb3BlcnR5KCJuYW1lIiwgbmFtZSk7CisgICAgaW50IF9uYXRpdmVPZGFEYXRhVHlwZUlkID0gZGF0YVR5cGUuZ2V0TmF0aXZlT2RhRGF0YVR5cGVJZCgpOworICAgIHN0LnNldE5hdGl2ZURhdGFUeXBlKEludGVnZXIudmFsdWVPZihfbmF0aXZlT2RhRGF0YVR5cGVJZCkpOworICAgIHN0LnNldE5hdGl2ZU5hbWUobmFtZSk7CisgICAgd29ya1NldC5mUG9zaXRpb24gPSAod29ya1NldC5mUG9zaXRpb24gKyAxKTsKKyAgICBzdC5zZXRQb3NpdGlvbihJbnRlZ2VyLnZhbHVlT2Yod29ya1NldC5mUG9zaXRpb24pKTsKKyAgICBTdHJpbmcgX25hdGl2ZU9kYURhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldE5hdGl2ZU9kYURhdGFUeXBlTmFtZSgpOworICAgIHN0LnNldERhdGFUeXBlKF9uYXRpdmVPZGFEYXRhVHlwZU5hbWUpOworICAgIHNkLmFkZChzdCk7CisgICAgQ29tcHV0ZWRDb2x1bW4gY3MxID0gU3RydWN0dXJlRmFjdG9yeS5jcmVhdGVDb21wdXRlZENvbHVtbigpOworICAgIGNzMS5zZXROYW1lKG5hbWUpOworICAgIGNzMS5zZXREaXNwbGF5TmFtZShuYW1lKTsKKyAgICBTdHJpbmcgX2NvbmNhdCA9ICJkYXRhU2V0Um93W1wiIi5jb25jYXQobmFtZSk7CisgICAgU3RyaW5nIF9jb25jYXRfMSA9IF9jb25jYXQuY29uY2F0KCJcIl0iKTsKKyAgICBjczEuc2V0RXhwcmVzc2lvbihfY29uY2F0XzEpOworICAgIFN0cmluZyBfbmF0aXZlT2RhRGF0YVR5cGVOYW1lXzEgPSBkYXRhVHlwZS5nZXROYXRpdmVPZGFEYXRhVHlwZU5hbWUoKTsKKyAgICBjczEuc2V0RGF0YVR5cGUoX25hdGl2ZU9kYURhdGFUeXBlTmFtZV8xKTsKKyAgICBjYy5hZGQoY3MxKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0RGF0YW1hcnRDbGFzc05hbWUoZmluYWwgU3RyaW5nIGFsaWFzLCBmaW5hbCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBFT2JqZWN0IF9lQ29udGFpbmVyID0gZGF0YW1hcnQuZUNvbnRhaW5lcigpOworICAgIFF1YWxpZmllZE5hbWUgX2Z1bGx5UXVhbGlmaWVkTmFtZSA9IHRoaXMuX2lRdWFsaWZpZWROYW1lUHJvdmlkZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCgoTFBhY2thZ2UpIF9lQ29udGFpbmVyKSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9mdWxseVF1YWxpZmllZE5hbWUsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi4iKTsKKyAgICBTdHJpbmcgX25hbWUgPSBkYXRhbWFydC5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lLCAiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJDbGFzcyIpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVJdGVtcyhmaW5hbCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIGZpbmFsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgZmluYWwgQ29udGFpbmVySXRlbSBjb250YWluZXIsIGZpbmFsIEVsZW1lbnRbXSBlbGVtZW50cykgeworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChlbGVtZW50cywgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBmb3IgKGZpbmFsIEVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYm9vbGVhbiBfbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGl0bGUpIHsKKyAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChUaXRsZSllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfa2V5ID0gSTE4TktleUdlbmVyYXRvci5rZXkoX3RleHQpOworICAgICAgICAgICAgICBTdHJpbmcgX3RleHRfMSA9ICgoVGl0bGUpZWxlbWVudCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICBTdHJpbmcgX3JlcGxhY2UgPSBfdGV4dF8xLnJlcGxhY2UoIlwiIiwgIiIpOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKFRpdGxlKWVsZW1lbnQpLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRIZWFkZXIoMSwgX2tleSwgX3JlcGxhY2UsIF9zdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3ViVGl0bGUpIHsKKyAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChTdWJUaXRsZSllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfa2V5ID0gSTE4TktleUdlbmVyYXRvci5rZXkoX3RleHQpOworICAgICAgICAgICAgICBTdHJpbmcgX3RleHRfMSA9ICgoU3ViVGl0bGUpZWxlbWVudCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICBTdHJpbmcgX3JlcGxhY2UgPSBfdGV4dF8xLnJlcGxhY2UoIlwiIiwgIiIpOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKFN1YlRpdGxlKWVsZW1lbnQpLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRIZWFkZXIoMiwgX2tleSwgX3JlcGxhY2UsIF9zdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3ViU3ViVGl0bGUpIHsKKyAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChTdWJTdWJUaXRsZSllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfa2V5ID0gSTE4TktleUdlbmVyYXRvci5rZXkoX3RleHQpOworICAgICAgICAgICAgICBTdHJpbmcgX3RleHRfMSA9ICgoU3ViU3ViVGl0bGUpZWxlbWVudCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICBTdHJpbmcgX3JlcGxhY2UgPSBfdGV4dF8xLnJlcGxhY2UoIlwiIiwgIiIpOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKFN1YlN1YlRpdGxlKWVsZW1lbnQpLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRIZWFkZXIoMywgX2tleSwgX3JlcGxhY2UsIF9zdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGFiZWwpIHsKKyAgICAgICAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgU3RyaW5nIF90ZXh0ID0gKChMYWJlbCllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfa2V5ID0gSTE4TktleUdlbmVyYXRvci5rZXkoX3RleHQpOworICAgICAgICAgICAgICBTdHJpbmcgX3RleHRfMSA9ICgoTGFiZWwpZWxlbWVudCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICBTdHJpbmcgX3JlcGxhY2UgPSBfdGV4dF8xLnJlcGxhY2UoIlwiIiwgIiIpOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKExhYmVsKWVsZW1lbnQpLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRMYWJlbChfa2V5LCBfcmVwbGFjZSwgX3N0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgICAgIFN0cmluZyBfdGV4dCA9ICgoVGV4dCllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfa2V5ID0gSTE4TktleUdlbmVyYXRvci5rZXkoX3RleHQpOworICAgICAgICAgICAgICBTdHJpbmcgX3RleHRfMSA9ICgoVGV4dCllbGVtZW50KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgIFN0cmluZyBfcmVwbGFjZSA9IF90ZXh0XzEucmVwbGFjZSgiXCIiLCAiIik7CisgICAgICAgICAgICAgIFN0eWxlIF9zdHlsZSA9ICgoVGV4dCllbGVtZW50KS5nZXRTdHlsZSgpOworICAgICAgICAgICAgICBjb250YWluZXIuYWRkVGV4dChfa2V5LCBfcmVwbGFjZSwgX3N0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdXRvVGV4dCkgeworICAgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgICAgICBBdXRvVGV4dEVudW0gX3R5cGUgPSAoKEF1dG9UZXh0KWVsZW1lbnQpLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9zdHJpbmcgPSBfdHlwZS50b1N0cmluZygpOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKEF1dG9UZXh0KWVsZW1lbnQpLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRBdXRvVGV4dChfc3RyaW5nLCBfc3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERhdGFtYXJ0VGFibGVQcm9wZXJ0eSkgeworICAgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgICAgICBTdHlsZSBfc3R5bGUgPSAoKERhdGFtYXJ0VGFibGVQcm9wZXJ0eSllbGVtZW50KS5nZXRTdHlsZSgpOworICAgICAgICAgICAgICBjb250YWluZXIuYWRkRGF0YSgoKERhdGFtYXJ0VGFibGVQcm9wZXJ0eSllbGVtZW50KSwgX3N0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbWFnZSkgeworICAgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgICAgICB0aGlzLmFkZEltYWdlKHdvcmtTZXQsIGNvbnRhaW5lciwgKChJbWFnZSllbGVtZW50KSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGF0YW1hcnRUYWJsZSkgeworICAgICAgICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICAgICAgICBXaWR0aCBfd2lkdGggPSBuZXcgV2lkdGgoIjEwMCUiKTsKKyAgICAgICAgICAgICAgdGhpcy5hZGREYXRhbWFydFRhYmxlKGRhdGFtYXJ0LCB3b3JrU2V0LCBjb250YWluZXIsICgoRGF0YW1hcnRUYWJsZSllbGVtZW50KSwgX3dpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmlkKSB7CisgICAgICAgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgICAgICAgIFdpZHRoIF93aWR0aCA9IG5ldyBXaWR0aCgiMTAwJSIpOworICAgICAgICAgICAgICB0aGlzLmFkZEdyaWQoZGF0YW1hcnQsIHdvcmtTZXQsIGNvbnRhaW5lciwgKChHcmlkKWVsZW1lbnQpLCBudWxsLCBfd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIF90KSB7CisgICAgICAgICAgaWYgKF90IGluc3RhbmNlb2YgQ29udGVudEV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmluYWwgQ29udGVudEV4Y2VwdGlvbiBjZSA9IChDb250ZW50RXhjZXB0aW9uKV90OworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29udGVudEV4Y2VwdGlvbj4gX2NsYXNzID0gY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBfc2ltcGxlTmFtZSA9IF9jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3NpbXBsZU5hbWUsICIiKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgIFN0cmluZyBfbG9jYWxpemVkTWVzc2FnZSA9IGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfbG9jYWxpemVkTWVzc2FnZSwgIiIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKF9idWlsZGVyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKF90IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pX3Q7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLnNuZWFreVRocm93KF90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBhZGREYXRhbWFydFRhYmxlKGZpbmFsIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCwgZmluYWwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBmaW5hbCBDb250YWluZXJJdGVtIGNvbnRhaW5lciwgZmluYWwgRGF0YW1hcnRUYWJsZSBkYXRhbWFydFRhYmxlLCBmaW5hbCBBdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgeworICAgIHRyeSB7CisgICAgICBBcnJheUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4gaGlkZGVucyA9IG5ldyBBcnJheUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4oKTsKKyAgICAgIERhdGFtYXJ0VGFibGVEZXRhaWwgX2RldGFpbCA9IGRhdGFtYXJ0VGFibGUuZ2V0RGV0YWlsKCk7CisgICAgICBFTGlzdDxEYXRhbWFydFRhYmxlUHJvcGVydHk+IF9jb2x1bW5Gb3JtYXR0ZXJzID0gX2RldGFpbC5nZXRDb2x1bW5Gb3JtYXR0ZXJzKCk7CisgICAgICBmb3IgKGZpbmFsIERhdGFtYXJ0VGFibGVQcm9wZXJ0eSBjb2x1bW5Gb3JtYXR0ZXIgOiBfY29sdW1uRm9ybWF0dGVycykgeworICAgICAgfQorICAgICAgU3RyaW5nIGFsaWFzID0gZGF0YW1hcnRUYWJsZS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2RhdGFTZXROYW1lID0gVXRpbGl0aWVzLmdldERhdGFTZXROYW1lKGFsaWFzLCBkYXRhbWFydCk7CisgICAgICBTdHJpbmcgZGF0YVNldE5hbWUgPSBfZGF0YVNldE5hbWUudG9TdHJpbmcoKTsKKyAgICAgIE9kYURhdGFTZXRIYW5kbGUgZGF0YVNldCA9IHdvcmtTZXQuZGF0YVNldHMuZ2V0KGRhdGFTZXROYW1lKTsKKyAgICAgIGJvb2xlYW4gX2VxdWFscyA9IE9iamVjdHMuZXF1YWwoZGF0YVNldCwgbnVsbCk7CisgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8RGF0YW1hcnRQcm9wZXJ0eT4gX2NvbnZlcnRlZF9oaWRkZW5zID0gKEFycmF5TGlzdDxEYXRhbWFydFByb3BlcnR5PiloaWRkZW5zOworICAgICAgICB0aGlzLmFkZERhdGFtYXJ0U291cmNlQW5kU2V0KGRhdGFtYXJ0LCB3b3JrU2V0LCBhbGlhcywgKChEYXRhbWFydFByb3BlcnR5W10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoX2NvbnZlcnRlZF9oaWRkZW5zLCBEYXRhbWFydFByb3BlcnR5LmNsYXNzKSkpOworICAgICAgICBPZGFEYXRhU2V0SGFuZGxlIF9nZXQgPSB3b3JrU2V0LmRhdGFTZXRzLmdldChkYXRhU2V0TmFtZSk7CisgICAgICAgIGRhdGFTZXQgPSBfZ2V0OworICAgICAgfQorICAgICAgQXJyYXlMaXN0PENvbXB1dGVkQ29sdW1uPiBfY29tcHV0ZWRDb2x1bW5zID0gd29ya1NldC5nZXRDb21wdXRlZENvbHVtbnMoZGF0YVNldE5hbWUpOworICAgICAgRUxpc3Q8RGF0YW1hcnRUYWJsZUdyb3VwPiBfZ3JvdXBzID0gZGF0YW1hcnRUYWJsZS5nZXRHcm91cHMoKTsKKyAgICAgIERhdGFtYXJ0VGFibGVEZXRhaWwgX2RldGFpbF8xID0gZGF0YW1hcnRUYWJsZS5nZXREZXRhaWwoKTsKKyAgICAgIFN0eWxlIF9zdHlsZSA9IF9kZXRhaWxfMS5nZXRTdHlsZSgpOworICAgICAgRGF0YW1hcnRUYWJsZURldGFpbCBfZGV0YWlsXzIgPSBkYXRhbWFydFRhYmxlLmdldERldGFpbCgpOworICAgICAgRUxpc3Q8RGF0YW1hcnRUYWJsZVByb3BlcnR5PiBfY29sdW1uRm9ybWF0dGVyc18xID0gX2RldGFpbF8yLmdldENvbHVtbkZvcm1hdHRlcnMoKTsKKyAgICAgIFN0eWxlIF9zdHlsZV8xID0gZGF0YW1hcnRUYWJsZS5nZXRTdHlsZSgpOworICAgICAgY29udGFpbmVyLmFkZFRhYmxlKGRhdGFTZXQsIGRhdGFtYXJ0VGFibGUsIF9jb21wdXRlZENvbHVtbnMsICgoRGF0YW1hcnRUYWJsZUdyb3VwW10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoX2dyb3VwcywgRGF0YW1hcnRUYWJsZUdyb3VwLmNsYXNzKSksIF9zdHlsZSwgKChEYXRhbWFydFRhYmxlUHJvcGVydHlbXSlDb252ZXJzaW9ucy51bndyYXBBcnJheShfY29sdW1uRm9ybWF0dGVyc18xLCBEYXRhbWFydFRhYmxlUHJvcGVydHkuY2xhc3MpKSwgX3N0eWxlXzEsIGF0dHJpYnV0ZXMpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBfZSkgeworICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfZSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgYWRkSW1hZ2UoZmluYWwgUmVwb3J0R2VuZXJhdG9yV29ya1NldCB3b3JrU2V0LCBmaW5hbCBDb250YWluZXJJdGVtIGNvbnRhaW5lciwgZmluYWwgSW1hZ2UgaW1hZ2VEYXRhLCBmaW5hbCBTdHlsZSBzdHlsZSwgZmluYWwgQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKyAgICB0cnkgeworICAgICAgSW1hZ2VTaXplRW51bSBfc2l6ZSA9IGltYWdlRGF0YS5nZXRTaXplKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWwgPSBfc2l6ZS5nZXRMaXRlcmFsKCk7CisgICAgICBkb3VibGUgX3NjYWxlID0gaW1hZ2VEYXRhLmdldFNjYWxlKCk7CisgICAgICBJbWFnZVNvdXJjZUVudW0gX3NvdXJjZVR5cGUgPSBpbWFnZURhdGEuZ2V0U291cmNlVHlwZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzEgPSBfc291cmNlVHlwZS5nZXRMaXRlcmFsKCk7CisgICAgICBTdHJpbmcgX2ZpbGVuYW1lID0gaW1hZ2VEYXRhLmdldEZpbGVuYW1lKCk7CisgICAgICBJbWFnZUl0ZW0gaW1hZ2UgPSBuZXcgSW1hZ2VJdGVtKHdvcmtTZXQsIAorICAgICAgICBudWxsLCBfbGl0ZXJhbCwgX3NjYWxlLCBfbGl0ZXJhbF8xLCBfZmlsZW5hbWUpOworICAgICAgY29udGFpbmVyLmFkZChpbWFnZSwgc3R5bGUsIGF0dHJpYnV0ZXMpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBfZSkgeworICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfZSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgYWRkR3JpZChmaW5hbCBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnQsIGZpbmFsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQgd29ya1NldCwgZmluYWwgQ29udGFpbmVySXRlbSBjb250YWluZXIsIGZpbmFsIEdyaWQgZ3JpZCwgZmluYWwgU3R5bGUgc3R5bGUsIGZpbmFsIEF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisgICAgdHJ5IHsKKyAgICAgIEVMaXN0PEdyaWRSb3c+IF9yb3dzID0gZ3JpZC5nZXRSb3dzKCk7CisgICAgICBpbnQgcm93Q291bnQgPSAoKE9iamVjdFtdKUNvbnZlcnNpb25zLnVud3JhcEFycmF5KF9yb3dzLCBPYmplY3QuY2xhc3MpKS5sZW5ndGg7CisgICAgICBpbnQgY29sdW1uQ291bnQgPSAwOworICAgICAgRUxpc3Q8R3JpZFJvdz4gX3Jvd3NfMSA9IGdyaWQuZ2V0Um93cygpOworICAgICAgZm9yIChmaW5hbCBHcmlkUm93IHJvdyA6IF9yb3dzXzEpIHsKKyAgICAgICAgRUxpc3Q8R3JpZENlbGw+IF9jZWxscyA9IHJvdy5nZXRDZWxscygpOworICAgICAgICBpbnQgX2xlbmd0aCA9ICgoT2JqZWN0W10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoX2NlbGxzLCBPYmplY3QuY2xhc3MpKS5sZW5ndGg7CisgICAgICAgIGludCBfbWF4ID0gTWF0aC5tYXgoY29sdW1uQ291bnQsIF9sZW5ndGgpOworICAgICAgICBjb2x1bW5Db3VudCA9IF9tYXg7CisgICAgICB9CisgICAgICBHcmlkSXRlbSBncmlkSXRlbSA9IG5ldyBHcmlkSXRlbSh3b3JrU2V0LCBjb2x1bW5Db3VudCwgcm93Q291bnQpOworICAgICAgaW50IHJvd05vID0gMDsKKyAgICAgIEVMaXN0PEdyaWRSb3c+IF9yb3dzXzIgPSBncmlkLmdldFJvd3MoKTsKKyAgICAgIGZvciAoZmluYWwgR3JpZFJvdyByb3dfMSA6IF9yb3dzXzIpIHsKKyAgICAgICAgeworICAgICAgICAgIGludCBjb2x1bW5ObyA9IDA7CisgICAgICAgICAgRUxpc3Q8R3JpZENlbGw+IF9jZWxsc18xID0gcm93XzEuZ2V0Q2VsbHMoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIEdyaWRDZWxsIGNlbGwgOiBfY2VsbHNfMSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICBDZWxsSXRlbSBfY2VsbCA9IGdyaWRJdGVtLmdldENlbGwoY29sdW1uTm8sIHJvd05vKTsKKyAgICAgICAgICAgICAgaW50IF9jb2x1bW5zcGFuID0gY2VsbC5nZXRDb2x1bW5zcGFuKCk7CisgICAgICAgICAgICAgIENlbGxJdGVtIF9zZXRDb2x1bW5TcGFuID0gX2NlbGwuc2V0Q29sdW1uU3BhbihfY29sdW1uc3Bhbik7CisgICAgICAgICAgICAgIEVMaXN0PEVsZW1lbnQ+IF9lbGVtZW50cyA9IGNlbGwuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUl0ZW1zKGRhdGFtYXJ0LCB3b3JrU2V0LCBfc2V0Q29sdW1uU3BhbiwgKChFbGVtZW50W10pQ29udmVyc2lvbnMudW53cmFwQXJyYXkoX2VsZW1lbnRzLCBFbGVtZW50LmNsYXNzKSkpOworICAgICAgICAgICAgICBjb2x1bW5ObyA9IChjb2x1bW5ObyArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBTdHlsZSBfc3R5bGUgPSByb3dfMS5nZXRTdHlsZSgpOworICAgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfc3R5bGUsIG51bGwpKTsKKyAgICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgICAgU3R5bGUgX3N0eWxlXzEgPSByb3dfMS5nZXRTdHlsZSgpOworICAgICAgICAgICAgZ3JpZEl0ZW0uYXBwbHlTdHlsZShyb3dObywgX3N0eWxlXzEpOworICAgICAgICAgIH0KKyAgICAgICAgICByb3dObyA9IChyb3dObyArIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb250YWluZXIuYWRkKGdyaWRJdGVtLCBzdHlsZSwgYXR0cmlidXRlcyk7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIF9lKSB7CisgICAgICB0aHJvdyBFeGNlcHRpb25zLnNuZWFreVRocm93KF9lKTsKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBUcmVlQXBwZW5kYWJsZSBjcmVhdGVBcHBlbmRhYmxlKGZpbmFsIEVPYmplY3QgY29udGV4dCwgZmluYWwgSW1wb3J0TWFuYWdlciBpbXBvcnRNYW5hZ2VyLCBmaW5hbCBHZW5lcmF0b3JDb25maWcgY29uZmlnKSB7CisgICAgVHJlZUFwcGVuZGFibGUgX3hibG9ja2V4cHJlc3Npb24gPSBudWxsOworICAgIHsKKyAgICAgIFJlc291cmNlIF9lUmVzb3VyY2UgPSBjb250ZXh0LmVSZXNvdXJjZSgpOworICAgICAgdGhpcy5zZXRCdWlsZGVyKF9lUmVzb3VyY2UpOworICAgICAgdGhpcy5fYmFzaWNEc2xHZW5lcmF0b3JVdGlscy5hZGRJbXBvcnRGb3IodGhpcywgaW1wb3J0TWFuYWdlciwgdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIsIFJlcG9ydEdlbmVyYXRvcldvcmtTZXQuY2xhc3MsIEhvcml6b250YWxMYXlvdXQuY2xhc3MsIFZpZXdMYXlvdXRNYW5hZ2VyLmNsYXNzLCBCcm93c2VyRnJhbWUuY2xhc3MsIFN0cmVhbVJlc291cmNlLmNsYXNzLCBTaXplYWJsZS5Vbml0LmNsYXNzLCBCdXR0b24uY2xhc3MsIGNvbS52YWFkaW4udWkuTGFiZWwuY2xhc3MsIElFdmVudEJyb2tlci5jbGFzcywgRXZlbnRIYW5kbGVyLmNsYXNzLCBFdmVudC5jbGFzcywgRXZlbnRVdGlscy5jbGFzcywgRXZlbnRCcm9rZXJNc2cuY2xhc3MsIEN1c3RvbU1zZ0V4Y2VwdGlvbi5jbGFzcywgSVJlcG9ydFByb3ZpZGVyLlJlbmRlcmluZy5jbGFzcywgQWJzdHJhY3RDb21wb25lbnQuY2xhc3MsIFVVSUQuY2xhc3MsIENvbnRhaW5lci5GaWx0ZXIuY2xhc3MsIElUb29sYmFyQWN0aW9uLmNsYXNzKTsKKyAgICAgIF94YmxvY2tleHByZXNzaW9uID0gc3VwZXIuY3JlYXRlQXBwZW5kYWJsZShjb250ZXh0LCBpbXBvcnRNYW5hZ2VyLCBjb25maWcpOworICAgIH0KKyAgICByZXR1cm4gX3hibG9ja2V4cHJlc3Npb247CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGludGVybmFsRG9HZW5lcmF0ZShmaW5hbCBFT2JqZWN0IG9yZ01vZGVsLCBmaW5hbCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgICBpZiAob3JnTW9kZWwgaW5zdGFuY2VvZiBKdm1EZWNsYXJlZFR5cGUpIHsKKyAgICAgIF9pbnRlcm5hbERvR2VuZXJhdGUoKEp2bURlY2xhcmVkVHlwZSlvcmdNb2RlbCwgZnNhKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG9yZ01vZGVsIGluc3RhbmNlb2YgUmVwb3J0TW9kZWwpIHsKKyAgICAgIF9pbnRlcm5hbERvR2VuZXJhdGUoKFJlcG9ydE1vZGVsKW9yZ01vZGVsLCBmc2EpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAob3JnTW9kZWwgIT0gbnVsbCkgeworICAgICAgX2ludGVybmFsRG9HZW5lcmF0ZShvcmdNb2RlbCwgZnNhKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChvcmdNb2RlbCwgZnNhKS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zY29waW5nL1JlcG9ydERTTFNjb3BlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC9zY29waW5nL1JlcG9ydERTTFNjb3BlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIyMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvcmVwb3J0ZHNsL3Njb3BpbmcvUmVwb3J0RFNMU2NvcGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnNjb3Bpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgY3VzdG9tIHNjb3BpbmcgZGVzY3JpcHRpb24uCisgKiAKKyAqIHNlZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3Njb3BpbmcKKyAqIG9uIGhvdyBhbmQgd2hlbiB0byB1c2UgaXQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMU2NvcGVQcm92aWRlciBleHRlbmRzIFhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyIHsKKyAgcHVibGljIElTY29wZSBnZXRTY29wZShmaW5hbCBFT2JqZWN0IGNvbnRleHQsIGZpbmFsIEVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisgICAgcmV0dXJuIHN1cGVyLmdldFNjb3BlKGNvbnRleHQsIHJlZmVyZW5jZSk7CisgIH0KKyAgCisgIHB1YmxpYyBJU2NvcGUgZ2V0U2NvcGVfRGF0YW1hcnRfRGF0YW1hcnRSZWYoZmluYWwgSVNjb3BlIHNjb3BlKSB7CisgICAgcmV0dXJuIHNjb3BlOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9SZXBvcnREU0xWYWxpZGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3JlcG9ydGRzbC92YWxpZGF0aW9uL1JlcG9ydERTTFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDIzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9yZXBvcnRkc2wvdmFsaWRhdGlvbi9SZXBvcnREU0xWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC52YWxpZGF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudmFsaWRhdGlvbi5BYnN0cmFjdFJlcG9ydERTTFZhbGlkYXRvcjsKKworLyoqCisgKiBDdXN0b20gdmFsaWRhdGlvbiBydWxlcy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3ZhbGlkYXRpb24KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgUmVwb3J0RFNMVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXBvcnREU0xWYWxpZGF0b3IgeworfQpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlYzBiYwotLS0gL2Rldi9udWxsCisrKyBiL3BvbS54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyBDaHJpc3RvcGhlIExvZXR6ICAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC5yZWxlbmcubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAucmVsZW5nLm1hdmVuLnBhcmVudC50eWNobzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGgvPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2w8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgICAgPHVybD4ke29zYnAuc2l0ZS5yZXBvc2l0b3J5LnVybH08L3VybD4KKyAgICA8c2NtPgorICAgICAgICA8dXJsPiR7b3NicC5zY20udXJsfTwvdXJsPgorICAgICAgICA8Y29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb259PC9jb25uZWN0aW9uPgorICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb24uZGV2fTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHRhZz5IRUFEPC90YWc+CisgICAgPC9zY20+CisgICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgICAgIDxzaXRlPgorICAgICAgICAgICAgPGlkPmdoLXBhZ2VzPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPk9TQlAgR2l0SHViIFBhZ2VzPC9uYW1lPgorICAgICAgICAgICAgPHVybD4ke2Rpc3RyaWJ1dGlvbi5zaXRlLnVybH08L3VybD4KKyAgICAgICAgPC9zaXRlPgorICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworCTxwcm9wZXJ0aWVzPgorCQk8b3NicC5naXRyZXBvLm5hbWU+JHtwcm9qZWN0Lmdyb3VwSWR9PC9vc2JwLmdpdHJlcG8ubmFtZT4KKwk8L3Byb3BlcnRpZXM+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLm9kYS5kYXRhbWFydDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnRlc3RzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5yZXBvcnRkc2wudWk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnJlcG9ydGRzbC5mZWF0dXJlPC9tb2R1bGU+CisgICAgICAgIDwhLS08bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnAyPC9tb2R1bGU+LS0+CisgICAgPC9tb2R1bGVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8IS0tPHByb2ZpbGU+CisJCQk8aWQ+YnVpbGQucDI8L2lkPgorCQkJPGFjdGl2YXRpb24+CisJCQkJPHByb3BlcnR5PgorCQkJCQk8bmFtZT5vc2JwLmJ1aWxkLnAyPC9uYW1lPgorCQkJCTwvcHJvcGVydHk+CisJCQk8L2FjdGl2YXRpb24+CisJCQk8bW9kdWxlcz4KKwkJCQk8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQucmVwb3J0ZHNsLnAyPC9tb2R1bGU+CisJCQk8L21vZHVsZXM+CisJCTwvcHJvZmlsZT4tLT4KKyAgICA8L3Byb2ZpbGVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGFyZ2V0LXBsYXRmb3JtLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHljaG8tdmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdmVyPnAyPC9yZXNvbHZlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwb21EZXBlbmRlbmNpZXM+Y29uc2lkZXI8L3BvbURlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnZpcm9ubWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudmlyb25tZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3M+d2luMzI8L29zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3M+d2luMzI8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5saW51eDwvb3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cz5ndGs8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODY8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5saW51eDwvb3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cz5ndGs8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5tYWNvc3g8L29zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3M+Y29jb2E8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW52aXJvbm1lbnRzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0Pgo=